為什麼此路由設置不起作用
我在伺服器機器上有兩個介面。的輸出
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