发出 NATing 服务器私有接口到环回(用于 MySQL)

发出 NATing 服务器私有接口到环回(用于 MySQL)

我正在尝试将发送到服务器私有接口的流量通过 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时,我就可以连接。 3306bind-addresseth0

问题
使用bind-addresslocalhost 和上述 iptables 规则,我无法连接到 拥有的 IP eth03306如果我运行,tcpdump -ni any port 3306我可以看到SYN后跟 ,RST但我现在不知道它RST来自哪里,因为我希望SYN将 转发到 ,lo并且 ip127.0.0.1同时作为源和目标。

问:我在 NATeth0lo端口时遗漏了什么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

相关内容