linux防火墙规则
iptables
这一部分主要保留传统 iptables 的使用记录。较新的 RHEL/CentOS 系统通常优先使用 firewalld 或 nftables;不要在同一台机器上混着维护多套防火墙规则。
1. 查看当前防火墙规则
使用 iptables 查看规则:
sudo iptables -L
这将列出所有的链和规则。-L 参数代表列出(List)。
查看详细信息:
sudo iptables -L -v -n
-v 参数代表详细(Verbose),-n 参数代表不解析服务名称(Numeric)。
查看特定链的规则:
sudo iptables -L INPUT -v
2. 配置防火墙规则
添加规则允许 SSH:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
这条命令将添加一条规则到 INPUT 链,允许所有进入的 TCP 流量到达端口 22(SSH)。
添加规则拒绝特定 IP:
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
这条命令将拒绝来自 IP 地址 192.168.1.100 的所有流量。
添加规则允许来自特定 IP 的 HTTP 访问:
sudo iptables -A INPUT -p tcp -s 192.168.1.101 --dport 80 -j ACCEPT
添加规则允许已建立的连接:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
旧教程常见的 -m state --state ... 仍可能可用,但新规则更常见的是 conntrack 写法。
添加规则允许出站流量:
sudo iptables -A OUTPUT -j ACCEPT
3. 删除防火墙规则
删除特定规则: 要删除规则,你需要知道规则的编号。使用 -L --line-numbers 查看规则编号:
sudo iptables -L --line-numbers
然后删除规则,例如删除编号为 3 的规则:
sudo iptables -D INPUT 3
4. 保存防火墙规则
保存 iptables 规则: 在 Debian/Ubuntu 上,可以使用 iptables-persistent / netfilter-persistent:
sudo apt install iptables-persistent
sudo netfilter-persistent save
在旧版 CentOS/RHEL 的 iptables-services 环境中,常见的是:
sudo service iptables save
现代 RHEL/CentOS 新部署更适合使用 firewalld 或 nftables,不要使用不存在的 systemctl save iptables。
5. 恢复防火墙规则
在系统启动时恢复 iptables 规则: Debian/Ubuntu 安装 iptables-persistent 后可由 netfilter-persistent 自动恢复。旧版 CentOS/RHEL 若使用 iptables-services,由对应服务负责加载保存的规则;不要再把恢复命令手工塞进 rc.local。
6. 重置防火墙规则
清空现有 iptables 规则:
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
-F 代表清空规则,-X 代表删除用户自定义链。远程服务器上不要直接执行这组命令:如果当前 SSH 依赖已有放行规则,清空后可能立刻断开连接。
7. 防火墙规则的持久化
Ubuntu/Debian: 安装 iptables-persistent 包后,它会在 /etc/iptables/rules.v4 文件中保存规则。
CentOS/RHEL: 你可以使用 iptables-services 包来管理 iptables 的持久化:
sudo yum install iptables-services
sudo systemctl enable iptables
sudo service iptables save
8. 查看和管理系统服务
查看所有服务:
sudo systemctl list-units --type=service
启动/停止服务:
sudo systemctl start iptables
sudo systemctl stop iptables
设置服务开机启动:
sudo systemctl enable iptables
禁用服务开机启动:
sudo systemctl disable iptables
以上命令主要用于查看和维护已有 iptables 配置。新系统先确认当前实际使用的是 firewalld、nftables 还是 iptables,再按对应工具修改。
9. 停止使用 iptables 规则时
不要通过删除 /etc/iptables 目录来“关闭防火墙”。先确认当前规则由哪个服务管理,再停用或卸载对应的持久化服务;远程机器操作前要确认 SSH 不会因此被阻断。
firewalld
1. Firewalld 简介
Firewalld 是一个动态防火墙管理工具,它提供了基于区域(zone)和服务(service)的简化配置界面,使得管理防火墙规则更加容易。它支持动态更新防火墙规则,可以在运行时添加、删除、修改规则,而不需要重新加载整个防火墙配置。
2. 服务的启动、停止和状态查看
- 启动防火墙:
sudo systemctl start firewalld - 停止防火墙:
sudo systemctl stop firewalld - 设置防火墙开机启动:
sudo systemctl enable firewalld - 禁用防火墙开机启动:
sudo systemctl disable firewalld - 查看防火墙状态:
sudo systemctl status firewalld # 或者 sudo firewall-cmd --state - 查看版本:
sudo firewall-cmd --version
3. 查看和设置默认区域
- 查看默认区域:
sudo firewall-cmd --get-default-zone - 查看所有可用的区域:
sudo firewall-cmd --get-zones - 查看当前活动区域:
sudo firewall-cmd --get-active-zones - 设置默认区域:
其中your_zone是你想要设置的默认区域的名称,比如public、internal、dmz等。sudo firewall-cmd --set-default-zone=your_zone
4. 使用 firewall-cmd 命令行工具进行规则配置
- 添加规则开放端口:
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent - 添加规则允许服务:
sudo firewall-cmd --zone=public --add-service=http --permanent - 删除规则:
sudo firewall-cmd --zone=public --remove-service=http --permanent
5. 重新加载防火墙配置
为了使永久配置生效,需要重新加载 firewalld:
sudo firewall-cmd --reload
6. 查询已开放的端口、已允许的服务
- 查询特定区域支持的所有特性:
其中,zone_name是你要查询的区域的名称。sudo firewall-cmd --zone=zone_name --list-all - 查询特定区域支持的所有服务:
sudo firewall-cmd --zone=zone_name --list-services - 查询特定区域开放的端口:
sudo firewall-cmd --zone=zone_name --list-ports
7. 绑定接口到特定区域
- 永久更改接口的区域绑定:
为了使永久更改生效,需要重新加载firewalldsudo firewall-cmd --zone=home --add-interface=eth0 --permanent
再次验证更改:sudo firewall-cmd --reloadsudo firewall-cmd --get-active-zones
评论将在接近此处时加载,也可点击立即加载。