我试图将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)
– 连接到eth0在3306是好的,因为当我将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.04与iptables 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