由于国情在此,所以从内地直连 H 地的 SSH 很快就会被阻断;但是连接 A 国的服务器则不会受到如此干扰。由于 H 地和 A 国的机器之间已经通过 WireGuard 连接起来,所以自然就产生了 “能不能通过在 A 国机器上设置防火墙规则 reroute 某个端口的流量到 H 地的机器上实现曲线救国呢” 的想法。
通过 Google 和 ChatGPT,得出的答案都是类似的:
1
2
3
4
5
6
# 1,启用 IP Forwarding
sudo sysctl -w net.ipv4.ip_forward=1
# 2,给 iptables 的 prerouting 加 dnat 规则
sudo iptables -t nat -A PREROUTING -p tcp --dport 10022 -j DNAT --to-destination <MachineH_IP>:22
# 3,给 iptables 的 postrouting 加 masquerade 规则
sudo iptables -t nat -A POSTROUTING -p tcp -d <MachineH_IP> --dport 22 -j MASQUERADE
但是这样下来 ssh -p 10022 MachineA_IP
依然是不通的。百思不得其解,因为 nat 表的那几条规则是真的在转发数据包了,但是就是不通。后来看到 Stack Exchange 上关于这个话题的帖子之后,被启发到可能是 FORWARD chain 出现了问题。给 FORWARD chain 加了临时 LOG 进行分析之后发现,由于 FORWARD 的 policy 是 drop,所以如果不添加规则来接受这些要被转发的包,那么它们也会被 drop 的。所以还需要以下命令来让转发能够完成:
Bash
1
2
3
4
# 去程 accept
sudo iptables -A FORWARD -p tcp -d <MachineH_IP> --dport 22 -j ACCEPT
# 回程 accept
sudo iptables -A FORWARD -p tcp -s <MachineH_IP> --sport 22 -j ACCEPT