我有一台托管在数据中心的机器,有 3 个网络接口。
Interface network ip address
eth0 192.168.1.0/24 192.168.1.10
eth1 192.168.2.0/24 192.168.2.10
eth2 192.168.3.0/24 192.168.3.10
我的默认网关设置为192.168.2.1,我可以在其中访问数据中心提供的一些服务(存储库、ntp等)。
网络192.168.1.0/24有一个网关192.168.1.1,通过它我可以访问龙居住的外部世界。当我需要离开我的服务器时,我只需添加一个静态路由。我有点喜欢这个设置,因为我知道我的服务器连接到哪里。
现在,我有一个邮件客户端(exim4),它需要向任何人发送邮件。因此理想情况下需要将默认网关设置为 192.168.1.1。有没有办法只路由此特定服务的流量,或者我应该简单地更改服务器上的网络配置?
我使用的是 Debian 8,如果这有什么区别的话。
答案1
您可以将防火墙 (iptables) 设置为根据 3 个特征之一路由到特定网关:目标端口、源端口或所有者(可能不起作用,请参见下文)
首先,您将为您的特殊应用程序添加一个自定义路由表(网关 192.168.1.1),创建一个规则,将所有带有掩码的包重定向1
到该表,并创建一个 iptables 规则,在包被重定向时伪装源地址:
ip route add 192.168.1.0/24 dev eth0 table 1
ip route add 0/0 via 192.168.1.1 table 1
ip rule add fwmark 1 table 1
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.10
对于包装标记,您有 3 个选项:
按目标端口重定向,将 PORT 与 exim 使用的服务器端口一起计费:
iptables -t mangle -A OUTPUT -p tcp --dport PORT -j MARK --set-mark 4
按源端口重定向,如果仅使用一个源端口,则使用 exim 本地使用的端口对 PORT 进行计费:
iptables -t mangle -A OUTPUT -p tcp --sport PORT -j MARK --set-mark 4
按所有者重定向,使用 Exim 进程中的 PID 更改 OWNER(请参阅 参考资料 中iptables -m owner --help
的其他选项):
iptables -t mangle -A OUTPUT -m owner --pid-owner OWNER -j MARK --set-mark 4
按所有者考虑重定向www.frozentux.net:
The pid, sid and command matching is broken in SMP kernels since they use different process lists for each processor. It might be fixed in the future however
因此,根据您的内核,此功能不可用或已损坏(将无法正常工作)