基于端口在特定接口上路由

基于端口在特定接口上路由

我在 Linux 机器上有一个 php / bash 应用程序,有 1 个物理接口连接到例如出站网络服务器 123.123.123.123 :80。我通过几个 openvpn 提供商来做到这一点。我有 tun 和 tap 提供商,但我最喜欢的提供商使用 tun。

实际上我完全能够连续:

  1. 打开VPN
  2. sudo route add 123.123.123.123 tun0
  3. 将流量发送到 123.123.123.123 :80
  4. 关闭VPN
  5. 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

相关内容