仅通过 VPN 路由来自特定接口的数据包

仅通过 VPN 路由来自特定接口的数据包

因此我在主机上有 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

相关内容