AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 402167
Accepted
Curtis
Curtis
Asked: 2012-06-26 15:06:47 +0800 CST2012-06-26 15:06:47 +0800 CST 2012-06-26 15:06:47 +0800 CST

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

  • 772

我在提供 MySQL 服务的服务器上有一个相当简单的 iptables 防火墙,但 iptables 似乎给我非常不一致的结果。

脚本的默认策略如下:

iptables -P INPUT DROP

然后我可以使用以下规则公开 MySQL:

iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

有了这个规则,我可以毫无问题地从任何源 IP 连接到服务器上的任何目标 IP 的 MySQL。但是,当我尝试通过将上面的行替换为以下内容来限制对三个 IP 的访问时,我遇到了麻烦(xxx=masked octect):

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 服务器即可。

  • 当我来自 .184 或 .196 主机时,我无法使用从与服务器默认 IP 不同的子网分配给服务器的 IP 别名连接到 MySQL,但 .251 工作正常。从 .184 或 .196 主机,telnet 尝试只是挂起...

    # telnet 209.xxx.xxx.22 3306
    Trying 209.xxx.xxx.22...
    
  • 如果我删除 .251 行(使 .196 成为最后添加的规则),.196 主机仍然无法使用 IP 别名连接到 MySQL(因此导致不一致行为的不是规则的顺序)。我知道,这个特定的测试很愚蠢,因为这三个规则的添加顺序无关紧要,但我想有人可能会问。

  • 如果我切换回“公共”规则,所有主机都可以使用默认或别名 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 

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

mysql iptables ip-aliasing
  • 1 1 个回答
  • 735 Views

1 个回答

  • Voted
  1. Best Answer
    Zoredache
    2012-06-26T16:27:49+08:002012-06-26T16:27:49+08:00

    .184 或 .196 主机客户端主机在您的另一个子网中是否也有其他 IP 地址?

    如果您执行 atcpdump -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。

    • 8

相关问题

  • 开源与专有关系 db mgt 系统的优缺点是什么?

  • 在 solaris 10 上为 mysql 设置 max_allowed_pa​​cket

  • 如何移动 MySQL 的数据目录?

  • 通过 VPN 连接什么是远程服务器 IP?

  • mysql崩溃

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve