通过不同的网络接口路由不同端口上的流量

通过不同的网络接口路由不同端口上的流量

我的情况是这样的:我正在设置一台在家中运行的服务器(Ubuntu Desktop 22.04.3 LTS)来运行电子邮件服务器和其他一些在线服务。众所周知,为了让我的电子邮件可靠地工作并且不被阻止,我需要有一个不变的公共 IP 地址。由于我的情况,我目前无法通过我的 ISP 获取静态 IP 地址或更改 ISP。

我发现的解决方案是购买带有静态 IP 的 4G SIM 卡(从提供该服务的 ISP 购买),然后我可以通过 USB 加密狗使用该卡。但是,使用这种 4G 连接每 MB 的费用相当高。

但是。邮件是唯一需要静态 IP 地址的服务器。对于其他所有服务,使用我的家庭网络连接并使用 DDNS 更新我的 DNS 记录就可以了。我之前已经为其他服务测试过此设置,并且成功了。

所以,我很好奇,理论上是否可以:同时将服务器连接到两个网络接口,并根据目标端口路由流量。也就是说,到端口 25、465、587 和可能的 993 的所有传出连接都应通过 4G 加密狗接口 ( enx344b50000000) 发送,而所有其他连接则通过 发送eth0。同样,服务器应该在 上监听相同端口上的传入连接enx344b50000000,并在 上监听所有其他端口(如果 ufw 允许)eth0

然后我需要来自mail.mydomain.tld—><4g static public IP>mydomain.tld—>的 DNS 记录<home public IP>(使用 DDNS 和在我家路由器上配置的 NAT 进行更新)。

这样,互联网上的计算机就能够无缝连接到这两个 IP 地址,而不会“意识到”它们实际上是同一台机器,只要请求mail.mydomain.tld始终在上述端口上即可。

问题:这可能吗?这是否是一个能够按照我期望的方式工作的强大解决方案?有人能帮我设置吗?

我在 DuckDuckGo 中遇到了一些不同的指南,我知道它与设置并将它们分配给使用 的表有关markiptables但是ip route我还没有设法让它工作,而且这些指南中的许多都是针对 VPN 的,它们似乎都略有不同。所以我想我会问一下我自己的具体用例,看看大家怎么想?

谢谢!!

编辑 1:更多信息

按照答案中的说明来实现这一点(谢谢!)我正在尝试使用 port 进行测试443。我的想法是,我将能够运行curl ipinfo.io/ipcurl https://ipinfo.io/ip获得不同的结果。

按照所有说明操作后,我似乎成功拦截了端口连接,443但它们并没有传递到互联网。curl ipinfo.io/ip返回预期结果,但curl https://ipinfo.io/ip返回:

curl: (7) Failed to connect to ipinfo.io port 443 after 1813 ms: No route to host

这是跑步前后的样子

iptables -t nat -A POSTROUTING -o enx344b50000000 -j MASQUERADE

以下步骤已成功完成:
注意我目前正在使用wlp2s0界面代替eth0

iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 1

已验证:

$ sudo iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
MARK       tcp  --  anywhere             anywhere             tcp dpt:smtp MARK set 0x1
MARK       tcp  --  anywhere             anywhere             tcp dpt:2525 MARK set 0x1
MARK       tcp  --  anywhere             anywhere             tcp dpt:https MARK set 0x1

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

4g在中创建表格/etc/iproute2/rt_tables,并使用

$ cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0   unspec
#
# local
#
#1  inr.ruhep
#
100 4g  # 4G modem static IP

并运行:

ip rule add fwmark 1 table 4g

已验证:

$ ip rule list
0:  from all lookup local
32765:  from all fwmark 0x1 lookup 4g
32766:  from all lookup main
32767:  from all lookup default

当我开始跑步的时候

ip route add default via 192.168.0.0 dev enx344b50000000 table 4g

我不再确定……

table 4g我可以运行什么命令来验证我刚刚创建的默认路由是否存在?

正常的输出应该ip route是什么?

目前的输出ip route是:

default via 192.168.0.1 dev enx344b50000000 proto dhcp metric 100 
default via 192.168.193.97 dev wlp2s0 proto dhcp metric 600 
169.254.0.0/16 dev wlp2s0 scope link metric 1000 
192.168.0.0/24 dev enx344b50000000 proto kernel scope link src 192.168.0.178 metric 100 
192.168.193.0/24 dev wlp2s0 proto kernel scope link src 192.168.193.131 metric 600

netstat -r产生:

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         _gateway        0.0.0.0         UG        0 0          0 enx344b50000000
default         _gateway        0.0.0.0         UG        0 0          0 wlp2s0
link-local      0.0.0.0         255.255.0.0     U         0 0          0 wlp2s0
192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 enx344b50000000
192.168.193.0   0.0.0.0         255.255.255.0   U         0 0          0 wlp2s0

这是在添加默认网关之前table 4g,之后保持不变。

我觉得有两个默认网关是不对的。所以我尝试了:

sudo ip route del default dev enx344b50000000

但这没什么区别。这是否受到 Ubuntu 动态路由的干扰?我也不确定 IP169.254.0.0/16是什么。

谢谢您进一步的帮助!

答案1

是的,这是可以做到的,而且您将会从学习 Linux 路由的所有细节中获得很多乐趣。从您的问题中我了解到,这也是您这样做的原因之一。

您需要仔细研究ip route,尤其是ip rule。以下是您可能会遇到的一些问题。

  • 对于入站流量,事情看起来很简单:postfix在您的静态接口上进行监听,在 DDNS 接口上进行其他服务监听。但是,如果您不强制执行这些操作,响应数据包将通过任一接口发出,并且您的客户端将看到来自错误 IP 的响应(并忽略它们)。
  • 出站:ip rule和/或 netfilter 标记应该能够强制流量通过特定接口流向特定端口。

但最大的问题来了。一旦您开始运行,您很可能会发现,即使您设置了 SPF 和 DKIM(必须设置),您的外发电子邮件也会被垃圾邮件过滤器拦截。

重点是,您的发送 IP 将位于 ISP 客户范围内,不会从您的 IP 反向查找到您的域名(除非您可以说服您的 4G 提供商进行此项设置)。根据我的经验,垃圾邮件过滤器会对您进行严厉惩罚,使此设置无法奏效。

后记

此外,不要低估您在接收端必须处理的垃圾邮件和黑客攻击的数量。它们每天会发出数千个 - 所有这些都会消耗您昂贵的 4G 数据。这绝对会是一次有趣的学习经历,但您需要时间。

答案2

具体来说,是基于策略的路由。是的,iptables和的组合ip route可以做到这一点。

  • 正确配置以太网 ( eth0) 和 USB 加密狗 ( enx344b50000000) 接口及其各自的 IP 地址。

  • 设置 IPTables 规则:用于iptables根据目标端口标记数据包。(即标记 SMTP 的流量:)

iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p tcp --dport 465 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p tcp --dport 587 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p tcp --dport 993 -j MARK --set-mark 1

这会将规则添加到 mangle 表中,将发往端口 25、465、587 和 993 的数据包标记为 1。

/etc/iproute2/rt_tables通过添加以下内容创建自定义路由表:

100 4g

这将创建一个名为 4g 的表,其任意 ID 为 100。

添加路由规则以指导标记的数据包使用 4g 表:

ip rule add fwmark 1 table 4g
ip route add default via <4G-Gateway-IP> dev enx344b50000000 table 4g

将 <4G-Gateway-IP> 替换为 USB 加密狗的实际网关 IP:

如果您的 4G ISP 没有直接在您的加密狗接口上为您提供公共 IP 地址,您可能需要为通过加密狗发出的流量设置源 NAT,以确保响应返回到正确的接口。这可以通过 nat 表中的 iptables 来完成:

iptables -t nat -A POSTROUTING -o enx344b50000000 -j MASQUERADE

正如您所说,您需要有两个 DNS A 记录:一个用于mail.mydomain.tld指向您的 4G 静态 IP,另一个用于mydomain.tld指向您的家庭 IP(通过 DDNS 更新)。

  • 确保您的ufw防火墙iptables规则允许两个接口所需端口上的传入连接。

  • 测试——您可以用它tcpdump来监控流量并确认它走的是正确的路径。

您可能需要一个启动脚本来确保规则一致地应用!


更新 1:

使用以下命令检查表 4g 中的默认路由-t

ip route show -t 4g

应该是这样的:

default via <4G-Gateway-IP> dev enx344b50000000 table 4g

ip route show不带选项的命令显示-t主路由表中的默认路由,通常是ID 254

169.254.0.0/16IP 是link-local当接口未配置静态 IP 地址时自动分配给接口的地址。它用于同一链路上的设备之间的通信,并且无法在互联网上路由。

系统上通常有多个网关。当有多个网关时,内核将使用度量值最低的默认网关。在您的例子中,接口上的默认网关enx344b50000000100,而wlp2s0界面600

当可用时,内核将使用enx...作为默认网关,当不可用时,将使用wlp2s0接口作为默认网关 。enx...

192.168.0.0/24192.168.193.0/24路由表中的条目显示您的系统配置了两个子网,192.168.0.0/24192.168.193.0/24,并且每个子网的默认网关是0.0.0.00.0.0.0, 分别。

以下是输出的细分(当然更有帮助):

default via 192.168.0.1 dev enx344b50000000 proto dhcp metric 100

这是默认路由,它指定发往路由表中未明确列出的任何 IP 地址的数据包应发送到网关192.168.0.1使用enx...接口。proto dhcp 指定路由是通过 DHCP 获得的。

default via 192.168.193.97 dev wlp2s0 proto dhcp metric 600

这是另一个默认路由,它指定发往路由表中未明确列出的任何 IP 地址的数据包应发送到网关192.168.193.97使用wlp2s0界面。

169.254.0.0/16 dev wlp2s0 scope link metric 1000

这是一条169.254.0.0/16subnet,即link-local分配给wlp2s0接口的子网。范围链接指定该路由仅与本地网段相关。

192.168.0.0/24 dev enx344b50000000 proto kernel scope link src 192.168.0.178 metric 100

这是一条192.168.0.0/24子网,分配给enx...接口。proto kernel 指定路由是通过内核获得的。src192.168.0.178指定通过此路由发送的数据包的源IP地址。

192.168.193.0/24 dev wlp2s0 proto kernel scope link src 192.168.193.131 metric 600

这是一条192.168.193.0/24子网,分配给wlp2s0。源192.168.193.131指定通过此路由发送的数据包的源IP地址。

这完全没问题,我的朋友。希望这能有所帮助!

笔记:您可能需要在服务器上进行 IP 转发,以允许流量在两个网络接口之间路由:

echo 1 > /proc/sys/net/ipv4/ip_forward

相关内容