我想做的事

我想做的事

我想做的事

我想设置我的 Debian Stretch GNU/Linux 机器在其网络接口之间路由 IP 数据包。

语境

这些是我的 Debian 盒子和即将推出的路由器上可用的网络接口:

指数 接口名称 ip
1 恩普2s0 192.168.23.91/24
2 enx00e04c360e75 192.168.1.1/24
3 enx000ec667a74a 192.168.2.2/24
  • sysctl net.ipv4.ip_forward返回1,因此路由已启用。
  • cat /proc/sys/net/ipv4/conf/*/rp_filter除了 s 之外什么都不返回0。因此,反向路径过滤被禁用。 (这是我发现的其他一些问题的担忧根源。)

路由表如下所示:

$ sudo route -nn
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.23.254  0.0.0.0         UG    100    0        0 enp2s0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp2s0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.1.0     0.0.0.0         255.255.255.0   U     101    0        0 enx00e04c360e75
192.168.2.0     0.0.0.0         255.255.255.0   U     102    0        0 enx000ec667a74a
192.168.23.0    0.0.0.0         255.255.255.0   U     100    0        0 enp2s0

以下作品

从连接在 NIC 2 上的设备 ( 192.168.1.111),我可以 ping 通我的 NIC 2 ( 192.168.1.1) 和 NIC 3 ( 192.168.2.2)。

tcpdump我的 Debian 路由器上的输出看起来符合预期:

$ sudo tcpdump -i enx00e04c360e75 icmp -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enx00e04c360e75, link-type EN10MB (Ethernet), capture size 262144 bytes
18:10:51.919808 IP 192.168.1.111 > 192.168.1.1: ICMP echo request, id 25404, seq 17, length 64
18:10:51.919863 IP 192.168.1.1 > 192.168.1.111: ICMP echo reply, id 25404, seq 17, length 64
18:10:52.920019 IP 192.168.1.111 > 192.168.1.1: ICMP echo request, id 25404, seq 18, length 64
18:10:52.920130 IP 192.168.1.1 > 192.168.1.111: ICMP echo reply, id 25404, seq 18, length 64
18:10:53.920808 IP 192.168.1.111 > 192.168.1.1: ICMP echo request, id 25404, seq 19, length 64
18:10:53.920895 IP 192.168.1.1 > 192.168.1.111: ICMP echo reply, id 25404, seq 19, length 64
[...]
18:11:03.408546 IP 192.168.1.111 > 192.168.2.2: ICMP echo request, id 25916, seq 0, length 64
18:11:03.408622 IP 192.168.2.2 > 192.168.1.111: ICMP echo reply, id 25916, seq 0, length 64
18:11:04.405006 IP 192.168.1.111 > 192.168.2.2: ICMP echo request, id 25916, seq 1, length 64
18:11:04.405061 IP 192.168.2.2 > 192.168.1.111: ICMP echo reply, id 25916, seq 1, length 64
18:11:05.405147 IP 192.168.1.111 > 192.168.2.2: ICMP echo request, id 25916, seq 2, length 64
18:11:05.405201 IP 192.168.2.2 > 192.168.1.111: ICMP echo reply, id 25916, seq 2, length 64

以下不起作用

从通过 NIC 2 连接的设备中,我无法 ping 通可通过 NIC 1 访问的某些主机。

tcpdump在我的 Debian 机器上运行显示 NIC 2 上的传入数据包:

$ sudo tcpdump -i enx00e04c360e75 icmp -n
listening on enx00e04c360e75, link-type EN10MB (Ethernet), capture size 262144 bytes
18:11:31.837778 IP 192.168.1.111 > 193.99.144.80: ICMP echo request, id 36668, seq 4, length 64
18:11:32.838830 IP 192.168.1.111 > 193.99.144.80: ICMP echo request, id 36668, seq 5, length 64
18:11:33.838249 IP 192.168.1.111 > 193.99.144.80: ICMP echo request, id 36668, seq 6, length 64
[...]

但他们永远不会通过 NIC 1 离开:

$ sudo tcpdump -i enp2s0 icmp -n
listening on enp2s0, link-type EN10MB (Ethernet), capture size 262144 bytes
[nothing]

当我直接从 Debian 路由器盒发出 ping 时,tcpdump看起来像预期的那样:

$ sudo tcpdump -i enp2s0 icmp -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp2s0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:35:16.577795 IP 192.168.23.91 > 193.99.144.80: ICMP echo request, id 13146, seq 1, length 64
18:35:16.600861 IP 193.99.144.80 > 192.168.23.91: ICMP echo reply, id 13146, seq 1, length 64
18:35:17.578164 IP 192.168.23.91 > 193.99.144.80: ICMP echo request, id 13146, seq 2, length 64
18:35:17.599898 IP 193.99.144.80 > 192.168.23.91: ICMP echo reply, id 13146, seq 2, length 64

问题

是什么阻止到达 NIC 2 的 ping 数据包通过 NIC 1 进行中继?我需要做什么才能启用这些数据包的路由?

答案1

总结一下评论中交换的内容:

  • 系统未明确配置为路由器

    即没有明确的配置来应用以下内容:

    sysctl -w net.ipv4.ip_forward=1
    
  • 系统正在运行 Docker

    这意味着:

    • Docker 将系统变成路由器

      它自行设定:

      sysctl -w net.ipv4.ip_forward=1
      
    • 码头工人阻止防火墙策略中的路由

      路由器上的 Docker

      Docker 还将 FORWARD 链的策略设置为 DROP。如果您的 Docker 主机还充当路由器,这将导致该路由器不再转发任何流量。如果您希望系统继续充当路由器,您可以向链中添加明确的 ACCEPT 规则 DOCKER-USER以允许它:

      $ iptables -I DOCKER-USER -i src_if -o dst_if -j ACCEPT
      

所以

  • 让 Docker 丢弃转发的数据包(容器除外)
  • 停止 Docker 不再启用转发(至少在下次启动时)

在这两种情况下,系统最终都没有路由。

您可能应该执行以下两件事:

  • 显式启用路由(/etc/sysctl.conf或中的某处/etc/sysctl.d/
  • 遵循 Docker 指南在上一个链接中允许路由流量

相关内容