我正在尝试将发送到服务器私有接口的流量通过 NAT 发送到环回(因为 MySQLbind-address
已打开127.0.0.1
并且无法更改,但我仍然需要通过私有接口访问它)。
配置
-mysql bind-address
= 127.0.0.1
-启用 ip 转发,使用sysctl -w net.ipv4.ip_forward=1
-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
为所拥有的 IP时,我就可以连接。 3306
bind-address
eth0
问题
使用bind-address
localhost 和上述 iptables 规则,我无法连接到 拥有的 IP eth0
:3306
如果我运行,tcpdump -ni any port 3306
我可以看到SYN
后跟 ,RST
但我现在不知道它RST
来自哪里,因为我希望SYN
将 转发到 ,lo
并且 ip127.0.0.1
同时作为源和目标。
问:我在 NATeth0
到lo
端口时遗漏了什么3306
?
附加信息:ubuntu server 10.04
运行iptables v1.4.4
使用用例更新问题
要求:
-我们有几个盒子许多服务(jetty、tomcat、ldap、mysql)在本地主机上运行
-这些服务需要仅在本地主机上运行并且不需要在公共接口上访问。
-然而我们希望我们的外部Nagios 服务器通过私有接口检查它们
-我们不想配置这些服务到监听公共接口为了安全原因Defense in depth
(尽管我们可以在公共接口上阻止它们,但我们认为,如果防火墙出现问题,这些服务最好不要在公共 IP 上监听)
-配置这些服务来监听环回和私有接口是不可能的,或者更难实现。
好处
使用从私有接口到内部接口的 NAT 可以带来以下好处:
-更容易实施:我们不必重新配置现有服务
-减少维护:如果添加了新的服务来监听环回,我们只需要添加 iptable 规则,而不必重新配置这些服务
-更安全:如果我们的防火墙出现故障,最糟糕的情况是我们将失去对这些服务的监控,但它们不会暴露给公共界面。
答案1
您无法对 127.0.0.1 进行 nat,因为它是超级特殊的保留网络。您最好将绑定地址设置为 0.0.0.0,然后使用 iptables 过滤您不想允许流量的 IP/接口。
答案2
尝试删除此规则:
-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