iptables:“脚本”方式还是“*过滤器,规则,提交”方式?

zeb*_*aut 7 debian iptables nat

我试图弄清楚 NAT 和 iptables 是如何工作的。当我处于学习它的反复试验阶段时,我发现了两个有点矛盾的方法。

一种方法是使用脚本iptables一个接一个地调用规则。该脚本似乎被命名和存储,以便它在系统启动期间尽早执行,我认为一个问题可能是其他脚本可能会在它之后调用并撤消其意图。我什至认为我在使用备份(00-firewall-old)保存并重命名原始脚本(00-firewall)时偶然做了一次。Howto 的示例脚本是:

#!/bin/sh

PATH=/usr/sbin:/sbin:/bin:/usr/bin

#
# delete all existing rules.
#
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Always accept loopback traffic
iptables -A INPUT -i lo -j ACCEPT


# Allow established connections, and those not coming from the outside
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow outgoing connections from the LAN side.
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

# Masquerade.
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

# Don't forward from the outside to the inside.
iptables -A FORWARD -i eth1 -o eth1 -j REJECT

# Enable routing.
echo 1 > /proc/sys/net/ipv4/ip_forward
Run Code Online (Sandbox Code Playgroud)

另一个 howto不使用脚本,而是使用定义了一些过滤规则的文件。它看起来像这样:

*filter

# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

# Allows SSH connections 
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
-A INPUT -p tcp -m state --state NEW --dport 30000 -j ACCEPT

# Now you should read up on iptables rules and consider whether ssh access 
# for everyone is really desired. Most likely you will only allow access from certain IPs.

# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# log iptables denied calls (access via 'dmesg' command)
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Reject all other inbound - default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT
Run Code Online (Sandbox Code Playgroud)

两种设置iptables的方式各有什么优缺点?非常感谢背景信息,因为我对整个事情还很陌生。例如,我不知道谁在从后者的 howto 中读取文件,以及它是如何处理的。我的感觉告诉我第二个 howto 建议了一个更好的解决方案,但究竟为什么呢?

Ale*_*ios 5

我过去使用过这两种技术。这些天,我倾向于两者的混合。

如果您的规则集有五个或六个简单的规则,那么任何一种方法都可以。当你有大的规则集时,事情开始变得有趣:大型​​安装,你的防火墙盒做了一些路由,等等。

请记住,无论您如何加载规则集,您都可以用脚射击自己。:)

基于脚本

你制作一个 bash 脚本、一个 Perl 脚本、一个 Python 脚本——见鬼,为所有关心的人写一个 Lisp 或Befunge程序!在脚本中,您可以创建所需的所有 Netfilter 规则。

优点:

  • 直接。您正在试验规则,您只需将那些在命令行中起作用的规则直接复制并粘贴到脚本中。
  • 动态防火墙。我的一个客户为他们自己的客户运行OpenVPN设置,出于安全、防火墙和会计原因,每个客户都有自己的 OpenVPN 实例。第一道防线防火墙需要为每个 (IP,port) 元组动态打开 OpenVPN 端口。因此,防火墙脚本解析 OpenVPN 配置的清单并动态戳出所需的漏洞。另一个将 Web 服务器详细信息存储在 LDAP 上;iptables 脚本查询 LDAP 服务器,并自动允许进入 Web 服务器。在大型安装中,这是一个巨大的福音。
  • 聪明。我的防火墙脚本允许远程管理,即使没有熄灯管理:加载规则集后,如果操作员在几分钟内没有响应,规则集将回滚到已知的最后一个工作。如果由于某种原因失败了,则会出现第三次(和第四次)降低安全性的故障回复。
  • 更聪明的是:您可以在脚本开头打开对网络块的 SSH 访问,然后在脚本末尾取消它(并让过滤的 SSH 会话进入)。因此,如果您的脚本失败,您仍然可以进入。
  • 在线示例。出于某种原因,我在网上看到的大多数示例都使用了 的调用iptables(这可能受到我的前几个防火墙设置早于iptables-save以及 Netfilter的事实的影响——但那是另一回事了)

缺点:

  • 脚本中有一处语法错误,您就会被防火墙锁定。上面的一些聪明可以归结为痛苦的经历。:)
  • 速度。在嵌入式 Linux boxen 上,bash(甚至 dash)脚本运行起来会很慢很慢。速度足够慢,根据您的安全策略,您可能需要考虑规则添加的顺序——您的防御可能会有一个短暂的漏洞,这就足够了。规则集装是无处附近的原子。
  • 复杂。是的,您可以做出惊人的事情,但是是的,您也可以使脚本过于复杂而无法理解或维护。

基于规则集

将您的规则添加到规则集文件,然后使用iptables-restore加载它(或仅使用 保存您现有的规则集iptables-save)。这是 Debian 默认所做的。

优点:

  • 速度。iptables-restore是一个 C 程序,与 shell 脚本相比,它的速度非常快。即使在体面的机器上,差异也很明显,但在更普通的硬件上,它的速度要快几个数量级
  • 规律性。格式更容易理解,它本质上是自我记录的(一旦你习惯了 Netfilter 的特性)。
  • 这是标准工具,如果你关心的话。
  • 它保存所有的 Netfilter 表。太多的 Netfilter 工具(包括iptables)只能在filter桌面上运行,您可能会忘记您可以使用其他工具(其中可能包含有害规则)。这样,您就可以看到所有表。

缺点:

  • 缺乏灵活性。
  • 由于缺乏模板/参数化/动态特性,重复会导致规则集的可维护性降低,并导致巨大的规则集错误。你不想要那些。

混合解决方案——两全其美

我已经在我丰富的空闲时间开发了一段时间。我计划使用我现在拥有的相同的基于脚本的设置,但是一旦规则集被加载,它就会保存它,iptables-save然后缓存它以备后用。您可以拥有一个具有所有优点的动态规则集,但它可以非常快速地加载,例如,防火墙框重新启动。