虚拟网络接口和 NAT 禁用 MySQL 和 Apache 的本地主机访问

虚拟网络接口和 NAT 禁用 MySQL 和 Apache 的本地主机访问

我正在运行 Ubuntu Server 12.04,最近我将其配置为为我的笔记本电脑执行 NAT。由于服务器只有一个 NIC,我按照在线说明创建了一个具有 LAN IP 地址的虚拟网络设备 (eth0:0),然后进一步配置了 iptables 和 UFW 以允许互联网共享。然而,就在几天前,我发现服务器上托管的一个 PHP 页面无缘无故地失败了。稍微挖掘一下,就会发现 MySQL 服务器开始拒绝来自本地主机的连接。同样的事情也发生在一个页面 (PhpMyAdmin) 上,该页面被配置为只能从本地主机访问(在 Apache2 中)。

错误如下$mysql --protocol=tcp -u root -p

ERROR 1130 (HY000): Host '<host name of eth0>' is not allowed to connect to this MySQL server

然而,有趣的是,我将 mysql 服务器配置为仅允许从 localhost 进行 root 访问。此外,mysql 服务器仅监听127.0.0.1:3306,如下所示:

sudo netstat -npa | head
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1029/mysqld

这意味着连接只能来自 127.0.0.1(请注意,MySQL 正在运行,因为我仍然可以通过 unix 域套接字连接到它)

实际上,似乎所有从 127.0.0.1 到 127.0.0.1 的 tcp 连接对于任何本地守护进程来说都似乎来自 eth0 IP 地址。事实上,在我添加 后,apache2 允许我访问 PhpMyAdmin allow <eth0 IP address>

以下是我的网络配置(已删除):

在 /etc/hosts 中:

127.0.0.1       localhost
211.x.x.x   <host name of eth0>      <server name>
#IPv6 Defaults follows ....

在 /etc/网络/接口:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 211.x.x.x
netmask 255.255.255.0
gateway 211.x.x.x
dns-nameservers 8.8.8.8
# dns-* options are implemented by the resolvconf package, if installed
dns-search xxxxxxx.com
hwaddress ether xx:xx:xx:xx:xx:xx

auto eth0:0
iface eth0:0 inet static
address 192.168.57.254
netmask 255.255.254.0
broadcast 192.168.57.255
network 192.168.57.0

/etc/ufw/sysctl.conf:

#Uncommented the following lines
net/ipv4/ip_forward=1
net/ipv6/conf/default/forwarding=1

在 /etc/default/ufw 中:

DEFAULT_FORWARD_POLICY="ACCEPT" #Changed DROP to ACCEPT

/etc/init/internet-sharing.conf (我写的 upstart 脚本),部分启动前脚本:

iptables -A FORWARD -o eth0 -i eth0:0 -s 192.168.57.22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -t nat -j MASQUERADE

再次注意,我的问题是程序无法访问本地主机tcp 服务,来自服务器本身,并且该访问被阻止,因为服务具有访问控制,仅允许 127.0.0.1。我没有问题連接(与 TCP 连接一样)通过 tcp 连接到服务,即使服务只监听 127.0.0.1。我不是想要从另一台计算机连接到服务。

答案1

问题似乎出在第三个 iptables NAT 规则上。由于我没有为最后一个 POSTROUTING nat 规则指定过滤规则,它以某种方式匹配了 localhost 数据包,并将其源 IP 地址转换为该eth0地址。修复后的启动脚本如下所示:

iptables -A FORWARD -o eth0 -i eth0:0 -s 192.168.57.22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -s 192.168.57.22 -t nat -j MASQUERADE

注意附加-s 192.168.57.22选项。

相关内容