Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I'm running an Ubuntu Server 12.04, and recently I configured it to do NAT for my laptop. Since the server has only one NIC, I followed instructions online to create a virtual network device (eth0:0) that has a LAN IP address, then further configured iptables and UFW to allow internet sharing. However, just a few days ago, I discovered that one of the PHP pages hosted on the server failed for no apparent reason. A little digging revealed that the MySQL server started refusing connections from localhost. The same happened with a page (PhpMyAdmin) that was configured to be accessible only from localhost (in Apache2).

The error, as shown by $mysql --protocol=tcp -u root -p looks like

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

However, the funny thing is, I configured the mysql server to allow root access from localhost (only). Moreover, the mysql server listens only on 127.0.0.1:3306, as shown by:

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

which means that the connection could have only come from 127.0.0.1 (Note that MySQL is working because I can still connect to it via unix domain sockets)

In effect, it seems that all tcp connections originating from 127.0.0.1 to 127.0.0.1 appear to any local daemon to come from the eth0 IP address. Indeed, apache2 allowed me to access PhpMyAdmin after I added allow <eth0 IP address>.

The following are my network configurations (redacted):

/etc/hosts:

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

/etc/network/interfaces:

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 script I wrote), section pre-start script:

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

Note again that my problem here is that programs cannot access localhost tcp services, from the server itself, and that access is blocked because the services have access control allowing only 127.0.0.1. I have no problem connecting (as in TCP connections) to services via tcp, even if the services listen only on 127.0.0.1. I do NOT want to connect to the services from another computer.

share|improve this question

1 Answer 1

It appears that the problem is the third iptables NAT rule. Since I didn't specify and filtering rule for the final POSTROUTING nat rule, it somehow matched localhost packets, and translated their source IP addresses to the eth0 address. A fixed startup script is shown below:

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

Note the additional -s 192.168.57.22 option.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.