我使用 openvpn,它可以很好地通过所有连接的网关路由到各自的网络。
所以我的主要的路由器有
eth0192.168.1.1
具有IP
tun0设备192.168.94.2
每个外部路由器连接到这个主路由器都会获得192.168.94.0/24
范围内的 IP 地址,我通过 tun0 dev 连接两个网络。
我有一般的路由语句:192.168.0.0/16 via 192.168.94.2 dev tun0
并且一切正常,以及:iptables -A FORWARD -s 192.168.0.0/16 -d 192.168.0.0/16 -j ACCEPT
所以私有 IP 范围之间没有 NAT。
但我的其中一个路由器上有另一个本地隧道相对湿度和
eth0IP 192.168.10.1
(网络192.168.10.0/24
)
tun0 192.168.94.69
和tun1 192.168.95.2
(具有连接并可访问网络192.168.11.0/24
)
是否可以访问主要的192.168.11.0/24
通过路由器连接到子网相对湿度路由器?我尝试添加路由:
ip ro add 192.168.11.0/24 via 192.168.94.69 onlink dev tun0
但数据包没有路由。我尝试添加,via 192.168.10.1
但也没有成功。
答案1
网关路由不适用于tun
接口,因为接口不携带链路层头。
当路由指定网关时via ...
,它实际上被解析为鏈接層地址(即,它成为以太网报头中的“目标 MAC”地址),将数据包定向到正确的主机。数据包从不通过其 IP 地址指定网关,而只通过其 MAC 指定网关。
但是由于tun
接口没有链路层寻址,因此数据包只能采取一个可能的目的地,并且您的路由行为完全相同192.168.0.0/16 dev tun0
(“网关”字段被忽略)。
为了实现您的目标,您有以下几种选择:
使用 OpenVPN 服务器的
iroute
选项,该选项告诉 OpenVPN 在操作系统通过 tun0 路由数据包后,根据目标 IP 地址在内部将数据包转发到特定客户端。将您的 VPN 切换到
tap
接口类型,做具有链路层寻址 – “tap”接口承载完整的以太网帧,而不仅仅是 IP 数据包。(请注意,Android/iOS 不支持“tap”VPN。)