通过特定接口路由端口流量

通过特定接口路由端口流量

我对 Linux 上的整个网络事物有点陌生。我运行的是 Ubuntu 20.04,linux 5.4.0-25-generic。我正在尝试执行以下操作,但我有点卡住了。

我有一个接口:bond0,这是我的服务器和互联网之间的本地接口。我还有一个 OpenVPN 客户端tun1,用于加密服务器外的所有流量。

我正在尝试将端口 X 和端口 Y 路由出去,bond0而不是tun1默认的端口。

我已经尝试过的:

我在这里看到了这个话题,但由于某种原因,它似乎不起作用。我制作了 ip 路由表 80,并执行了指南所说的所有操作,但我无法让流量从 bond 而不是 tun 中出来。

我可以看出它不起作用,因为我仍然无法通过外部 IP 地址访问这些端口。

以下是更多信息:

  • bond0:192.168.50.34
  • 路由器:192.168.50.1
  • tun1:10.44.10.6

可能相关,但我也通过运行OpenVPN服务器tun0,所以我通过它设置了一些转发,但我不认为它相关。

如果有人可以给我另一件事来尝试让此端口路由正常工作,那就太好了!

更新

iptables -t mangle -nvL

Chain PREROUTING (policy ACCEPT 14576 packets, 2179K bytes)
 pkts bytes target     prot opt in     out     source               destination
14668 2198K CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            CONNMARK restore

Chain INPUT (policy ACCEPT 14576 packets, 2179K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 14840 packets, 8224K bytes)
 pkts bytes target     prot opt in     out     source               destination
14874 8228K markports  all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x0
14863 8227K CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            CONNMARK save

Chain POSTROUTING (policy ACCEPT 14883 packets, 8227K bytes)
 pkts bytes target     prot opt in     out     source               destination

 Chain markports (1 references)
 pkts bytes target     prot opt in     out     source               destination
 104K   19M MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:32400 MARK set 0x80
    0     0 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:1195 MARK set 0x80
    5   469 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 MARK set 0x80
   90 11706 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 MARK set 0x80

ip 路由显示表 80

default via 192.168.50.1 dev bond0
192.168.50.0/24 dev bond0 scope link src 192.168.50.34

ip规则

0:      from all lookup local
32765:  from all fwmark 0x80 lookup 80
32766:  from all lookup main
32767:  from all lookup default

第二次更新

在上面的超链接文本中,我最终将数据包转发到本地接口。在我无法将任何内容从服务器传输到客户端之前,但我认为其中一个命令存在错误:

iptables -t mangle -I OUTPUT 1 -m mark --mark 0 -j markports

当我将命令更改为:

iptables -t mangle -I OUTPUT 1 -m mark --mark 0x80 -j markports

我能够将数据包流式传输到服务器。仍然无法通过互联网访问服务器,但现在这可能是一个不同的问题。将在接下来的几天内调查 tcpdump。

答案1

正如我在 评论从 OP 链接,从 Linux 内核 4.17 开始,使用iptables(或任何东西网络过滤器不再需要相关)来解决这个问题。最新内核中描述的可用于处理此问题的新功能kernelnewbies.org

扩展 fib 规则匹配支持以包括 sport、dport 和 ip proto 匹配(以完成 5 元组匹配支持)。数据中心中基于策略的路由的常见用例需要 5 元组匹配犯罪,犯罪,犯罪,犯罪,犯罪

因此,我将在这个答案中实现较新的方法,而不是搜索哪些细节与我之前的答案中的方式不同。

我假设仅VPN 正在运行:OP 描述的VPN。我缺乏有关其他 VPN 的信息,无法知道是否与它有交互。

请刮擦任何ip规则规则或iptables之前添加的规则是为了尝试解决此问题。

保持表 80 如 OP 所示:

ip route add table 80 192.168.50.0/24 dev bond0 src 192.168.50.34
ip route add table 80 default via 192.168.50.1

添加与ip rule使用特定目标端口时选择备用路由的规则。不知道用例或剩余拓扑(其他 VPN、服务器接收来自 VPN 的传入流量...),为了安全起见,我将其限制为服务器本身,而不是它可能路由的任何内容。这就是下面的目标iif lo。这是一种特殊的表达方式来自本地,即本地发起的传出(非路由)流量:

ip rule add iif lo ipproto tcp dport 80 lookup 80
ip rule add iif lo ipproto tcp dport 443 lookup 80
ip rule add iif lo ipproto tcp dport 1195 lookup 80
ip rule add iif lo ipproto tcp dport 32400 lookup 80

然后剩下的部分就是放松严格反向路径转发松散的RPF(这与根本不激活它没有太大区别)以防万一积极的默认情况下,在给定的 Linux 发行版中,为了防止返回流量被丢弃:

sysctl -w net.ipv4.conf.bond0.rp_filter=2

就是这样:

# ip route get 192.0.2.10
192.0.2.10 dev tun1 src 10.44.10.6 uid 0 
    cache 
# ip route get 192.0.2.10 ipproto tcp dport 80
192.0.2.10 via 192.168.50.1 dev bond0 table 80 src 192.168.50.34 uid 0 
    cache

相关内容