Linux防火墙规则是用于控制进出Linux系统的网络流量的一系列指令。防火墙规则可以基于源IP地址、目的IP地址、端口号、协议类型等条件来允许或拒绝网络连接。在Linux中,最常用的防火墙工具是iptables和firewalld。
iptables
iptables是Linux上最传统的防火墙工具,工作在内核层面,提供了强大的包过滤功能。
iptables基于Netfilter框架,允许管理员定义规则来控制进出系统的网络流量。iptables的核心是一系列的表(tables)、链(chains)和规则(rules)。
表格(Tables)
iptables有四种内建表:
1. Filter表:默认表,用于决定数据包的接受、拒绝或转发。
2. NAT表:用于网络地址转换,可以实现如端口转发、伪装等。
3. Mangle表:用于修改经过的数据包,如设置服务质量(QoS)标志位。
4. Raw表:用于设置对数据包的初始处理,如设置IP头部的TTL值。
链(Chains)
每个表包含若干预定义的链:
- INPUT链:处理进入本机的数据包。
- OUTPUT链:处理从本机发出的数据包。
- FORWARD链:处理通过本机路由转发的数据包。
- PREROUTING链:处理进入本机但还未路由的数据包。
- POSTROUTING链:处理即将离开本机的数据包。
- 其他链:如在Mangle表中的`--mangle`链。
规则(Rules)
规则是应用在链上的一系列条件和动作,它决定了如何处理匹配特定条件的数据包。
常用命令
以下是iptables的一些基本命令和选项:
- `-A`:追加规则到链的末尾。
- `-I`:插入规则到链的指定位置。
- `-D`:删除链中的指定规则。
- `-R`:替换链中的指定规则。
- `-L`:列出链中的规则。
- `-F`:清空链中的所有规则。
- `-Z`:清空链中规则的统计信息。
- `-P`:设置链的默认策略。
- `-N`:创建新的用户定义链。
- `-X`:删除用户定义链。
- `-E`:修改用户定义链的名称。
匹配参数
- `-p`:指定协议(如tcp、udp、icmp)。
- `--dport`:指定目的端口。
- `--sport`:指定源端口。
- `-s`:指定源IP地址。
- `-d`:指定目的IP地址。
- `-i`:指定输入接口。
- `-o`:指定输出接口。
- `--tcp-flags`:指定TCP标志位。
- `--icmp-type`:指定ICMP类型。
目标动作
- `ACCEPT`:接受数据包。
- `DROP`:丢弃数据包。
- `REJECT`:拒绝数据包,并发送错误信息。
- `QUEUE`:将数据包排队到用户空间。
- `RETURN`:返回到调用链。
示例配置
1. 查看当前防火墙规则:
iptables -L -n
2. 清空当前的防火墙规则:
iptables -F
3. 允许特定端口的入站连接(例如TCP协议的80端口):
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
4. 允许特定IP地址范围的入站连接(例如192.168.0.0/24子网):
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
5. 阻止所有入站连接:
iptables -P INPUT DROP
6. 保存配置:
service iptables save
7.重启iptables服务
service iptables restart
注意事项
- 在修改iptables规则之前,建议备份当前的规则。
- 错误的iptables配置可能导致网络连接中断,因此在应用新规则前应该确保理解其影响。
- 在生产环境中,建议在非生产系统上测试新的iptables规则。
这些是iptables的基本介绍和命令配置。根据具体需求,可以创建更复杂的规则来满足网络安全策略。
如何备份这些规则
备份iptables当前规则的常用方法是将规则列表导出到一个文件中。这可以通过使用`iptables-save`命令来完成。以下是备份iptables规则的步骤:
1. 导出规则到文件:
iptables-save > /path/to/iptables_backup.conf
这里`/path/to/iptables_backup.conf`是你希望保存备份文件的路径和文件名。你需要替换它为实际的路径,例如`/etc/iptables/iptables_backup.conf`。
2. 验证备份:
使用`cat`命令查看备份文件的内容,确保规则已正确保存:
cat /path/to/iptables_backup.conf
3. 保存备份到安全位置:
为了安全起见,应该将备份文件保存在安全的位置,例如,可以将其复制到一个外部存储设备或上传到云存储服务。
4. 定期备份:
如果iptables规则经常更改,建议定期进行备份,以确保在需要时能够恢复到最新状态。
5. 自动化备份:
可以通过编写脚本或使用系统任务计划工具(如cron)来自动化iptables规则的备份过程。
请注意,`iptables-save`命令默认导出所有表的规则。如果你只想备份特定的表,可以使用`-t`选项指定表名,例如:
iptables-save -t filter > /path/to/filter_backup.conf
这将只导出`filter`表的规则到指定的文件中。
在恢复规则时,可以使用`iptables-restore`命令从备份文件中读取并应用规则:
iptables-restore < /path/to/iptables_backup.conf
确保在恢复规则之前,你已经理解了备份文件中的内容,并且知道这些规则将如何影响你的系统。如果可能,最好在一个测试环境中先进行恢复尝试。
firewalld
Firewalld是一个动态管理防火墙的守护进程,它提供了一个易于使用的界面来管理防火墙规则,而不需要重启服务。它是基于iptables的,但提供了更高级的抽象和更易于管理的区域(zones)和服务(services)概念。Firewalld自CentOS 7起成为默认的防火墙管理工具,并在Fedora及其衍生版中广泛使用。
Firewalld的核心概念
1.区域(Zones):区域是预定义的安全级别,用于根据来源或目的地将网络流量分类。例如,公共区域(public)通常用于不受信任的网络,而家庭区域(home)用于家庭网络。
2. 服务(Services):服务是预定义的端口和协议集合,代表特定的网络服务,如ssh、http、https等。
3. 接口(Interfaces):接口可以是网络设备或网络区域,它们可以被分配到特定的区域。
4. 直接规则(Direct Rules):直接规则允许你添加自定义的iptables规则,这些规则不是基于服务或端口,而是直接操作iptables规则。
`firewall-cmd` 选项参数及其描述:
1. `--state`:显示 firewalld 服务的状态(running 或 not running)。
firewall-cmd --state
2. `--reload`:不中断服务的情况下重新加载防火墙规则。
firewall-cmd --reload
3. `--runtime-to-permanent`:将当前运行时的防火墙规则永久保存。
firewall-cmd --runtime-to-permanent
4. `--permanent`:使添加的策略永久生效,需要重新加载才能应用。
firewall-cmd --permanent --zone=public --add-port=8080/tcp
5. `--get-default-zone`:查看当前默认的区域(zone)。
firewall-cmd --get-default-zone
6. `--get-active-zones`:查看当前激活的区域(zones)。
firewall-cmd --get-active-zones
7. `--set-default-zone=<zone>`:设置默认的区域。
firewall-cmd --set-default-zone=public
8. `--get-zones`:查看当前有哪些区域(zones)。
firewall-cmd --get-zones
9. `--get-services`:查看当前支持哪些服务(services)。
firewall-cmd --get-services
10. `--list-all-zones`:查看所有区域设置的策略。
firewall-cmd --list-all-zones
11. `--list-all`:查看当前区域设置的策略。
firewall-cmd --list-all
12. `--direct`:使用直接接口添加、删除或查看自定义的 iptables 规则。
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 22 -j ACCEPT
13. `--add-source=<IP or subnet>`:将来源于指定 IP 或子网的流量导向指定的区域。
firewall-cmd --zone=public --add-source=192.168.1.0/24
14. `--remove-source=<IP or subnet>`:不再将指定 IP 或子网的流量导向某个指定区域。
firewall-cmd --zone=public --remove-source=192.168.1.0/24
15. `--add-interface=<interface>`:将指定的网络接口添加到某个区域。
firewall-cmd --zone=public --add-interface=eth0
16. `--change-interface=<interface>`:更改网络接口所属的区域。
firewall-cmd --zone=public --change-interface=eth0
17. `--add-service=<service>`:允许默认区域允许该服务的流量。
firewall-cmd --zone=public --add-service=http
18. `--add-port=<port/protocol>`:允许默认区域允许该端口的流量。
firewall-cmd --zone=public --add-port=80/tcp
19. `--remove-service=<service>`:设置默认区域不再允许该服务的流量。
firewall-cmd --zone=public --remove-service=http
20. `--remove-port=<port/protocol>`:允许默认区域不再允许该端口的流量。
firewall-cmd --zone=public --remove-port=80/tcp
21. `--panic-on`:启动应急状况模式,阻断一切网络连接。
firewall-cmd --panic-on
22. `--panic-off`:关闭应急状况模式。
firewall-cmd --panic-off
23. `--list-rich-rules`:列出当前区域的所有富规则(rich rules)。
firewall-cmd --zone=public --list-rich-rules
24. `--add-rich-rule`:添加一个富规则。
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" accept'
25. `--remove-rich-rule`:移除一个富规则。
firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.0/24" accept'
这些选项参数可以帮助你根据需要配置和管理 firewalld,从而控制进出系统的网络流量。在使用这些参数时,请确保你了解每个参数的作用,以避免不必要的网络连接问题。
Firewalld命令配置示例
以下是一些常用的firewalld命令及其配置示例:
1. 启动和停止firewalld服务:
systemctl start firewalld
systemctl stop firewalld
2.设置firewalld开机自启:
systemctl enable firewalld
systemctl disable firewalld
3.检查firewalld服务状态:
systemctl status firewalld
4. 添加服务到区域(例如,将http服务添加到public区域):
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload
5. 移除服务从区域(例如,移除http服务从public区域):
firewall-cmd --zone=public --remove-service=http --permanent
firewall-cmd --reload
6.添加端口到区域(例如,开放端口8080):
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
7.移除端口从区域(例如,关闭端口8080):
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
firewall-cmd --reload
8.查看区域信息:
firewall-cmd --zone=public --list-all
9.更改默认区域**(例如,将默认区域更改为internal):
firewall-cmd --set-default-zone=internal --permanent
firewall-cmd --reload
10. 设置接口的区域(例如,将eth0接口设置为internal区域):
firewall-cmd --zone=internal --add-interface=eth0 --permanent
firewall-cmd --reload
11.端口转发(例如,将外部访问的80端口转发到内部的8080端口):
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
firewall-cmd --reload
12.临时应用规则(不永久生效):
firewall-cmd --zone=public --add-port=8080/tcp
firewall-cmd --reload
13.删除临时规则:
firewall-cmd --zone=public --remove-port=8080/tcp
firewall-cmd --reload
14. 列出所有区域:
firewall-cmd --get-zones
15.列出所有服务:
firewall-cmd --get-services
16.查看firewalld版本:
firewall-cmd --version
17.查看firewalld帮助信息:
firewall-cmd --help
请注意,带有`--permanent`标志的命令将更改永久存储在配置文件中,而没有该标志的命令仅在当前会话中有效,重启后失效。使用`--reload`命令来重新加载firewalld配置,使更改生效。
在使用firewalld时,建议查看官方文档以获取更详细的信息和高级用法。