我的笔记本电脑上安装了 Ubuntu 12.04 x64。
我对 Linux 还很陌生,我想为 iptables 防火墙指定某些规则。
这是我的 iptables 的已保存配置:
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 3306 -j DNAT --to-destination 192.168.1.100:3306
-A PREROUTING -p tcp -m tcp --dport 11002 -j DNAT --to-destination 192.168.1.100:11002
-A PREROUTING -p tcp -m tcp --dport 13000 -j DNAT --to-destination 192.168.1.100:13000
-A PREROUTING -p tcp -m tcp --dport 13001 -j DNAT --to-destination 192.168.1.100:13001
-A PREROUTING -p tcp -m tcp --dport 13002 -j DNAT --to-destination 192.168.1.100:13002
-A PREROUTING -p tcp -m tcp --dport 13003 -j DNAT --to-destination 192.168.1.100:13003
-A PREROUTING -p tcp -m tcp --dport 13004 -j DNAT --to-destination 192.168.1.100:13004
-A PREROUTING -p tcp -m tcp --dport 13061 -j DNAT --to-destination 192.168.1.100:13061
-A PREROUTING -p tcp -m tcp --dport 13099 -j DNAT --to-destination 192.168.1.100:13099
-A POSTROUTING -j MASQUERADE
COMMIT
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
COMMIT
理论上,它的作用是丢弃除 http、mysql 和其他几个端口之外的所有端口的所有连接。
而且,它将所有 mysql 和 13000-13004..等端口连接重定向到同一端口的特定本地 ip,即 192.168.1.100。
但奇怪的是,当我的防火墙处于活动状态时,它会完全阻止所有输入连接,甚至那些不应该阻止的连接(http,mysql)。事实上,我确实被阻止了,无法建立任何外部连接。
我究竟做错了什么?
附言:我测试了没有这些重定向的防火墙,它仍然阻止所有输入,所以我认为这不是问题。
答案1
首先,您需要检查您的系统是否允许转发数据包:
cat /proc/sys/net/ipv4/ip_forward
或者
sysctl ipv4_forward
其值应为“1”。如果不是(sudo 或作为 root):
echo '1' > /proc/sys/net/ipv4/ip_forward
要使更改永久生效,您可以取消注释net.ipv4.ip_forward=1
。/etc/sysctl.conf
完成此操作后,您可以进一步测试您的 iptables 设置(我假设在进行微小更改后它将正常工作 ;-))。由于您说您是新手,因此我已在每个规则下放置了规则描述,希望您能理解。
iptables -P INPUT DROP
iptables -A OUTPUT ACCEPT
iptables -A FORWARD ACCEPT
这将丢弃除符合所定义规则的流量之外的所有流量。-P INPUT DROP 可以作为第一条规则,而 -A INPUT DROP 必须是最后一条规则。接下来的 2 条规则将允许传出连接和转发。
iptables -A INPUT -i lo -j ACCEPT
允许环回(127.0.0.1)流量
iptables -A INPUT -m state --state RELEATED,ESTABLISHED -j ACCEPT
这将允许所有状态为 RELATED(FTP 的新辅助连接)或 ESTABLISHED(此连接的数据包已在两个方向上看到 HTTP 流量)的数据包。
iptables -t nat -A POSTROUTING -o ethx -j MASQUERADE
nat 因为您可能正在使用 natting,伪装从接口传出的数据包ethx
。Fe:WAN 端在 eth1 上,lan 在 eth0 上,因此 ethx 将是 eth0。这是在 POSTROUTING 上。
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to-destination 192.168.1.100:3306
这才是真正的转发。
所以基本上您的 iptables 规则没有问题,您可能只是忘记了 ip_forward 设置。