Ip

是什麼阻止了我的 ping 數據包被路由?

  • June 23, 2021

我想做什麼

我想設置我的 Debian Stretch GNU/Linux 機器以在其網路介面之間路由 IP 數據包。

語境

這些是我的 Debian 盒子和即將成為路由器的可用網路介面:

  • sysctl net.ipv4.ip_forward返回1,因此啟用了路由。
  • cat /proc/sys/net/ipv4/conf/*/rp_filter只返回0s。因此,反向路徑過濾被禁用。(這是我發現的其他幾個問題的關注點。)

路由表如下所示:

$ 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 中繼?我需要做什麼才能啟用這些數據包的路由?

總結評論中交換的內容:

  • 系統未明確配置為路由器

即沒有明確的配置適用於:

sysctl -w net.ipv4.ip_forward=1
  • 系統正在執行 Docker

這意味著:

  • Docker將系統變成路由器

它設置自己:

sysctl -w net.ipv4.ip_forward=1
Docker[在防火牆策略中阻止路由](https://docs.docker.com/network/iptables/#docker-on-a-router)



t; 
t; 路由器上的 Docker
t; 
t; 
t; Docker 還將 FORWARD 鏈的策略設置為 DROP。如果您的 Docker 主機還充當路由器,這將導致該路由器不再轉發任何流量。如果您希望您的系統繼續充當路由器,您可以向
t; `DOCKER-USER`鏈中添加明確的 ACCEPT 規則以允許它:
t; 
t; 
t; 
t; ```
t; $ iptables -I DOCKER-USER -i src_if -o dst_if -j ACCEPT
t; 
t; ```
t; 
t;


所以


* 讓 Docker 丟棄轉發的數據包(容器除外)
* 停止 Docker 不再啟用轉發(至少在下次啟動時)


在這兩種情況下,系統最終都沒有路由。


您可能應該做以下兩件事:


* 顯式啟用路由(在`/etc/sysctl.conf`or中的某處`/etc/sysctl.d/`)
* [遵循上一個連結](https://docs.docker.com/network/iptables/#docker-on-a-router)中的Docker 指南以允許路由流量

引用自:https://unix.stackexchange.com/questions/655332