路由问题——arp

路由问题——arp

我有一台应该连接两个网络的计算机:192.168.0.x192.168.1.x

192.168.0.x可以通过接口到达,tun3192.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 链接 encap: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
          上点运行 NOARP 多播 MTU:1500 指标: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 链接 encap:以太网 HWaddr 52:54:00:78:23:3b  
          inet 地址:192.168.1.1 广播:192.168.1.255 掩码:255.255.255.0
          上行广播运行多播 MTU:1500 指标:1
          RX 数据包:51616 错误:0 丢弃:0 溢出:0 帧:0
          TX 数据包:1198 错误:0 丢弃:0 溢出:0 运营商:0
          碰撞:0 txqueuelen:0
          RX 字节:1469672 (1.4 MiB) TX 字节:155418 (151.7 KiB)

另外,这是 IPTables 规则:

root@pgrozav:/home/paul/data/work/server# iptables -nvL
Chain INPUT(策略ACCEPT 4097K数据包,1544M字节)
 pkts 字节目标 prot 选择输出源目标         
    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 字节目标 prot 选择输出源目标         
    0 0 全部接受 -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate 相关,已建立
    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 端口不可达
    0 0 拒绝全部 -- virbr0 * 0.0.0.0/0 0.0.0.0/0 拒绝 icmp 端口不可达
  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 端口不可达

Chain OUTPUT(策略接受3217K数据包,435M字节)
 pkts 字节目标 prot 选择输出源目标         
    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
Chain PREROUTING(策略接受99697个数据包,15M字节)
 pkts 字节目标 prot 选择输出源目标         

Chain INPUT(策略ACCEPT 65648数据包,13M字节)
 pkts 字节目标 prot 选择输出源目标         

Chain OUTPUT(策略接受169K数据包,12M字节)
 pkts 字节目标 prot 选择输出源目标         

Chain POSTROUTING(策略接受169K数据包,12M字节)
 pkts 字节目标 prot 选择输出源目标         
   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 伪装 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 masq 端口: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 路由
默认通过 192.168.200.1 dev eth0
10.1.0.2 dev tun3 proto 内核范围链接 src 10.1.0.1
192.168.0.0/24 通过 10.1.0.1 dev tun3 范围链接
192.168.1.0/24 dev virbr1 proto 内核范围链接 src 192.168.1.1
192.168.122.0/24 dev virbr0 原型内核范围链接 src 192.168.122.1
192.168.200.0/24 dev eth0 原型内核范围链接 src 192.168.200.70
root@pgrozav:/home/paul/data/work/server# ip 路由列表表 200
默认通过 10.1.0.1 dev tun3
192.168.1.0/24 通过 10.1.0.1 dev tun3

实际上,我有一个脚本可以设置它:

远程主机=开发
隧道编号=3
隧道前缀名称=“tun”
隧道名称=“$tunnelPrefixName$tunnelNumber”
隧道本地IP =“10.1.0.1”
隧道远程IP =“10.1.0.2”
远程网络加入=“192.168.0.0”
RemoteNetworkToJoinNetmask="255.255.255.0"
远程网络ToJoinInterfaceName =“eth0”
localNetworkToJoin="192.168.1.0"
localNetworkToJoinNetmask="255.255.255.0"
localNetworkToJoinInterfaceName="virbr1"


        ssh -f -NTC -w $tunnelNumber:$tunnelNumber $remoteHost
        ip 链接设置 $tunnelName up
        ssh $remoteHost ip 链接设置 $tunnelName up
        ip addr 添加 $tunnelLocalIP/32 对等 $tunnelRemoteIP dev $tunnelName
        ssh $remoteHost ip addr 添加 $tunnelRemoteIP/32 对等 $tunnelLocalIP dev $tunnelName
        路由添加 -net $remoteNetworkToJoin gw $tunnelLocalIP 网络掩码 $remoteNetworkToJoinNetmask dev $tunnelName
        ip 路由通过 $tunnelLocalIP dev $tunnelName 表 200 添加默认值
        从 $localNetworkToJoin/24 表 200 添加 ip 规则
        ssh $remoteHost 路由添加 -net $localNetworkToJoin gw $tunnelRemoteIP 网络掩码 $localNetworkToJoinNetmask dev $tunnelName
        ssh $remoteHost iptables -A 转发 -i $remoteNetworkToJoinInterfaceName -o $tunnelName -m 状态 --state 已建立,相关 -j 接受
        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(带有虚拟机 - 1.x)连接到远程网络(0.x)

答案1

Arp 在 LAN 上用于识别 IP-MAC 对。我不确定 ARP 是否与您的问题有关。

如果从 0.x -> 1.x 的连接有效,则意味着您没有路由问题,因为在通信过程中,数据包从 0.x 发送到 1.x,从 1.x 发送到 0.x(假设是TCP通讯)

如果从 1.x -> 0.x 的连接失败,那么您可能会遇到介于两者之间的情况;防火墙、NAT、应用程序访问列表、tcp 包装器...

您必须检查客户端、网关和服务器。

答案2

我的 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 原始静态                                                                       
192.168.0.0/16dev eth0 原型内核范围链接 src 192.168.1.2 公制 100

我认为虚拟机是干净的并且(默认情况下)有一个空的路由表和 iptables。我花了几天/几周的时间来解决这个问题。

谢谢,抱歉占用您的时间。

相关内容