
我想做的事
我想設定我的 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 指南在上一個連結中允許路由流量