为了计量目的,我试图将出站网络流量隔离到特定目标,因此我想通过专用 IP 地址路由它。为了实现这一点,我设置了一个子接口eth0:1
,如下所示:
# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:42:ae:d3 brd ff:ff:ff:ff:ff:ff
inet 192.168.111.6/24 brd 192.168.111.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.111.5/24 brd 192.168.111.255 scope global secondary eth0:1
valid_lft forever preferred_lft forever
到目前为止一切顺利。应该让它工作的路由部分是这样的:
# ip route add 10.10.0.10 via 192.168.111.1 dev eth0:1
当我检查路由表时,我得到:
# ip route list
default via 192.168.111.1 dev eth0
10.10.0.10 via 192.168.111.1 dev eth0
192.168.111.0/24 dev eth0 proto kernel scope link src 192.168.111.6
请注意第二行,它以 结尾,dev eth0
而不是eth0:1
我预期的,但到目前为止,这可能只是一个显示问题。但是,当使用 观察流量时tcpdump
,很明显路由的行为与上面的显示相同,即:到 的流量10.10.0.10
通过主接口传输eth0
,使用其 IP192.168.111.6
而不是eth0:1's
IP 192.168.111.5
。
奇怪的是,如果我使用专用网卡 (eth1) 而不是上面的子接口,一切都会按预期工作。这是子接口的限制、错误还是我做错了什么?
操作系统是运行在内核 3.13.0-76 上的 Ubuntu 14.04.3 服务器。它是托管在 KVM 管理程序上的客户虚拟机(尽管我怀疑这是一个因素)。
答案1
您应该能够使用以下命令完成您想要的操作:
ip route add 10.10.0.10 dev eth0:1 src 192.168.111.5
如果你输入,ip route list
你应该会看到的变化src
。