问题NATing服务器专用接口回环(用于MySQL)

我试图将NATstream量发送到服务器的专用接口到环回(因为MySQL bind-address是在127.0.0.1 ,不能改变,但我仍然需要通过专用接口达到它)。

组态
mysql bind-address = 127.0.0.1
使用sysctl -w net.ipv4.ip_forward=1启用IP转发
-setup iptables如下( eth0是私有接口)

 -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -i eth0 -p tcp --dport 3306 -j ACCEPT -A INPUT -i lo --jump ACCEPT -A INPUT --match state --state ESTABLISHED,RELATED --jump ACCEPT -t nat -A PREROUTING -i eth0 -p tcp --port 3306 -j DNAT --to-destination 127.0.0.1 -t nat -A POSTROUTING -o lo -j SNAT --to-source 127.0.0.1 

考证
– 的MySQL绑定是可以的( telnet 127.0.0.1 3306工作正常)
-ip转发正常启用( sysctl net.ipv4.ip_forward给1)
– 连接到eth03306是好的,因为当我将bind-address设置为eth0所拥有的IP时,我可以连接。

问题
使用本地主机上的bind-address和上面的iptables规则,我无法连接到3306上的eth0所拥有的IP:如果我运行tcpdump -ni any port 3306我可以看到SYN后面跟着一个RST但我现在已经知道在哪里RST来自于我期望的SYN将被转发到IP与IP 127.0.0.1作为源和目的地。

问:我错过了NAT eth0到端口3306

附加信息:运行ubuntu server 10.04iptables v1.4.4

用用例更新了问题

要求:
– 我们有几个箱子有本地主机上运行的许多服务(jetty,tomcat,ldap,mysql)

– 这些服务只需要在本地主机运行,不需要在公共接口上访问。

但是,我们希望我们的外部Nagios服务器通过专用接口来检查它们

– 我们不希望为了安全原因而将这些服务configuration为在公共接口上进行监听 (尽pipe我们可以在公共接口上阻止他们,但是我们认为对于那些不听公共接口的服务应该更好(即Defense in depth )防火墙出现问题)

– configuration这些服务来监听环回和私有接口是不可能的,或者更难以实现。

优点

使用从私有到内部接口的NAT将提供以下好处:

更容易的实现:我们不必重新configuration现有的服务

减less维护:如果添加了新的服务来监听环回,我们只需要添加iptable规则,而不必重新configuration这些服务

更安全:如果我们的固件发生故障,更糟的情况是我们放弃了对这些服务的监控,但是他们没有暴露在公共接口中。

你不能nat 127.0.0.1这是一个超特殊的保留networking。 你可能会更好的设置绑定地址为0.0.0.0,然后使用iptables来过滤你不想让stream量的IP /接口。

尝试删除这条规则:

 -t nat -A POSTROUTING -o lo -j SNAT --to-source 127.0.0.1 

我必须完全撤回我的答案。 来自Linux外的数据包不允许去127.0.0.1。 看到下面的电子邮件(和之前的):

http://lists.netfilter.org/pipermail/netfilter/2004-August/055117.html