iptables 阻止与 mongodb 的本地连接

iptables 阻止与 mongodb 的本地连接

我有一台装有 mongodb (2.0.4) 的虚拟机 (Ubuntu 12.04.4 LTS),我想使用 iptables 将其限制为仅接受 SSH (进/出),不接受其他任何内容。我的设置脚本如下所示,用于设置规则:

#!/bin/sh

# DROP everything
iptables -F
iptables -X
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# input
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -j ACCEPT  # accept all ports for local conns

# output
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT  # ssh

但是激活这些规则后,我无法本地连接到 mongodb。

ubuntu ~ $ mongo
MongoDB shell version: 2.0.4
connecting to: test
Fri Mar 28 09:40:40 Error: couldn't connect to server 127.0.0.1 shell/mongo.js:84
exception: connect failed

没有它们,它也能正常工作。部署 mongodb 时是否需要考虑任何特殊的防火墙情况?

我尝试安装 mysql,它完美地适用于本地连接。SSH 工作正常(可以从外部和内部连接)。

一旦设置好,iptables 规则如下所示:

ubuntu ~ $ sudo iptables -nvL
Chain INPUT (policy DROP 8 packets, 1015 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  449  108K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  *      *       127.0.0.1            0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
   32  2048 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 27 packets, 6712 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  379  175K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22

我确实注意到,如果我为 mongodb 端口 27017(tcp,允许所有目的地)添加 OUTPUT 规则,它就会起作用。所以我猜这与输出有关?但是,为什么 mongodb 不允许接受由于主机传出的流量而产生的本地连接?!

答案1

连接由源 IP:Port 和目标 IP:Port 组成。来自源 IP:Port 的数据包必须遍历 OUTPUT 链。即使您连接到环回接口,也会发生这种情况,因此您发现需要允许到 127.0.0.1 的传出连接。

不阻塞环回接口是正常的,因为许多服务都会使用它,而这样做可能会导致问题。

相关内容