Ip

將數據包從一個介面路由到另一個介面

  • October 27, 2016

問題總結

這是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 對上游反向路徑進行過濾。

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