我有一台服务器处理多项服务。为了回答这个问题,假设其中一项服务是邮件。如果邮件中断,我想将其转发到另一台主机。我的网络如下所示:
-- Network 1 --
Box 1
eth1: 192.168.1.5
eth0: 10.10.10.3
-- Network 2 --
Box 2
eth0: 10.10.10.5
所以...传入的请求到达盒子 1 上 eth1 上的 192.168.1.5 地址。我不会停在那里,而是想通过 eth0 将它们转发到盒子 2 并让其处理。
我已经尝试过以下 iptables 规则:
iptables -t nat -A PREROUTING -p tcp -m tcp -d 192.168.1.5 --dport 25 -j DNAT --to-destination 10.10.10.5:25
iptables -A FORWARD -m state -p tcp -d 10.10.10.5 --dport 25 --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -p tcp -m tcp -s 10.10.10.5 --sport 25 -j SNAT --to-source 192.168.1.5
... 毫无效果。使用 tcpdump,我可以看到请求从第二个框进入,但请求计算机上没有任何反应。
请帮忙。谢谢!
答案1
如果您需要帮助,我建议您显示完整的 iptables 规则集。来自 tcpdump 的几个数据包也不会有什么坏处。
同时:
您是否启用了 IP 转发?请检查:
sysctl net.ipv4.conf.all.forwarding
设置:
sysctl net.ipv4.conf.all.forwarding=1
通过添加到 /etc/sysctl.conf(或者您的发行版所要求的位置)使其永久生效。
您还需要允许相反方向的转发,为 -s 10.10.10.5 和 -o eth1 添加转发规则(如果您没有这个,或者没有 catch-all/默认策略 ACCEPT):
iptables -A FORWARD -s 10.10.10.5 -o eth1 -j ACCEPT
答案2
最终使用 xinetd 来处理邮件。
service smtp
{
disable = no
socket_type = stream
wait = no
user = root
redirect = 10.10.10.5 25
log_on_failure += USERID
}
谢谢大家的帮助!
答案3
总体来说,有几点评论:
- 您可能希望匹配接口以及 tcp/ip 源/目标/端口
- 对于您要完成的任务,我不太确定 POSTROUTING/snat 规则是否必要。DNAT 在 POSTROUTING 之前已经转换了数据包的源地址。
您在客户端没有看到任何回复的一个可能原因可能是 Box 2 上的路由表。DNAT 不会重写源地址,为了使 DNAT 正常工作,Box 2 需要一条通过 Box 1 返回源的路由。如果这是“任意 IP 地址”,Box 2 将需要通过 Box 1 的默认路由,如果是特定网络,则通过 Box 1 返回到这些网络的路由即可。