阅读量:31
Linux防火墙自定义规则指南(iptables与firewalld)
Linux系统中,iptables(传统工具,适用于所有发行版)和firewalld(现代动态工具,适用于CentOS/RHEL/Fedora等)是两种主流防火墙管理工具,均支持通过自定义规则实现精准的流量控制。以下是具体操作方法:
一、iptables自定义规则
iptables通过“规则链(Chain)”和“规则(Rule)”实现流量过滤,核心命令结构为iptables [-t 表名] 选项 [匹配条件] -j 动作。
1. 基础自定义规则示例
- 允许特定端口访问(如SSH,端口22):
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
(-A INPUT表示追加到INPUT链,-p tcp指定TCP协议,--dport 22匹配目标端口,-j ACCEPT允许流量) - 拒绝特定IP访问(如192.168.1.100):
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
(-s 192.168.1.100匹配源IP,-j DROP静默丢弃流量) - 允许IP段访问端口范围(如192.168.1.0/24访问3000-3100端口):
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 3000:3100 -j ACCEPT
(--dport 3000:3100匹配端口范围) - 设置默认策略(拒绝所有未明确允许的流量):
sudo iptables -P INPUT DROP
(-P INPUT DROP将INPUT链默认策略设为DROP,需提前允许必要流量,避免锁死系统)
2. 自定义链管理
当默认链规则过多时,可通过自定义链优化管理:
- 创建自定义链(如MY_CHAIN):
sudo iptables -N MY_CHAIN - 向自定义链添加规则(如允许10.0.0.0/8访问80端口):
sudo iptables -A MY_CHAIN -s 10.0.0.0/8 -p tcp --dport 80 -j ACCEPT - 将自定义链挂载到默认链(如INPUT链):
sudo iptables -A INPUT -j MY_CHAIN
(所有进入INPUT链的流量会先经过MY_CHAIN处理) - 删除自定义链(需先清空规则):
sudo iptables -F MY_CHAIN && sudo iptables -X MY_CHAIN
3. 持久化规则
iptables规则默认重启后失效,需通过以下命令保存:
- Debian/Ubuntu:
sudo iptables-save > /etc/iptables/rules.v4 - CentOS/RHEL:
sudo service iptables save - 或使用
iptables-persistent工具(sudo apt install iptables-persistent)自动保存。
二、firewalld自定义规则
firewalld采用“区域(Zone)”和“服务(Service)”模型,支持动态更新,无需重启即可生效。
1. 基础自定义规则示例
- 开放特定端口(如8080/tcp):
sudo firewall-cmd --permanent --add-port=8080/tcp
(--permanent表示永久生效,需配合--reload应用) - 允许特定IP访问(如192.168.1.100访问所有端口):
sudo firewall-cmd --permanent --add-source=192.168.1.100 - 拒绝特定服务(如FTP):
sudo firewall-cmd --permanent --remove-service=ftp
2. 富规则(Rich Rules)
富规则支持更复杂的匹配条件(如IP段、端口范围、协议),语法为:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" [条件] [动作]'
- 允许IP段访问端口范围:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3000-3100" accept' - 拒绝特定IP访问特定端口:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" reject' - 允许ICMP(ping)请求:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" icmp-type name="echo-request" accept'
3. 自定义服务
若需开放非标准服务(如自定义端口12345),可创建自定义服务文件:
- 创建文件
/etc/firewalld/services/myservice.xml,内容如下:<?xml version="1.0" encoding="utf-8"?> <service> <short>MyCustomService</short> <description>My custom service on port 12345</description> <port protocol="tcp" port="12345"/> </service> - 重新加载firewalld使服务生效:
sudo firewall-cmd --reload - 开放该服务:
sudo firewall-cmd --permanent --add-service=myservice
4. 持久化与重载
- 所有
--permanent规则需通过sudo firewall-cmd --reload应用; - 临时规则(不加
--permanent)立即生效,但重启后失效。
三、注意事项
- 谨慎操作默认策略:避免将INPUT链默认策略设为DROP后,未允许SSH等必要流量,导致无法远程登录。
- 测试规则有效性:修改规则前,建议在本地终端开启新会话,防止误操作锁死系统。
- 备份现有规则:修改前通过
sudo iptables-save > ~/iptables_backup.txt(iptables)或sudo cp /etc/firewalld/zones/(firewalld)备份,便于恢复。 - 优先级问题:iptables规则按添加顺序匹配,先匹配的规则优先;firewalld富规则优先级高于普通规则。
通过以上方法,可根据实际需求灵活定制Linux防火墙规则,实现精准的流量管控。