因此我在主机上有 3 个接口:
- 接口1面向外部网络
- 接口 2 是 tun0 vpn 接口
- 接口 3 本地网络接口
我的目标是将来自接口 3(本地网络)的所有流量通过 vpn 接口路由,并将来自主机的所有流量通过默认接口 1 路由
# ip route
default via 192.168.1.1 dev eth0
10.8.8.0/24 dev tun0 proto kernel scope link src 10.8.8.27
128.0.0.0/1 via 10.8.8.1 dev tun0
192.168.0.0/24 dev eth2 proto kernel scope link src 192.168.0.1
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.56
(我读过这里的其他帖子,但没有一个真正有帮助)
答案1
首先:如果路由器不使用隧道,“半默认”路由 128.0.0.0/1(没有其另一半 0.0.0.0/1 ??)不应该存在:
# ip route del 128.0.0.0/1 via 10.8.8.1 dev tun0
由于它很可能是从隧道软件中设置的,所以处理其配置。
现在创建一个新表(随机选择:100),其中包含通过隧道的默认路由,并且仅将其用于来自 eth2 的流量:
# ip route add default via 10.8.8.1 dev tun0 table 100
# ip rule add iif eth2 lookup 100
测试:
无论其源 IP 是什么,主机都使用通常的默认路由(根据问题,隧道的选择器来自接口,而不是 IP):
# ip -o route get 8.8.8.8
8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.56 \ cache
# ip -o route get 8.8.8.8 from 192.168.0.1
8.8.8.8 from 192.168.0.1 via 192.168.1.1 dev eth0 \ cache
来自 eth2 的流量将得到不同的处理:
# ip -o route get 8.8.8.8 from 192.168.0.2 iif eth2
8.8.8.8 from 192.168.0.2 via 10.8.8.1 dev tun0 table 100 \ cache iif eth2
如果您还想让本地 192.168.0.1 IP 通过隧道。这会稍微复杂一些,因为 192.168.0.1 需要在需要时将 IP 数据包发送到其自己的 LAN(在本例中不是发送到 tun0)。还需要将 LAN 路由复制到表 100,添加基于源 IP 的规则(然后删除基于接口的无用先前规则):
# ip route add 192.168.0.0/24 dev eth2 table 100
# ip rule add from 192.168.0.0/24 lookup 100
( # ip rule del iif eth2 lookup 100 )
现在还给出:
# ip -o route get 8.8.8.8 from 192.168.0.1
8.8.8.8 from 192.168.0.1 via 10.8.8.1 dev tun0 table 100 \ cache
路由就是这样。请注意,如果没有 NAT,隧道的另一端需要通过 10.8.8.27 路由到 192.168.0.0/24,否则它将无法工作。这应该是首选。
如果远程未设置此路由,并且 NAT 足够好,请使用以下命令进行配置:
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o tun0 -j MASQUERADE
答案2
您没有明确说明哪个接口是哪个,因此我假设:
- 接口 1 是
eth0
(面向 WAN) - 接口 2 是
tun0
(VPN 隧道) - 接口 3 是
eth2
(LAN)
首先,您需要想出一个路由表名称和 ID,并将其附加到路由表别名文件(通常为/etc/iproute2/rt_tables
),格式如下
TABLE_ID TABLE_NAME
其中TABLE_ID
是一个非保留正整数,例如 10。
由于您希望所有数据包都eth2
通过 VPN 路由,因此您需要通过隧道接口在此表上添加默认路由
ip route add default dev tun0 table TABLE_NAME
然后你需要添加一条规则,以便将此表用于来自eth2
ip rule add iif eth2 table TABLE_NAME