因此我在Linux机器上设置了以下三个网络接口:
eth0面向外部网络(192.168.1.0/24)
tun0是vpn接口(10.8.8.0/24)
eth1是本地网络接口(192.168.0.0/24)
目标是创建一个 VPN 路由器,它仅路由来自 eth1 接口的数据包。
为了做到这一点,我有一个在建立 VPN 连接后运行的脚本:
允许系统其余部分使用默认网络连接
/sbin/ip route 删除 0.0.0.0/1 通过 10.8.8.1 dev tun0
/sbin/ip route 删除 128.0.0.0/1 通过 10.8.8.1 dev tun0通过 VPN 路由来自 192.168.0.0/24 的所有流量
/sbin/ip route 添加默认通过 10.8.8.1 dev tun0 表 200
/sbin/ip rule 添加从 192.168.0.0/24 表 200VPN 转发 (NAT)
/sbin/iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
/sbin/iptables -A FORWARD -i tun0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A FORWARD -i eth1 -o tun0 -j ACCEPT
问题是,当建立 VPN 隧道时,Linux 机器不会响应 eth1 接口上的 ARP 请求。
如果我在客户端 PC 上手动配置 ARP 缓存,则设置可以正常工作。
有任何想法吗?
编辑 : ARP 仅当路由器向客户端 PC 发出请求时才起作用,反之则不起作用(在这种情况下路由器收到 ARP 但不回复)
编辑2:eth0 和 eth1 共享相同的 MAC 地址
答案1
解决方案是替换/sbin/ip rule add from 192.168.0.0/24 table 200
为ip rule add iif eth1 table 200
我们不希望只有来自 192.168.0.0/24 的数据包使用路由表 200,而是希望来自接口 eth1 的每个数据包都使用路由表 200。