我在提供MySQL服务的服务器上有一个相当简单的iptables防火墙,但是iptables似乎给了我非常不一致的结果。
脚本的默认策略如下:
iptables -P INPUT DROP
然后,我可以使用以下规则将MySQL公开:
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
有了此规则,我就可以从服务器上的任何源IP到任何目标IP连接MySQL。但是,当我尝试通过将以下行替换为以下内容来限制仅对三个IP的访问时,我遇到了麻烦(xxx =屏蔽八进制):
iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.XXX.XXX.184 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.XXX.XXX.196 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.XXX.XXX.251 -j ACCEPT
一旦上述规则到位,就会发生以下情况:
我可以从.184,.196和.251主机连接到MySQL服务器,只要使用它的默认IP地址或与默认IP地址在同一子网中的IP别名连接到MySQL服务器即可。
我无法使用从不同的子网服务器的默认IP,当我从0.184或0.196主机来为服务器分配IP别名,但0.251的作品就好了连接到MySQL。从.184或.196主机,telnet尝试只是挂起...
# telnet 209.xxx.xxx.22 3306 Trying 209.xxx.xxx.22...
如果删除.251行(将.196作为最后添加的规则),. 196主机仍无法使用IP别名连接到MySQL(因此,导致不一致行为的不是规则顺序)。我知道,这个特殊的测试很愚蠢,因为这三个规则的添加顺序无关紧要,但是我认为有人可能会问。
如果我切换回“ public”规则,则所有主机都可以使用默认IP或别名IP(在任一子网中)连接到MySQL服务器:
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
服务器在CentOS 5.4 OpenVZ / Proxmox容器(2.6.32-4-pve)中运行。
并且,以防万一,您希望在iptables脚本的上下文中查看问题规则,这里是(xxx = masked octect):
# Flush old rules, old custom tables
/sbin/iptables --flush
/sbin/iptables --delete-chain
# Set default policies for all three default chains
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT ACCEPT
# Enable free use of loopback interfaces
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT
# All TCP sessions should begin with SYN
/sbin/iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# Accept inbound TCP packets (Do this *before* adding the 'blocked' chain)
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow the server's own IP to connect to itself
/sbin/iptables -A INPUT -i eth0 -s 208.xxx.xxx.178 -j ACCEPT
# Add the 'blocked' chain *after* we've accepted established/related connections
# so we remain efficient and only evaluate new/inbound connections
/sbin/iptables -N BLOCKED
/sbin/iptables -A INPUT -j BLOCKED
# Accept inbound ICMP messages
/sbin/iptables -A INPUT -p ICMP --icmp-type 8 -j ACCEPT
/sbin/iptables -A INPUT -p ICMP --icmp-type 11 -j ACCEPT
# ssh (private)
/sbin/iptables -A INPUT -p tcp --dport 22 -m state --state NEW -s xxx.xxx.xxx.xxx -j ACCEPT
# ftp (private)
/sbin/iptables -A INPUT -p tcp --dport 21 -m state --state NEW -s xxx.xxx.xxx.xxx -j ACCEPT
# www (public)
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# smtp (public)
/sbin/iptables -A INPUT -p tcp --dport 25 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 2525 -j ACCEPT
# pop (public)
/sbin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT
# mysql (private)
/sbin/iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.xxx.xxx.184 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.xxx.xxx.196 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.xxx.xxx.251 -j ACCEPT
有任何想法吗?提前致谢。:-)
.184 or .196 hosts
客户端主机也有你的其他子网的其他IP地址?如果执行atcpdump -qn port 3306
并尝试从其中一个系统连接,您会看到什么?您看到期望的源地址了吗?