我在一台 Linux 机器(centos 或 debian 但假设是 redhat 以防答复需要不同的方言)上有一个 php / bash 应用程序,连接到端口 80。
实际上,我完全能够通过 Linux 命令行上的 openvpn 打开 VPN。我将“route-nopull”选项用于 .ovpn 配置文件,以保持服务器可访问,因此,只要我决定通过它路由流量,就可以随时使用处于活动待命状态的 tuntap 设备。
很高兴知道我同时拥有 tun 和 tap 提供商,但我最喜欢的提供商使用 tun。
直到今天我只需要路由流量:
sudo route add 123.123.123.123 tun0
简单又时髦。现在我需要打开几个独立的请求,route-nopull 使我能够连接多个随时可用的 VPN:tun0 tun1 tun2... 我的问题是,我的“路由解决方案”强制应用程序请求仅以串行方式通过一个设备,我需要等待第二个连接!此外,这对我的技能来说太过分了... 我需要分享想法和一些技术帮助。
我对 iptables 的技能不太熟练,我认为反向代理也许可以让我将请求轮换到 localhost:9990 -> tun0、localhost:9991 -> tun1 等,但我没有反向代理经验,而且它们通常不支持 tuntap 设备。我很确定另一个解决方案是具有多个路由表的 iptables:123.123.123.123:9990 -> 标记为 rt0 -> 重写为 123.123.123.123:80 -> rt0 通过 tun0(其默认网关等)进行路由,等等,等等。
但这对我来说实在是太过分了!!! 另外,我担心错误的假设和混乱的测试会损害我的工作设置。
感谢您的阅读和帮助。
答案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