Ip
將數據包從一個介面路由到另一個介面
問題總結
這是Linux電腦上的路由表:
root@computer:~# ip route show default via 192.168.1.1 dev eth0 10.0.0.200 dev tun0 proto kernel scope link src 10.0.0.100
發送到此電腦上 tun0 的目標 IP 為 1.2.3.5 的數據包不會從 eth0 發送出去。
詳細描述我正在嘗試建構的內容
該項目的目標是為我的一台電腦(以及以後的更多電腦)提供一個公共 IP 地址。有兩個要求:
- 這台電腦位於我無法控制的 NAT 後面。
- 我不希望區域網路上的其他電腦需要通過(相對)慢速網際網路來訪問它。
建築學
電腦:
- A:網際網路上的一台隨機電腦要連接到電腦 F。
- B:有一個額外的IP(1.2.3.5)我想通過E路由到F。
- C:我無法控制。
- D:我的路由器,它有一個靜態路由:1.2.3.5 —> 192.168.1.3
- E:與 B 建立 SSH TUN,將發往 1.2.3.5 的傳入數據包路由到其預設網關 D。
- F:我希望所有其他電腦(在我的 LAN 上和網際網路上)通過 1.2.4.5 訪問的伺服器
設置
在 B、E、F 上設置了 IP 轉發,其中:
echo 1 > /proc/sys/net/ipv4/ip_forward
/etc/sysctl.conf 在 E 中被修改:
net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.all.rp_filter=0
在 E 上建立的 SSH TUN:
ssh -w 0:0 1.2.3.4
在 E 上啟動的 tun0 介面:
ip link set tun0 up ip addr add 10.0.0.100/32 peer 10.0.0.200 dev tun0
tun0 介面在 B 上提出:
ip link set tun0 up ip addr add 10.0.0.200/32 peer 10.0.0.100 dev tun0
我現在可以成功地從 B ping E:
ping 10.0.0.100
IP 1.2.3.5 從 B 上的介面中刪除:ifconfig venet0:1 0.0.0.0
添加到 B 的路由: ip route add 1.2.3.5/32 via 10.0.0.100 dev tun0
IP 添加到 F 上的介面: ip addr add 1.2.3.5 dev eth0
測試
在 A 上執行以下命令來測試發送數據包:
netcat -u 1.2.3.5 4444
在 E 上執行以下命令以查看是否正在接收數據包:
root@computer:~$ tcpdump -n -i tun0 port 4444 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes 13:48:21.034003 IP 4.3.2.1.44312 > 1.2.3.5.4444: UDP, length 5 root@computer:~$ tcpdump -n -i eth0 port 4444 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 13:48:21.034061 IP 4.3.2.1.44312 > 1.2.3.5.4444: UDP, length 5
在 E 上執行以下命令:
root@computer:~# netcat -u 1.2.3.5 4444 test
在 F 上同時執行以下命令:
root@computer:~# nc -ul 4444 test
問題
我面臨的問題是其中一台電腦 (E) 正在接收某個 IP (1.2.3.5) 的 IP 數據包,但沒有將它們轉發到其預設網關。
我相信我缺少的是 E 上的命令,它將 tun0 介面上的傳入數據包路由到 eth0 介面上的預設網關。
有誰知道我可能缺少什麼命令?
Celada 建議通過修改文件 /etc/sysctl.conf來禁用反向路徑過濾,從而解決了路由問題
net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.all.rp_filter=0
雖然我現在意識到,為了與此設置競爭,我還需要通過 E 和 B 將返回的數據包路由回,以避免我的 ISP 對上游反向路徑進行過濾。