我正在尝试使用 iptables MARK 将目标与端口 22 匹配的所有本地连接重定向到指定隧道,但是出现了问题。
1.1.1.1 my public address
2.2.2.2 tunnel public address
1.2.3.4 my local tunnel address
这里是配置:
# ip rule show
1: from all fwmark 0x14 lookup 20
# ip route show table 20
default via 1.2.3.4 dev tun0
我在 iptables 上创建了以下规则:
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 20
iptables -t mangle -A OUTPUT -s 1.2.3.4 -j MARK --set-mark 20
当我尝试 ssh 某个服务器(在本例中为 dreamhost)时,我得到以下信息:
tcp 6 299 ESTABLISHED src=1.1.1.1 dst=69.163.202.189 sport=37152 dport=22 packets=4 bytes=221 src=69.163.202.189 dst=1.1.1.1 sport=22 dport=37152 packets=2 bytes=133 [ASSURED] mark=0 secmark=0 use=2
数据包未被标记,并通过默认路由(即 1.1.1.1)发出
我不知道我做错了什么。
有人知道吗?
答案1
曼格尔的 预路由用于改变传入数据包在路由之前输出用于改变本地生成的数据包在路由之前。因此预路由是不必要的(对于本地连接)。但OUTPUT
应该可以。通常不需要在防火墙规则中指定源地址,因为它无论如何都是“本地生成的数据包”。
还有一件事要记住没有人会因为你标记了数据包而更改源 IP,并且它将通过另一个路由表进行路由 — 你需要明确使用 NAT就 Linux 的 iptables 而言,必须源地址转换。正如该人所说,“此目标仅在 nat 表中的 POSTROUTING 链中有效”。尽管我个人更喜欢它的子类,MASQUERADE
因为它更方便,因为您不必为 IP 地址硬编码而烦恼。