Pages

Thursday, 28 March 2019

25 个有用的 iptables 防火墙规则

管理网络流量是系统管理员需要处理的最棘手的工作之一。
管理员配置防火墙时需要同时满足系统和用户对于传出和传入连接的要求,而且要避免系统遭受攻击。
这就是iptables有用的地方。iptables是一个linux命令行防火墙,它允许系统管理员通过一系列可配置的规则来控制传出和传入的流量。
iptables使用一系列具有链结构的表,这些链包含内建的规则或用户定义的规则。多亏于此,系统管理员可以恰当地过滤系统的网络流量。
iptables中有以下三种类型的表:
  1. FILTER表,默认的表,包含以下三种内建链:
    1. INPUT链,发给本地sockets的包
    2. FORWARD链,经由系统发送的包
    3. OUTPUT链,本地生成并发出的包
  2. NAT表,当一个包试图创建新连接时将访问该表,该表包含以下内建链:
    1. PREROUTING链,更改刚接收到的包
    2. OUTPUT链,更改本地产生的包
    3. POSTROUTING链,更改即将发出的包
  3. MANGLE表,用于包的更改:
    1. PREROUTING链:更改传入连接
    2. OUTPUT链:更改本地产生的包
    3. INPUT链:更改传入的包
    4. POSTROUTING链:更改即将发出的包
    5. FORWARD链:更改经过的包
在这篇文章中,你将会看到一些有用的命令,帮助你使用iptables来管理你的Linux防火墙。

1. 开始/停止/重启iptables防火墙

首先,你应该知道如何在不同发行版的Linux系统中管理iptables服务。

基于SystemD的linux发行版

------------ On Cent/RHEL 7 and Fedora 22+ ------------
# systemctl start iptables
# systemctl stop iptables
# systemctl restart iptables

基于SysVinit的linux发行版

------------ On Cent/RHEL 6/5 and Fedora ------------
# /etc/init.d/iptables start
# /etc/init.d/iptables stop
# /etc/init.d/iptables restart

2. 查看所有iptables规则

# iptables -L -n -v
输出示例:
Chain INPUT (policy ACCEPT 1129K packets, 415M bytes)
pkts bytes target prot opt in out source destination 
0 0 ACCEPT tcp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
0 0 ACCEPT udp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT tcp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
0 0 ACCEPT udp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination 
0 0 ACCEPT all -- * lxcbr0 0.0.0.0/0 0.0.0.0/0 
0 0 ACCEPT all -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0

Chain OUTPUT (policy ACCEPT 354K packets, 185M bytes)
pkts bytes target prot opt in out source destination
如果你想要查看某个表的规则,可以使用-t选项,后面跟上你想要查看的表。例如,要查看NAT表的规则,可以输入以下命令:
# iptables -t nat -L -v -n

3. 屏蔽某个IP地址

如果你发现一个来自某个IP的异常活动,你可以屏蔽这个IP地址:
# iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP
将“xxx.xxx.xxx.xxx”改为想要屏蔽的IP地址。需要注意的是,你有可能会意外屏蔽自己的IP地址。 -A 选项会将规则添加到指定的链中。
如果你只想要屏蔽来自某个IP地址的TCP流量,你可以使用 -p 选项来指定协议。这种情况下命令如下:
# iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx -j DROP

4. 取消屏蔽某个IP地址

如果你想取消对某个IP地址的屏蔽,可以删除对应的屏蔽规则:
# iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP
选项 -D 用于从选定的链中删除一条或多条规则,你也可以使用 --delete 选项。

5. 屏蔽某个端口

有时候我们会想要屏蔽基于某个端口的传出或传入连接,这是一个良好的安全措施,当你要设定防火墙时,应该认真考虑这措施。
屏蔽基于某个端口的传出连接:
# iptables -A OUTPUT -p tcp --dport xxx -j DROP
允许基于某个端口的传入连接:
# iptables -A INPUT -p tcp --dport xxx -j ACCEPT
将上面例子中的“xxx”修改为想要屏蔽或允许的端口号。如果你想要屏蔽UDP流量而不是TCP流量,只需简单地将上述规则中的 tcp 修改为 udp 即可。

6. 使用Multiport允许多个端口

你可以通过使用multiport来同时允许多个端口,你可以在下面找到适用于传入和传出的规则:
# iptables -A INPUT  -p tcp -m multiport --dports 22,80,443 -j ACCEPT
# iptables -A OUTPUT -p tcp -m multiport --sports 22,80,443 -j ACCEPT

7. 允许基于某个端口的指定范围的网络

你可能想限制一些基于某个端口的连接访问特定网络。比方说你想要允许基于22端口的传出连接访问192.168.100.0/24网络,可以通过以下命令实现:
# iptables -A OUTPUT -p tcp -d 192.168.100.0/24 --dport 22 -j ACCEPT

8. 屏蔽Facebook网站

有一些雇主喜欢屏蔽员工对于Facebook网站的访问权限,下面是一个屏蔽Facebook流量的示例。
首先找到Facebook使用的IP地址:
# host facebook.com
facebook.com has address 66.220.156.68

# whois 66.220.156.68 | grep CIDR
CIDR: 66.220.144.0/20
接下来你就可以屏蔽Facebook网站了:
# iptables -A OUTPUT -p tcp -d 66.220.144.0/20 -j DROP
注意,Facebook网站使用的IP地址范围可能因国家而异。

9. 设置端口转发

有时你可能想要将某个服务的流量转发到另一个端口,命令如下:
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j REDIRECT --to-port 2525
以上命令会将所有来自eth0接口的传入流量,由25端口转发到2525端口。你可以根据自己的需要来修改端口号。

10. 屏蔽Apache端口的网络洪水

有些IP地址可能会对网站的web端口请求过多的连接,这可能导致一些问题。要避免这些问题,你可以使用以下规则:
# iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/minute --limit-burst 200 -j ACCEPT
上述命令中 --limit 100/minute 表示将传入连接限制为100个每分钟,--limit-burst 200 表示仅当连接总数达到200个以后才开始限制连接数。

11. 屏蔽传入Ping请求

基于安全考虑,有些系统管理员喜欢屏蔽传入ping请求。虽然威胁并不大,不过了解如何屏蔽这样的请求还是有好处的:
# iptables -A INPUT -p icmp -i eth0 -j DROP

12. 允许loopback权限

loopback权限(来自127.0.0.1的权限)是非常重要的,你应该总是将其设为激活状态。
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT

13. 记录丢弃的网络包

如果你想要记录eth0接口所丢弃的网络包,可以使用以下命令:
# iptables -A INPUT -i eth0 -j LOG --log-prefix "IPtables dropped packets:"
你可以改变 --log-prefix 选项后面所跟的内容。日志将被记录到 /var/log/messages 文件中,你可以通过以下命令来搜索日志:
# grep "IPtables dropped packets:" /var/log/messages

14. 屏蔽某个MAC地址

你可以屏蔽来自特定MAC地址的访问权限:
# iptables -A INPUT -m mac --mac-source 00:00:00:00:00:00 -j DROP
当然,你需要将“00:00:00:00:00:00”改为你想屏蔽的MAC地址。

15. 限制每个IP的并发连接数

如果你不想同一个IP地址在某个端口同时建立太多连接,你可以通过以下方式进行限制:
# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
上述命令允许每个客户端同时建立最多3个连接。当然,你可以改变端口号来匹配不同的服务。

16. 搜索IPtables规则

一旦你定义了自己的iptables规则,你可能经常需要进行搜索或修改操作。一种简单的搜索方式如下:
# iptables -L $table -v -n | grep $string
在上述示例中,你需要将 $table 改为你想搜索的表,并将 $string 改为你想搜索的字符串。
示例如下:
# iptables -L INPUT -v -n | grep 192.168.0.100

17. 定义新的链

你可以定义自己的链,并在其中存放自定义的规则。
定义一个链:
# iptables -N custom-filter
现在你可以查看你定义的过滤规则了:
# iptables -L
示例输出:
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain custom-filter (0 references)
target prot opt source destination

18. 删除所有链或规则

删除所有自定义链:
# iptables -F
清除某个表中的所有链:
# iptables -t nat -F
你可以将“nat”改为想要清除的链所在的表。

19. 保存IPtables规则到文件

如果你想保存你的防火墙规则,可以使用 iptables-save 命令:
# iptables-save > ~/iptables.rules

20. 从文件恢复IPtables规则

如果你想要恢复一个列表的规则,可以使用 iptables-restore 命令:
# iptables-restore < ~/iptables.rules

21. 设置符合PCI的规则

有一些系统管理员可能被要求将服务器按PCI要求进行配置。不同的PCI提供商有许多不同的要求,但也有一些共同的要求。
在很多情况下,你需要拥有多于一个的IP地址。你需要将以下规则应用到网站的IP地址中。请特别注意,使用下面的命令时你应该清楚自己在做什么。
# iptables -I INPUT -d SITE -p tcp -m multiport --dports 21,25,110,143,465,587,993,995 -j DROP
如果你使用cPanel或者类似的控制面板,你可能还需要屏蔽它的端口。示例如下:
# iptables -I in_sg -d DEDI_IP -p tcp -m multiport --dports  2082,2083,2095,2096,2525,2086,2087 -j DROP
注意:为了确保你满足PCI供应商的要求,请认真查看他们的报告,并应用要求的规则。在一些情况下你可能还需要屏蔽基于特定端口的UDP流量。

22. 允许已建立的和相关联的连接

正如网络流量被分为传入和传出,你可能想要允许已建立的和相关联的传入流量。
对于传入连接:
# iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
对于传出连接:
# iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

23. 丢弃无效的包

我们可以将某些网络包标记为无效。一些人可能喜欢记录这些包,但另一些人喜欢丢弃它们。要丢弃无效的包,可以执行以下命令:
# iptables -A INPUT -m conntrack --ctstate INVALID -j DROP 

24. 屏蔽某个网络接口的连接

有些系统可能具有不止一个的网络接口。你可以限制某个网络接口的访问权限,或者屏蔽来自特定IP地址的连接。
例如:
# iptables -A INPUT -i eth0 -s xxx.xxx.xxx.xxx -j DROP
将“xxx.xxx.xxx.xxx”改为你想屏蔽的IP地址。

25. 禁止传出邮件

如果你的系统不应该发送任何电子邮件,你可以屏蔽SMTP传出端口。
示例:
# iptables -A OUTPUT -p tcp --dports 25,465,587 -j REJECT

总结

IPtables是一个强大而又易用的防火墙。学习IPtables的基本使用,对于每个Linux系统管理员而言都是非常重要的。如果你想要了解更多关于iptables命令及其选项的详细内容,建议你阅读它的手册:
# man iptables

英文原文:

No comments:

Post a Comment