我办公室里的Linux计算机:
> uname -a
Linux 3.2.0-2-686-pae #1 SMP Tue Mar 20 19:48:26 UTC 2012 i686 GNU/Linux.
它有 2 个 ISP,第一个是静态 IP 和默认路由:
> ip ro
default via 19.11.20.15 dev vlan40
19.11.20.0/27 dev vlan40 proto kernel scope link src 19.11.20.20
第二个是 gprs 调制解调器。我没有使用默认路由来调用 wvdial:
> ip ro
10.64.64.64 dev ppp0 proto kernel scope link src 10.68.173.91
其次,我家里另一个网络上的计算机有公共 IP,但并不总是在线。他的配置非常相似,Debian Linux。
我的任务是通过 ssh 访问第一台计算机,即使第一个 ISP 失败。
今天我使用了如下命令:
ip ro add 46.48.10.56 via 10.64.64.64
while true ; do ssh -R2221:127.0.0.1:22 [email protected]; done
之后,我可以通过ssh -p 2221 127.0.0.1
第二个 ISP 和调制解调器连接到办公室。
它很好,但是很慢而且昂贵,因为我在这两台计算机之间不仅使用 ssh,还使用 vnc、http 等。
这就是为什么我要使用 ISP1 来执行除 ssh 之外的任何操作,并使用 ISP2 来执行 ssh 操作。
是否可以?
答案1
你需要使用防火墙标记随着策略路由. 首先创建一个通过 ISP2 路由的新路由表:
echo 12 isp2 >> /etc/iproute2/rt_tables
ip route add default via 10.64.64.64 table isp2
(第一个命令只需要运行一次。)然后添加一个路由策略规则,以便将此新表用于具有特定防火墙标记的数据包:
ip rule add fwmark 2 lookup isp2
最后,使用 iptables 标记您想要特殊路由的数据包:
iptables -t mangle -A OUTPUT -p tcp --dport ssh -j MARK --set-mark 2
编辑:我不确定是否有更好的方法来做到这一点,但我需要通过端口路由源 NAT 数据包:
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE