![两个网卡的 Linux 路由问题](https://linux22.com/image/725306/%E4%B8%A4%E4%B8%AA%E7%BD%91%E5%8D%A1%E7%9A%84%20Linux%20%E8%B7%AF%E7%94%B1%E9%97%AE%E9%A2%98.png)
我有一台服务器 (SERVER1),它有两个网络接口,如图所示。我还有另一台服务器 (SERVER2),我正尝试从它连接到 SERVER1。
当我连接到 eth0 (10.0.0.124) 时,我成功了。但是,当我连接到 eth1 (10.0.15.213) 时,我失败了。
我怀疑这是由于 SERVER1 上的路由表造成的,SERVER1 在 eth1 上接收信号,但将响应路由到 eth0,从而破坏了 TCP 通信链。
那么,我怎样才能告诉路由表通过接收连接的同一网络接口进行响应,但又不发回任何内容呢?
进一步来说,SERVER1 上的连接的 tcpdump 显示以下内容,表明 SERVER2 正在建立连接:
# tcpdump -i eth1 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
06:01:35.543172 IP 10.0.2.109.51554 > 10.0.15.213.22: Flags [S], seq 1526846784, win 26883, options [mss 8961,sackOK,TS val 311066 ecr 0,nop,wscale 7], length 0
06:01:36.540677 IP 10.0.2.109.51554 > 10.0.15.213.22: Flags [S], seq 1526846784, win 26883, options [mss 8961,sackOK,TS val 311316 ecr 0,nop,wscale 7], length 0
06:01:38.544674 IP 10.0.2.109.51554 > 10.0.15.213.22: Flags [S], seq 1526846784, win 26883, options [mss 8961,sackOK,TS val 311817 ecr 0,nop,wscale 7], length 0
06:01:42.556548 IP 10.0.2.109.51554 > 10.0.15.213.22: Flags [S], seq 1526846784, win 26883, options [mss 8961,sackOK,TS val 312820 ecr 0,nop,wscale 7], length 0
连接到 eth0 时显示 netstat
# netstat -tnp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 280 10.0.0.124:22 10.0.2.109:54298 ESTABLISHED 8562/sshd: ubuntu [
答案1
此设置中有很多奇怪的事情。您忽略了有关 10.0.0.1 和 10.0.2.1 设备的重要信息。推测它们位于同一设备(网络之间的路由器)上。如果机器之间没有路由器,它们将无法到达任何一个接口。
您可以开始使用 ping 进行诊断。在接口eth1
、eth0
和上使用 tcpdump all
。我怀疑您会发现响应通过 eth0 发送回来,但并未到达您的 server2。在您的路由器上使用 tcpdump 或类似的东西。
答案2
这个问题很短暂,因为我找到了另一个帖子[1]并给出答案。
据我了解,它会创建一条规则,规定“如果流量来自 10.0.15.213,则将其自行路由回去”
echo 200 nic2 >> /etc/iproute2/rt_tables
ip rule add from 10.0.15.213 table nic2
ip route add default via 10.0.15.1 dev eth1 table nic2