iptables不允许mysql连接到别名的ips?


10

我在提供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 

有任何想法吗?提前致谢。:-)


1
不要在.184 or .196 hosts客户端主机也有你的其他子网的其他IP地址?如果执行a tcpdump -qn port 3306并尝试从其中一个系统连接,您会看到什么?您看到期望的源地址了吗?
Zoredache 2012年

1
谢谢Zordache!那解决了。.251主机没有从其他子网分配任何IP。另外两个主机(.184和.196)都这样做,因此当它们连接到另一个子网中的IP时,这些主机上的源IP会切换到同一子网中的IP。我以为传出/源IP始终是默认分配的IP。但是,tcpdump清楚地表明,只要源IP连接到同一子网中的IP,它就会更改为209.xxx.xxx.xxx子网。(但是,必须从物理Proxmox主机运行tcpdump。)您太聪明了。谢谢!
Curtis 2012年

Answers:


8

.184或.196主机客户端主机在其他子网中是否还有其他IP地址?

如果执行a tcpdump -qn port 3306并尝试从其中一个系统连接,您会看到什么?您看到期望的源地址了吗?这可能是一个简单的路由问题。

系统在做出路由决策时,会查询路由表。路由表是一个始终按特定顺序进行查询的列表。本地网络的链接路由几乎总是最喜欢的路由,并且将在使用网关(路由器)的路由之前使用。默认网关始终是没有其他路由适用时使用的路由。如果给定路由已src定义一条路由,则该地址将是首选地址,并且在使用该路由时最有可能使用该地址。

10.2.13.0/24 dev eth1  proto kernel  scope link  src 10.2.13.1 
10.2.4.0/23 dev eth0  proto kernel  scope link  src 10.2.4.245 
default via 10.2.4.1 dev eth0 

因此,在给出用于多宿主系统的路由表示例的情况下,任何要发往的东西都10.2.13.0/24将来自10.2.13.1,而任何发往10.2.4.0/23此地的东西都将来自10.2.4.245

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.