我正在运行 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
选项。