我在第一台服务器上制定了这个 iptables 规则,该服务器充当客户端的角色,通过 LAN 适配器连接到第二台 mysql 服务器。
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:44135]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Feb 4 20:33:41 2015
# Generated by iptables-save v1.4.7 on Wed Feb 4 20:33:41 2015
*nat
:PREROUTING ACCEPT [76:10856]
:POSTROUTING ACCEPT [11:734]
:OUTPUT ACCEPT [11:734]
COMMIT
# Completed on Wed Feb 4 20:33:41 2015
# Generated by iptables-save v1.4.7 on Wed Feb 4 20:33:41 2015
*mangle
:PREROUTING ACCEPT [2739:2511918]
:INPUT ACCEPT [2739:2511918]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1913:165876]
:POSTROUTING ACCEPT [1913:165876]
COMMIT
发生的事情是,我一这样做:
service iptables restart
似乎所有与第二台服务器的 MYSQL 连接都正常工作,但只能持续一小段时间,通常是 1-2 分钟,但在这 1-2 分钟内,与 nginx(Web 服务器,80 端口)的连接不起作用。1-2 分钟后,Web 服务器工作正常,而 MYSQL 不工作。到目前为止也尝试过 iptables-save 命令,但没有任何变化。
这是第二个 mysql 服务器的防火墙配置:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2785:425650]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -d 192.168.1.1/32 -p tcp -m tcp --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i lo -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -p tcp -m tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
答案1
您应该设置默认策略,以防DROP
最后一条捕获所有规则被意外删除;就像这样:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1:44135]
现在,在第二台服务器上。
-A INPUT -d 192.168.1.1/32 -p tcp -m tcp --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
此规则匹配目标为 192.168.1.1、源端口从 1024 到 65535、目标端口 3306 且状态为新建或已建立的连接。您想得太多了;如果您想允许 MySQL 连接,只需匹配目标端口,并可选择添加源和/或接口参数(如果您想将其锁定到特定的源 IP 或接口)。
-A INPUT -i lo -p tcp -m tcp --dport 3306 -j ACCEPT
lo
已经具有访问权限,因为您的第一条-A INPUT -i lo -j ACCEPT
规则将匹配来自环回的任何内容。
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
好的,现在您允许整个子网,但是这已经更好了,它应该可以工作了。
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
与上述相同,无论如何已经允许环回。
-A INPUT -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT
现在您允许来自 eth1 且目标端口为 3306 的所有内容。
-A OUTPUT -p tcp -m tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
无论如何,您的输出策略是接受一切,这条规则毫无意义。
我很确定你的问题是因为状态模块已被弃用并且可能被删除,所以您应该使用 conntrack。
回顾:
第一台服务器:
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT
第二台服务器:
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth1 -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m conntrack --ctstate NEW -j ACCEPT
这将允许所有来自 eth1、192.168.1.0/24 的 SSH 连接和 MySQL 连接。您可以随意更改。