Linux

為什麼此路由設置不起作用

  • April 20, 2022

我在伺服器機器上有兩個介面。的輸出ip route是下一個:

default via 192.168.100.1 dev enp1s0 proto static metric 100
10.8.0.0/24 dev tap0 proto kernel scope link src 10.8.0.1
192.168.100.0/24 dev enp1s0 proto kernel scope link src 192.168.100.201 metric 100

接下來是(ip address隱藏 MAC):

...
1: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
   link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
   inet 192.168.100.201/24 brd 192.168.100.255 scope global noprefixroute enp1s0
      valid_lft forever preferred_lft forever
   inet6 fe80::1409:66c6:eb0d:22a1/64 scope link noprefixroute
      valid_lft forever preferred_lft forever
2: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
   link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
   inet 10.8.0.1/24 brd 10.8.0.255 scope global tap0
      valid_lft forever preferred_lft forever
   inet6 fe80::85:5fff:fe98:6cb7/64 scope link
      valid_lft forever preferred_lft forever

/proc/sys/net/ipv4/ip_forward值為 1 ;防火牆被禁用。

我想要的是從10.8.0.100訪問**192.168.100.1。通過工作正常訪問網路伺服器(正在偵聽這台機器上的所有埠)。但輸出是.curl --interface 10.8.0.100 http://10.8.0.1``curl --interface 10.8.0.100 http://192.168.100.201``Network unreachable

Curl 發起 tcp 握手並將數據包推送到10.8.0.100介面。然後數據包到達10.8.0.1上的伺服器機器。伺服器查看數據包 dest 並看到它是192.168.100.201。然後查看路由表,發現192.168.100.201是本地的。現在答案又回來了。發件人是10.8.0.100。查看路由表,我們可以發現它可以通過tap0本地訪問。所以現在它進入tap0並到達 10.8.0.100。

但實際上 -它不是。這是因為我的構想不對嗎?我認為描述表提供的資訊足以確定如何轉發數據包。這實際上是不完整的嗎?

--interface IP問題在於對和之間的區別的誤解--interface dev。第一個使用路由表:

數據包--interface 10.8.0.100不會被轉發到tap0介面(該ip所屬的介面)。相反,根據路由表,它將被轉發到192.168.100.58(區域網路介面)。所以路線是10.8.0.100 -> 192.168.100.58 -> 192.168.100.201。即使傳遞了 SYN,伺服器也奇怪地不會用 SYN-ACK 響應——這就是 curl 失敗的原因。

使用--interface tap0即鏈路層地址,它將按預期工作:10.8.0.100 -> 10.8.0.1 -> 192.168.100.201。SYN-ACK 將使用相同的路由返回。

首先,ping為非同義詞提供帶有 -I 參數的 IP 地址和介面。首先告訴source IP選擇哪個。它將根據網路流量進行路由,包括本地地址和路由表。第二個告訴直接選擇將數據包發送到的介面(它將選擇第一個分配的 IP 作為源)。

接下來你在做什麼與數據包轉發無關。轉發意味著數據包必須實際從“外部”到達。當您從該主機生成數據包時,不涉及轉發。這是一個本地生成的數據包。由於您的目標 IP 是本地分配的地址之一,當您不強制 ping 將數據包發送到“外部”(帶有-I interface選項)的特定介面時,核心將在內部處理此數據包流。它只是不會嘗試將其輸出到真實界面,因為它的目的地是“已經在這裡”。所以這就是發生的事情,以及為什麼它在一種情況下有效,而在另一種情況下無效。

PS:如果您知道自己正在做並且兩個介面都連接到同一個廣播域(我懷疑 TAP 介面),請查看-r該工具的選項。ping

引用自:https://serverfault.com/questions/1073565