xiaohanliang
OS
OS
  • hi
  • PROCESS
    • 0. 你的程序是怎么用内存的
    • 1. 为什么内存要区分堆与栈
    • 2. 什么叫你的程序
    • 3. 搞玄学?看看进程切换
    • 4. 进程是怎样调度的
    • 5. 理解进程线程有啥用
    • 6. 没有人真正见过的进程通信
    • 7. [WIP]mutex的起源CAS
    • 8. [WIP]mutex的下一步信号量
    • 9. [WIP]如何人为制造死锁
    • 10. 怎么什么东西都是fd
    • 11. IO各种模型
    • 12. Epoll内部是怎么工作的
  • NETWORK DEVICES
    • 1. 一个新的namesapce
    • 2. veth对讲机
    • 3. 如何靠网桥连接对讲机
    • 4. 左耳进右耳出的tun设备
    • 5. 如何用iptables改包头
    • 6. 在ip报头上再包个头
    • 7.如何用vxlan隧道分割局域网
    • 8. 通过多播组的方式获取mac
    • 9. 自动维护的fdb/arp表
    • 10. [WIP]macvlan网卡
Powered by GitBook
On this page
  • Introduction
  • 什么是Linux网桥...

Was this helpful?

  1. NETWORK DEVICES

2. veth对讲机

Introduction

其实我们在上一节已经简单介绍过Veth对是怎么工作的了, 是一个很有意思的有线电话设计, veth本身是 virtual ethernet ,虚拟网卡的缩写, 因为都是成对出现的, 因此我们叫它veth对, 跨nns的通信没有veth是做不到的.

$ ifconfig 

vethe1e2d84 Link encap:Ethernet  HWaddr ba:4d:51:91:20:0c
          inet6 addr: fe80::b84d:51ff:fe91:200c/64 Scope:Link

容器与宿主机就是通过veth互相交流的, 你的服务器上如果跑着docker容器就能看到一大堆vethxxx, 容器与宿主很难想象这么个小家伙, 竟然能是庞大容器生态中, 极为重要的一环

但是仅仅靠veth, 容器是无法访问外部网络的, 你的数据包从这个veth这一端出发, 经过内核协议栈以后, 结果也就是存到了对端的网络协议栈里, 想要继续往外发送, 我们还需要一些别的组件....

什么是Linux网桥...

两个nns可以通过veth互相连接, 但如果有很多个nns组网呢? 任意两者创建veth吗? 不像veth设备只有两端, 从一端进来那么就从另外一端出去. Linux网桥有很多端, 数据可以从任何一个端口进来, 进来之后从哪个口出去, 取决于Mac地址, 原理简直跟他妈物理交换机一样

多说无益, 直接折腾

# 准备原材料, 我们需要: 一个网桥 + 一对veth
$ brctl addbr br0 
$ ip link add veth5 type veth peer name veth6

# 给两个veth上IP, 不然你怎么ping
$ ip link add 1.2.3.101/24 dev veth5
$ ip link add 1.2.3.102/24 dev veth6

# 都给我起来!
$ ip link set br0   up
$ ip link set veth5 up
$ ip link set veth6 up

# 把veth5贴到网桥上
$ brctl addif br0 veth5
$ bectl show

bridge name     bridge id             interfaces
br0             8000.e60173821489     veth5
docker0         8000.024253a7429a

好玩的要开始了, 你网桥不是喜欢转发么? 我把veth5贴上来, 我看看veth5都要干什么..

# 现在使用veth5网卡, 去给我ping对端(veth6/1.2.3.102)
$ ping -c 1 -I veth5 1.2.3.102

PING 1.2.3.102 from 1.2.3.101 veth5: 
icmp_seq=1 Destination Host Unreachable

有意思, 什么都发不出去, 这么神奇? 抓包看看:

# 看看veth6网卡都收到什么东西了
$ tcpdump -n -i veth6
22:50:09 ARP, Request who-has 1.2.3.102 tell 1.2.3.101, length 28
ARP, Request who-has 1.2.3.102 tell 1.2.3.101, length 28
ARP, Request who-has 1.2.3.102 tell 1.2.3.101, length 28
...

这块我必须澄清一下, 书上说这里veth6应该会响应veth5的ARP请求, 但veth5在收到ARP答复以后没看这条消息就转发给网桥了, 作者似乎想说明一旦你被网桥连上你就不会再有"属于你自己的消息了", 你沦落为一根网线只会转发给网桥, 但实际上经过很多次的测试发现veth6压根没做出任何答复

Previous1. 一个新的namesapceNext3. 如何靠网桥连接对讲机

Last updated 4 years ago

Was this helpful?