我正在尝试在我的 ubuntu 12.04 服务器机器上打开端口 3306(用于远程 mysql 连接),但是我无论如何也无法让这个该死的东西工作!
这是我所做的:
1)列出当前防火墙规则:
$> sudo iptables -nL -v
output:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
225 16984 fail2ban-ssh tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 22
220 69605 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 REJECT all -- lo * 0.0.0.0/0 127.0.0.0/8 reject-with icmp-port-unreachable
486 54824 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
1 60 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
19 988 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
1 52 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
4 208 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 5/min burst 5 LOG flags 0 level 7 prefix "iptables denied: "
4 208 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
735 182K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain fail2ban-ssh (1 references)
pkts bytes target prot opt in out source destination
225 16984 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
2)尝试从远程机器连接:
$> mysql -u root -p -h x.x.x.x
output:
timeout.... failed to connect
3)尝试向iptables添加新规则:
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
4)确保新规则已添加:
$> sudo iptables -nL -v
output:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
359 25972 fail2ban-ssh tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 22
251 78665 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 REJECT all -- lo * 0.0.0.0/0 127.0.0.0/8 reject-with icmp-port-unreachable
628 64420 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
1 60 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
19 988 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
1 52 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
5 260 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 5/min burst 5 LOG flags 0 level 7 prefix "iptables denied: "
5 260 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
919 213K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain fail2ban-ssh (1 references)
pkts bytes target prot opt in out source destination
359 25972 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
看起来确实如此(“Chain INPUT”部分的最后一行)。
5)尝试从远程机器再次连接:
$> mysql -u root -p -h x.x.x.x
output:
timeout.... failed to connect
但又失败了。
6)尝试刷新所有规则:
$> sudo iptables -F
7)这次我可以连接了。
8)重新启动服务器并尝试连接,失败。
我怀疑由于新规则被附加在最后,所以它不会产生任何效果,因为在它之前似乎有一个“全部拒绝”类型的规则。如果是这样,如何确保新规则以正确的顺序添加?否则,我遗漏了什么?
请帮忙。
答案1
是的,您的问题与规则顺序有关。最后一条规则不会产生任何影响,因为它前面是拒绝所有规则。
您需要删除最后一条规则或在它之前插入新规则。不需要添加拒绝所有规则。您只需要将INPUT
chain 的默认策略更改为DROP
拒绝任何未明确允许的流量。
要在链中插入规则,请使用-I
选项,而不是-A
附加。您可以查看man iptables
更多详细信息。
答案2
“8)重启服务器并尝试连接,失败”
这表明你的更新不是持久的。你可以使用 来解决这个问题iptables-restore
。
1)sudo vi /etc/iptables.firewall.rules
2)插入mySql规则:
# Allow MySQL connections from anywhere.
-A INPUT -p tcp --dport 3306 -j ACCEPT
3)保存文件并重新加载规则:
sudo iptables-restore < /etc/iptables.firewall.rules
4)激活新规则
sudo iptables -L