我在 Linux 机器上有一个 php / bash 应用程序,有 1 个物理接口连接到例如出站网络服务器 123.123.123.123 :80。我通过几个 openvpn 提供商来做到这一点。我有 tun 和 tap 提供商,但我最喜欢的提供商使用 tun。
实际上我完全能够连续:
- 打开VPN
sudo route add 123.123.123.123 tun0
- 将流量发送到 123.123.123.123 :80
- 关闭VPN
sudo route del 123.123.123.123
我在 .ovpn 配置文件中使用“route-nopull”选项,以保持 Linux 计算机可访问并允许同时进行 openvpn 连接。
现在我需要打开几个独立的请求,始终发送到出站网络服务器 123.123.123.123 :80。但我的实际流程是串行的,我需要等待第一个连接关闭并清除自身,然后再尝试第二个连接。
我很确定我可以通过“假端口”来实现它。例如:
- 接口 tun0、tun1、tun2
- 假端口 9000、9001、9002
- 多个路由表 rt0、rt1、rt2
所以从概念上来说:
- 123.123.123.123:9000 -> 标记为 rt0 (tun0 是默认网关) -> 重写为 123.123.123.123:80 -> rt0
- 123.123.123.123:9001 -> 标记为 rt1(tun1 是默认网关) -> 重写为 123.123.123.123:80 -> rt1
- 123.123.123.123:9002 -> 标记为 rt2(tun2 是默认网关) -> 重写为 123.123.123.123:80 -> rt2
我只能代表概念,因为我对 iptables 几乎没有任何技能。如果您有不同的方法来实现结果,我们欢迎。感谢您的阅读和帮助。
答案1
我在这里解决并记录了它: http://aftermanict.blogspot.it/2015/11/bash-iptables-iproute2-and-multiple.html
这将使内核永久路由数据包,启用多个路由,甚至对于未在计算机上证明的网络:
nano /etc/sysctl.conf
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
net.ipv4.ip_forward = 1
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 >| $f ; done
这将初始化 iptables,特别是 mangle 和 nat,它们是标记流量所需的:
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
添加替代路线编辑:
nano /etc/iproute2/rt_tables
添加(名称是您的参考资料):
1 tunnel0
2 tunnel1
添加路由和规则,我们使用表 ID 而不是更直接的名称。正如您所注意到的,网关是无关紧要的,特别是对于可以具有动态网关的隧道:
ip route add 0.0.0.0/0 dev tun0 table 1
ip route add 0.0.0.0/0 dev tun1 table 2
添加规则标记流量并绑定到对应的表:
ip rule add from all fwmark 1 table 1
ip rule add from all fwmark 2 table 2
ip route flush cache
检查您是否喜欢:
ip route show table 1
ip route show table 2
ip rule show
如果您错过了某些内容,可以通过以下方式删除:
ip rule del table 1
ip route flush table 1
现在缺少的部分:这不起作用:
iptables -A PREROUTING -t mangle -p tcp --dport 80 -j MARK --set-mark 1
这会:
iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables-save
您是否需要选择流量并将其同时推送到设备/隧道中?没问题,我也解决了这个问题:
iptables -A OUTPUT -t mangle -p tcp --dport 10001 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -p tcp --dport 10002 -j MARK --set-mark 2
iptables -t nat -A OUTPUT -p tcp --dport 10001 -j DNAT --to :80
iptables -t nat -A OUTPUT -p tcp --dport 10002 -j DNAT --to :80
回复时必须使用 NAT
iptables -t nat -A POSTROUTING -o $DEV1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $DEV2 -j MASQUERADE
iptables-save