我有一台应该连接两个网络的计算机: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 链接 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。我花了几天/几周的时间来解决这个问题。
谢谢,抱歉占用您的时间。