Routing
路由問題——arp
我有一台應該連接兩個網路的電腦:
192.168.0.x
和192.168.1.x
192.168.0.x
可以通過介面訪問,tun3
而192.168.1.x
可以通過介面訪問virbr1
。似乎 0.x 的電腦可以與 1.x 的電腦通信,但反之則不行。
似乎來自 virbr1 的 arp 數據包被丟棄了。這發生在哪裡?
這是應該連接兩個網路的主機上兩個介面(tun3 和 virbr1)的 ifconfig:
root@pgrozav:/home/paul/data/work/server# ifconfig tun3 ; ifconfig virbr1 tun3 鏈路封裝:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet 地址:10.1.0.1 PtP:10.1.0.2 遮罩:255.255.255.255 UP POINTOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX 數據包:942 錯誤:0 丟棄:0 超限:0 幀:0 TX 數據包:463 錯誤:0 丟棄:0 超限:0 運營商:0 碰撞:0 txqueuelen:500 RX 字節:88986 (86.9 KiB) TX 字節:42452 (41.4 KiB) virbr1 連結封裝:乙太網 HWaddr 52:54:00:78:23:3b inet 地址:192.168.1.1 廣播:192.168.1.255 遮罩:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX 數據包:51616 錯誤:0 丟棄:0 超限:0 幀:0 TX 數據包:1198 錯誤:0 丟棄:0 超限:0 運營商:0 碰撞:0 發送隊列:0 RX 字節:1469672 (1.4 MiB) TX 字節:155418 (151.7 KiB)
此外,這是 IPTables 規則:
root@pgrozav:/home/paul/data/work/server# iptables -nvL 鏈輸入(策略接受 4097K 數據包,1544M 字節) pkts bytes target prot opt in out source destination 0 0 接受 udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 0 0 接受 tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 0 0 接受 udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67 0 0 接受 tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67 0 0 接受 udp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 0 0 接受 tcp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 0 0 接受 udp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67 0 0 接受 tcp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67 Chain FORWARD(策略接受 481 個數據包,40360 字節) pkts bytes target prot opt in out source destination 0 0 接受所有 -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED 0 0 全部接受 -- virbr0 * 192.168.122.0/24 0.0.0.0/0 0 0 全部接受 -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 0 0 全部拒絕 -- * virbr0 0.0.0.0/0 0.0.0.0/0 拒絕-與 icmp-port-unreachable 0 0 全部拒絕 -- virbr0 * 0.0.0.0/0 0.0.0.0/0 拒絕-與 icmp-port-unreachable 393 42938 接受所有 -- * virbr1 0.0.0.0/0 192.168.1.0/24 ctstate 相關,已建立 397 35116 接受所有 -- virbr1 * 192.168.1.0/24 0.0.0.0/0 0 0 全部接受 -- virbr1 virbr1 0.0.0.0/0 0.0.0.0/0 0 0 全部拒絕 -- virbr1 * 0.0.0.0/0 0.0.0.0/0 拒絕-與 icmp-port-unreachable 鏈輸出(策略接受 3217K 數據包,435M 字節) pkts bytes target prot opt in out source destination 0 0 接受 udp -- * virbr0 0.0.0.0/0 0.0.0.0/0 udp dpt:68 0 0 接受 udp -- * virbr1 0.0.0.0/0 0.0.0.0/0 udp dpt:68 root@pgrozav:/home/paul/data/work/server# iptables -nvL -t nat 鏈 PREROUTING(策略接受 99697 個數據包,15M 字節) pkts bytes target prot opt in out source destination 鏈輸入(策略接受 65648 個數據包,13M 字節) pkts bytes target prot opt in out source destination 鏈輸出(策略接受 169K 數據包,12M 字節) pkts bytes target prot opt in out source destination Chain POSTROUTING(策略接受 169K 數據包,12M 字節) pkts bytes target prot opt in out source destination 69 5293 全部返回 -- * * 192.168.122.0/24 224.0.0.0/24 0 0 全部返回 -- * * 192.168.122.0/24 255.255.255.255 0 0 MASQUERADE tcp -- * * 192.168.122.0/24 !192.168.122.0/24 masq 埠:1024-65535 0 0 偽裝 udp -- * * 192.168.122.0/24 !192.168.122.0/24 偽裝埠:1024-65535 0 0 全部偽裝 -- * * 192.168.122.0/24 !192.168.122.0/24 69 5293 全部返回 -- * * 192.168.1.0/24 224.0.0.0/24 0 0 全部返回 -- * * 192.168.1.0/24 255.255.255.255 5 300 MASQUERADE tcp -- * * 192.168.1.0/24 !192.168.1.0/24 masq 埠:1024-65535 12 766 MASQUERADE udp -- * * 192.168.1.0/24 !192.168.1.0/24 masq 埠:1024-65535 5 420 偽裝全部 -- * * 192.168.1.0/24 !192.168.1.0/24
和路由表:
root@pgrozav:/home/paul/data/work/server# ip route 預設通過 192.168.200.1 dev eth0 10.1.0.2 開發 tun3 原型核心範圍連結 src 10.1.0.1 192.168.0.0/24 通過 10.1.0.1 dev tun3 範圍連結 192.168.1.0/24 dev virbr1 proto kernel scope link src 192.168.1.1 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 192.168.200.0/24 dev eth0 proto 核心範圍連結 src 192.168.200.70 root@pgrozav:/home/paul/data/work/server# ip route list table 200 預設通過 10.1.0.1 dev tun3 192.168.1.0/24 通過 10.1.0.1 開發 tun3
實際上,我有一個設置它的腳本:
遠端主機=開發 隧道號=3 隧道前綴名稱="tun" tunnelName="$tunnelPrefixName$tunnelNumber" 隧道本地IP="10.1.0.1" 隧道遠端IP="10.1.0.2" remoteNetworkToJoin="192.168.0.0" remoteNetworkToJoinNetmask="255.255.255.0" remoteNetworkToJoinInterfaceName="eth0" localNetworkToJoin="192.168.1.0" localNetworkToJoinNetmask="255.255.255.0" localNetworkToJoinInterfaceName="virbr1" ssh -f -NTC -w $tunnelNumber:$tunnelNumber $remoteHost ip link set $tunnelName up ssh $remoteHost ip link set $tunnelName up ip addr add $tunnelLocalIP/32 peer $tunnelRemoteIP dev $tunnelName ssh $remoteHost ip addr add $tunnelRemoteIP/32 peer $tunnelLocalIP dev $tunnelName route add -net $remoteNetworkToJoin gw $tunnelLocalIP 網路遮罩 $remoteNetworkToJoinNetmask dev $tunnelName ip route add default via $tunnelLocalIP dev $tunnelName table 200 從 $localNetworkToJoin/24 表 200 添加 ip 規則 ssh $remoteHost route add -net $localNetworkToJoin gw $tunnelRemoteIP 網路遮罩 $localNetworkToJoinNetmask dev $tunnelName ssh $remoteHost iptables -A FORWARD -i $remoteNetworkToJoinInterfaceName -o $tunnelName -m state --state ESTABLISHED,RELATED -j ACCEPT ssh $remoteHost iptables -A FORWARD -s $tunnelLocalIP -o $remoteNetworkToJoinInterfaceName -j ACCEPT ssh $remoteHost iptables -t nat -A POSTROUTING -s $tunnelLocalIP -o $remoteNetworkToJoinInterfaceName -j MASQUERADE
我在這台機器上執行 KVM,virbr1 將我的機器連接到所有虛擬機所在的虛擬 LAN。我正在嘗試將本地 LAN(使用 VM - 1.x)連接到遠端網路(0.x)
我的 1.2 電腦的路由表中有問題,我從那裡 ping 0.6:
[root@localhost ~]# ip 路由列表 預設通過 192.168.1.1 dev eth0 proto static metric 100 192.168.0.0 通過 192.168.1.1 dev eth0 proto static **192.168.0.0/16** dev eth0 proto 核心範圍連結 src 192.168.1.2 公制 100
我認為虛擬機很乾淨,並且(預設情況下)有一個空路由表和 iptables。我花了幾天/幾週的時間來解決這個問題。
謝謝,很抱歉佔用您的時間。
Arp 在 LAN 上用於辨識 IP-MAC 對。我不確定 ARP 是否與您的問題有關。
如果從 0.x -> 1.x 的連接正常,這意味著你沒有路由問題,因為在通信過程中,數據包從 0.x 發送到 1.x,從 1.x 發送到 0.x(假設它是TCP通信)
如果從 1.x -> 0.x 的連接失敗,那麼你可能會有一些介於兩者之間的東西;防火牆、NAT、應用程序訪問列表、tcp 包裝器…
您必須檢查客戶端、網關和伺服器。