16 个 iptables 技巧和窍门,献给系统管理员

Iptables 提供了强大的功能来控制进出系统的流量。
297 位读者喜欢这个。
Command line prompt

Opensource.com

现代 Linux 内核带有一个名为 Netfilter 的数据包过滤框架。Netfilter 使您可以允许、丢弃和修改进出系统的流量。 iptables 用户空间命令行工具基于此功能构建,提供了一个强大的防火墙,您可以通过添加规则来配置它,形成一个防火墙策略。iptables 具有丰富的功能和复杂的命令语法,可能会让人望而却步。 让我们探索其中的一些功能,并为系统管理员可能遇到的许多情况开发一组 iptables 技巧和窍门。

避免将自己锁定在外面

场景:您将要更改公司主服务器上的 iptables 策略规则。 您想避免将自己(以及可能所有人)锁定在外面。 (这会花费时间和金钱,并导致您的电话响个不停。)

技巧 #1:在开始处理 iptables 配置之前,对其进行备份。

使用以下命令备份您的配置

/sbin/iptables-save > /root/iptables-works

技巧 #2:更好的是,在文件名中包含时间戳。

使用以下命令添加时间戳

/sbin/iptables-save > /root/iptables-works-`date +%F`

您将获得一个类似名称的文件

/root/iptables-works-2018-09-11

如果您执行某些操作导致系统无法工作,您可以快速恢复它

/sbin/iptables-restore < /root/iptables-works-2018-09-11
ln –s /root/iptables-works-`date +%F` /root/iptables-works-latest

技巧 #4:将特定规则放在策略的顶部,将通用规则放在底部。

避免在策略规则的顶部使用这样的通用规则

iptables -A INPUT -p tcp --dport 22 -j DROP

您在规则中指定的条件越多,将自己锁定的机会就越小。 不要使用上面非常通用的规则,而是使用类似这样的规则

iptables -A INPUT -p tcp --dport 22 –s 10.0.0.0/8 –d 192.168.100.101 -j DROP

此规则将附加 (-A) 到 INPUT 链的规则,该规则将 DROP 来自 CIDR 块 10.0.0.0/8 上的 TCP (-p tcp) 端口 22 (--dport 22) 并发往 IP 地址 192.168.100.101 (-d 192.168.100.101) 的任何数据包。

有很多方法可以使您更加具体。 例如,使用 -i eth0 将限制处理为服务器中的单个 NIC。 这样,过滤操作将不会将该规则应用于 eth1

技巧 #5:将您的 IP 地址列入策略规则的顶部白名单。

这是避免将自己锁定在外面的一种非常有效的方法。 对于其他人,则不然。

iptables -I INPUT -s <your IP> -j ACCEPT

您需要将其作为第一条规则才能正常工作。 请记住,-I 将其作为第一条规则插入; -A 将其附加到列表末尾。

技巧 #6:了解并理解当前策略中的所有规则。

首先避免犯错是成功的一半。 如果您了解 iptables 策略背后的内部运作,它将使您的生活更轻松。 如果必须,请绘制流程图。 还要记住:策略的作用和策略应该做的事情可能是两回事。

设置工作站防火墙策略

场景:您想使用限制性防火墙策略设置工作站。

技巧 #1:将默认策略设置为 DROP。

# Set a default policy of DROP
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

技巧 #2:允许用户完成工作所需的最少服务量。

iptables 规则需要允许工作站通过 DHCP (-p udp --dport 67:68 --sport 67:68) 获取 IP 地址、网络掩码和其他重要信息。 对于远程管理,规则需要允许入站 SSH (--dport 22)、出站邮件 (--dport 25)、DNS (--dport 53)、出站 ping (-p icmp)、网络时间协议 (--dport 123 --sport 123) 以及出站 HTTP (--dport 80) 和 HTTPS (--dport 443)。

# Set a default policy of DROP
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

# Accept any related or established connections
-I INPUT  1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-I OUTPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Allow all traffic on the loopback interface
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

# Allow outbound DHCP request
-A OUTPUT –o eth0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT

# Allow inbound SSH
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW  -j ACCEPT

# Allow outbound email
-A OUTPUT -i eth0 -p tcp -m tcp --dport 25 -m state --state NEW  -j ACCEPT

# Outbound DNS lookups
-A OUTPUT -o eth0 -p udp -m udp --dport 53 -j ACCEPT

# Outbound PING requests
-A OUTPUT –o eth0 -p icmp -j ACCEPT

# Outbound Network Time Protocol (NTP) requests
-A OUTPUT –o eth0 -p udp --dport 123 --sport 123 -j ACCEPT

# Outbound HTTP
-A OUTPUT -o eth0 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT

COMMIT

限制 IP 地址范围

场景:您公司的 CEO 认为员工在 Facebook 上花费了太多时间,而没有完成任何工作。 CEO 告诉 CIO 对员工在 Facebook 上浪费时间采取一些措施。 CIO 告诉 CISO 对员工在 Facebook 上浪费时间采取一些措施。 最终,被告知员工在 Facebook 上浪费了太多时间,您必须对此采取一些措施。 您决定阻止对 Facebook 的所有访问。 首先,使用 hostwhois 命令找出 Facebook 的 IP 地址。

host -t a www.facebook.com
www.facebook.com is an alias for star.c10r.facebook.com.
star.c10r.facebook.com has address 31.13.65.17
whois 31.13.65.17 | grep inetnum
inetnum:        31.13.64.0 - 31.13.127.255

然后使用 CIDR 到 IPv4 转换页面将该范围转换为 CIDR 表示法。 您得到 31.13.64.0/18。 要阻止对 www.facebook.com 的传出访问,请输入

iptables -A OUTPUT -p tcp -i eth0 –o eth1 –d 31.13.64.0/18 -j DROP

按时间调节

场景:公司员工对拒绝访问 Facebook 的强烈反对导致 CEO 稍微让步(以及他的行政助理提醒他,她一直在更新他的 Facebook 页面)。 CEO 决定仅在午餐时间(中午 12 点到下午 1 点)允许访问 Facebook.com。 假设默认策略为 DROP,请使用 iptables 的时间功能打开访问权限。

iptables –A OUTPUT -p tcp -m multiport --dport http,https -i eth0 -o eth1 -m time --timestart 12:00 --timestart 12:00 –timestop 13:00 –d 
31.13.64.0/18  -j ACCEPT

此命令将策略设置为允许 (-j ACCEPT) http 和 https (-m multiport --dport http,https) 在中午 (--timestart 12:00) 和下午 13 点 (--timestop 13:00) 之间访问 Facebook.com (–d 31.13.64.0/18)。

按时间调节—第二次尝试

场景:在计划的系统维护停机期间,您需要拒绝凌晨 2 点到凌晨 3 点之间的所有 TCP 和 UDP 流量,以便维护任务不会被传入流量中断。 这将需要两条 iptables 规则

iptables -A INPUT -p tcp -m time --timestart 02:00 --timestop 03:00 -j DROP 
iptables -A INPUT -p udp -m time --timestart 02:00 --timestop 03:00 -j DROP

使用这些规则,在凌晨 2 点 (--timestart 02:00) 和凌晨 3 点 (--timestop 03:00) 之间的输入 (-A INPUT) 上,TCP 和 UDP 流量 (-p tcp 和 -p udp) 被拒绝 (-j DROP)。

使用 iptables 限制连接

场景:您的互联网连接的 Web 服务器正在受到来自世界各地的恶意行为者的攻击,他们试图对它们进行 DoS(拒绝服务)攻击。 为了缓解这些攻击,您限制单个 IP 地址可以连接到您的 Web 服务器的连接数

iptables –A INPUT –p tcp –syn -m multiport -–dport http,https –m connlimit -–connlimit-above 20 –j REJECT -–reject-with-tcp-reset

让我们看看此规则的作用。 如果主机在一分钟内对 Web 服务器 (-–dport http,https) 建立超过 20 个 (-–connlimit-above 20) 新连接 (–p tcp –syn),则拒绝新连接 (–j REJECT) 并告诉连接主机您正在拒绝连接 (-–reject-with-tcp-reset)。

监控 iptables 规则

场景:由于 iptables 在数据包遍历链中的规则时基于“先匹配者获胜”的原则运行,因此频繁匹配的规则应靠近策略的顶部,而不太频繁匹配的规则应靠近底部。 您如何知道哪些规则遍历最多或最少,以便将它们更靠近顶部或底部排序?

技巧 #1:查看每个规则被命中的次数。

使用此命令

iptables -L -v -n –line-numbers

该命令将列出链中的所有规则 (-L)。 由于未指定任何链,因此将列出所有链,并显示详细输出 (-v),以数字格式显示数据包和字节计数器 (-n),并在每个规则的开头显示行号,该行号对应于该规则在链中的位置。

使用数据包和字节计数,您可以将最常遍历的规则排序到顶部,并将最不常遍历的规则排序到底部。

技巧 #2:删除不必要的规则。

哪些规则根本没有得到任何匹配? 这些规则是从策略中删除的不错选择。 您可以使用以下命令找出这一点

iptables -nvL | grep -v "0     0"

注意:zeros 之间没有制表符; zeros 之间有五个空格。

技巧 #3:监控正在发生的事情。

您想像使用 top 一样实时监控 iptables 中发生的事情。 使用以下命令动态监控 iptables 活动,并仅显示正在主动遍历的规则

watch --interval=5 'iptables -nvL | grep -v "0     0"'

watch 每五秒运行一次 'iptables -nvL | grep -v "0     0"' 并显示其输出的第一个屏幕。 这使您可以随着时间的推移观察数据包和字节计数的变化。

报告 iptables

场景:您的经理认为这个 iptables 防火墙的东西很棒,但每日活动报告会更好。 有时,编写报告比完成工作更重要。

使用数据包过滤器/防火墙/IDS 日志分析器 FWLogwatch 来创建基于 iptables 防火墙日志的报告。 FWLogwatch 支持多种日志格式并提供许多分析选项。 它会生成日志文件的每日和每月摘要,使安全管理员可以释放大量时间,更好地控制网络安全,并减少未被注意到的攻击。

这是 FWLogwatch 的示例输出

FWLogwatch output

不仅仅是 ACCEPT 和 DROP

我们介绍了 iptables 的许多方面,从确保您在使用 iptables 时不会将自己锁定在外面,到监控 iptables,再到可视化 iptables 防火墙的活动。 这些将使您开始朝着实现更多 iptables 技巧和窍门的方向前进。

User profile image.
Gary 的职业生涯始于化学家/材料工程师。

2 条评论

您确实需要使用 iptables 覆盖 ipset,因为它对于 IP 地址列表来说效率更高。

iptables 应该更加强调,因为这是锁定系统和流量的解决方案。 需要改变策略。

© . All rights reserved.