nsh*_*shy 4 networking linux arp
我决定使用 veth :创建一对 veth 并将 ping 从一端发送到另一端。
$ ip link add type veth
$ ip addr add 192.168.99.1 dev veth4
$ ip addr add 192.168.99.2 dev veth5
$ ip link dev veth4 set up
$ ip link dev veth5 set up
Run Code Online (Sandbox Code Playgroud)
让我们检查。
$ ip a
18: veth4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 6a:dc:02:5b:f0:f3 brd ff:ff:ff:ff:ff:ff
inet 192.168.99.1/24 scope global veth4
valid_lft forever preferred_lft forever
19: veth5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 22:ec:d5:e8:7c:3e brd ff:ff:ff:ff:ff:ff
inet 192.168.99.2/24 scope global veth5
valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)
一切似乎都没问题。现在尝试ping。
$ ping -I veth4 192.168.99.2
PING 192.168.99.2 (192.168.99.2) from 192.168.99.1 veth4: 56(84) bytes of data.
From 192.168.99.1 icmp_seq=1 Destination Host Unreachable
From 192.168.99.1 icmp_seq=2 Destination Host Unreachable
From 192.168.99.1 icmp_seq=3 Destination Host Unreachable
$ sudo tshark -i veth5
Capturing on 'veth5'
l 1 0.000000 6a:dc:02:5b:f0:f3 -> Broadcast ARP 42 Who has 192.168.99.2? Tell 192.168.99.1
1 2 1.003206 6a:dc:02:5b:f0:f3 -> Broadcast ARP 42 Who has 192.168.99.2? Tell 192.168.99.1
Run Code Online (Sandbox Code Playgroud)
所以 veth5 接收 arp 请求,但不费心回答。怎么了?
小智 7
这是一个非常复杂、非常古老的问题,涉及到几个不同的领域,具体是VETH、网络命名空间、ARP、路由表和NAT……
我不仅为 OP,而且为其他人添加了这个问题的答案,希望能将其他人从这给我的白发中拯救出来......
可以说,经过大量研究和测试 - veth 对完全可以这样使用,因为它们实际上是两个单独的虚拟接口。然而,因为它们是虚拟的——你会遇到一些关于 ARP 表/条目的非常奇怪的问题。在处理这个确切的场景(工作所必需的)几周后,我已经弄清楚了如何做到这一点,并且在这个过程中,我学到了比我想要的更多的关于 ARP、NAT 和路由的知识。
为了完全完成您想要的操作,请键入以下内容(在我的情况下为 Ubuntu 16.04)。请注意,一旦进入test命名空间,就必须退出 bash 才能离开,因为从那时起的所有内容(路由表、iptables 等)都与主机上的不同。我通常打开两个终端,一个留在主机中——另一个留在来宾命名空间中。
# Tell the system we want to support IPv4 forwarding
add/verify that the following is in `/etc/sysctl.conf`
`net.ipv4.ip_forward = 1`
# if it wasn't there, reparse syscrtl + restart networking
sysctl -p;
/etc/init.d/networking restart;
Run Code Online (Sandbox Code Playgroud)
# create a veth pair
ip link add name vHOST type veth peer name vGUEST
# choose a private MAC address and private IP address
ifconfig vHOST hw ether 02:1d:8d:dd:0c:61
ifconfig vHOST 10.11.0.1/24 up
# have to setup routes FROM HOST -> GUEST
ip route add 10.111.0.0/24 via 10.11.0.1 dev vHOST # gateway
# have to explicitly assign what the MAC is for the vGUEST in the vHOST interface ARP table
arp -i vHOST -s 10.111.0.1 02:1d:8d:dd:0c:60 # vGUEST ip + mac address
# We must tell vHOST-vGUEST "tunnel", vHOST side that it's not a REAL bridge, so any ARP requests must be answered by vHOST
echo 1 > /proc/sys/net/ipv4/conf/vHOST/proxy_arp
# setup forwarding + NAT (so packets can come back)
iptables -A FORWARD -s 10.111.0.0/24 -o vHOST -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.111.0.1 -j SNAT --to 192.168.42.124
Run Code Online (Sandbox Code Playgroud)
# create the "test" namespace, so we can verfiy settings
ip netns add test
# add vGUEST "interface" to the "test" namespace
ip link set vGUEST netns test
# enter the "test" namespace with a bash shell
ip netns exec test bash
# choose a private MAC address and private IP address
ifconfig vGUEST hw ether 02:1d:8d:dd:0c:60
ifconfig vGUEST 10.111.0.1/24 up
# have to setup routes FROM GUEST -> HOST
ip route add default via 10.111.0.1 dev vGUEST # gateway
# have to explicitly assign what the MAC is for the vHOST in the vGUEST interface ARP table
arp -i vGUEST -s 10.11.0.1 02:1d:8d:dd:0c:61 # vHOST ip + mac address
Run Code Online (Sandbox Code Playgroud)
特别值得注意的是,multimac也可以做与 veth 完全相同的事情,但方式略有不同,因为 multimac 支持多对一关系,其中 veth 是一对一关系。
为了在没有命名空间的情况下支持这一点,您必须使用策略路由(这比网络命名空间要复杂一些)
Veth 对不以这种方式使用。veth 对实际上是一个设备管道,管道数据包的一端从另一端出来。
我能提供的最简单的同义词是想象这一对的一半是以太网设备,而另一端是设备插入的交换机端口。您不应将这对设备视为两个独立的设备,而应将其视为一个有两个“端”可以推/拉的设备。
| 归档时间: |
|
| 查看次数: |
4856 次 |
| 最近记录: |