使用 iptables 和 iproute2 通过 VPN 进行精细路由

使用 iptables 和 iproute2 通过 VPN 进行精细路由

我家的一台主机上有一个 VPN 主机,我需要它来做几个用途。我暂时住在日本,它充当一些设备的 NAT,所以我仍然可以使用我的 NETFLIX 和其他一些服务。但是我希望该服务器仍然使用普通网络进行下载/网页浏览。目前,以下是我的配置的基本副本:

ip 规则显示

0:      from all lookup local
32764:  from all fwmark 0x1 lookup 10
32767:  from all lookup main
32768:  from all lookup default

ip 路由显示表 10

default dev ppp0 scope link

iptables-保存

*mangle
:PREROUTING ACCEPT [11:822]
:INPUT ACCEPT [11:822]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [8:872]
:POSTROUTING ACCEPT [8:872]
-A OUTPUT -s 192.168.1.102 -j MARK --set-mark 0x1
COMMIT
*nat
:PREROUTING ACCEPT [2831:752380]
:POSTROUTING ACCEPT [107531:7116617]
:OUTPUT ACCEPT [107652:7124121]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [41463962:7467495526]
-A FORWARD -i eth0 -p ppp+ -j ACCEPT
-A FORWARD -i ppp+ -o eth0 -j ACCEPT
COMMIT

我想说的是,我的实际 iptables 配置更加复杂,包括几个用于房屋 FORWARD 侧新连接的日志语句,并且为了避免过多的日志,在日志语句之前对 ESTABLISHED、RELATED 连接进行了全面接受,并且在 mangle 表上设置了更多 ip 地址。此配置适用于我的设备,但是我刚刚尝试从远程 ssh 进入它,但无法成功。原因很明显,来自我的 ssh 服务的回复被路由到 eth0 而不是 ppp0。这让我想到了我的问题。

可以将 fwmark 1 应用于通过 ppp0 发起的所有会话吗?通过一番挖掘,我知道 conntrack 可以根据会话发起主机的源 IP 执行匹配,但我可以对发起 dev 执行类似操作吗?

总体目标是,ssh 可以通过私有子网、我的原始 ip 地址(日本 ip 204.xxx.xxx.xxx)或 vpn 的 ip(23.xxx.xxx.xxx)执行,而无需不断更改配置。一个不优雅的解决方案是只允许通过私有和 VPN 进行 ssh,将 fwmark 应用于除 192.168.xxx.xxx 之外的任何子网,其中 sport 在 mangle 表中为 22,但这不允许通过日本 ip 进行 ssh。

答案1

使用 CONNMARK 标记连接:

iptables -t mangle -A INPUT -i ppp+ -j CONNMARK --set-mark 0x1
iptables -t mangle -A OUTPUT -m connmark --mark 0x1 -j MARK --set-mark 0x1

相关内容