Linux防火墙常用命令
大约 6 分钟
Linux防火墙常用命令
本文档整理了Linux系统中防火墙相关的常用命令,按照功能分类,方便学习和查阅。
一、防火墙基础概念
Linux系统主要有两种防火墙管理工具:
- iptables - 传统的防火墙管理工具
- firewalld - 新一代动态防火墙管理工具(CentOS 7+/RHEL 7+默认)
二、firewalld防火墙管理
1. 防火墙服务管理
# 启动防火墙
systemctl start firewalld
# 停止防火墙
systemctl stop firewalld
# 重启防火墙
systemctl restart firewalld
# 查看防火墙状态
systemctl status firewalld
# 或者
firewall-cmd --state
# 设置开机自启
systemctl enable firewalld
# 禁止开机自启
systemctl disable firewalld
# 查看是否设置为开机自启
systemctl is-enabled firewalld
# 查看防火墙版本
firewall-cmd --version
# 查看帮助信息
firewall-cmd --help2. 防火墙配置管理
# 重新加载配置(不中断用户连接)
firewall-cmd --reload
# 完全重载配置(中断用户连接)
firewall-cmd --complete-reload
# 查看当前活动区域
firewall-cmd --get-active-zones
# 查看默认区域
firewall-cmd --get-default-zone
# 设置默认区域
firewall-cmd --set-default-zone=public3. 区域管理
# 查看所有可用区域
firewall-cmd --get-zones
# 查看指定区域的所有配置
firewall-cmd --zone=public --list-all
# 将接口分配给区域
firewall-cmd --zone=public --change-interface=eth0
# 查看接口所属区域
firewall-cmd --get-zone-of-interface=eth04. 服务管理
# 查看预定义服务列表
firewall-cmd --get-services
# 添加服务(临时)
firewall-cmd --add-service=http
# 添加服务(永久)
firewall-cmd --permanent --add-service=http
# 删除服务(临时)
firewall-cmd --remove-service=http
# 删除服务(永久)
firewall-cmd --permanent --remove-service=http
# 查看当前区域开放的服务
firewall-cmd --list-services
# 查看永久开放的服务
firewall-cmd --permanent --list-services5. 端口管理
# 添加端口(临时)
firewall-cmd --add-port=80/tcp
# 添加端口(永久)
firewall-cmd --permanent --add-port=80/tcp
# 删除端口(临时)
firewall-cmd --remove-port=80/tcp
# 删除端口(永久)
firewall-cmd --permanent --remove-port=80/tcp
# 批量添加端口
firewall-cmd --permanent --add-port=8080-8090/tcp
# 查看开放的端口
firewall-cmd --list-ports
# 查看永久开放的端口
firewall-cmd --permanent --list-ports6. 富规则(Rich Rules)管理
# 添加富规则(允许特定IP访问特定端口)
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.100' port protocol='tcp' port='22' accept"
# 添加富规则(拒绝特定IP访问)
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.100' reject"
# 删除富规则
firewall-cmd --permanent --remove-rich-rule="rule family='ipv4' source address='192.168.1.100' port protocol='tcp' port='22' accept"
# 查看富规则
firewall-cmd --list-rich-rules7. ICMP阻塞管理
# 查看ICMP类型列表
firewall-cmd --get-icmptypes
# 阻塞ICMP echo请求(ping)
firewall-cmd --add-icmp-block=echo-request
# 永久阻塞ICMP echo请求
firewall-cmd --permanent --add-icmp-block=echo-request
# 查看阻塞的ICMP类型
firewall-cmd --list-icmp-blocks8. 伪装和端口转发
# 启用伪装(NAT)
firewall-cmd --add-masquerade
# 永久启用伪装
firewall-cmd --permanent --add-masquerade
# 禁用伪装
firewall-cmd --remove-masquerade
# 添加端口转发(将80端口转发到192.168.1.100的8080端口)
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
# 永久添加端口转发
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100三、iptables防火墙管理
1. iptables基础操作
# 查看iptables规则
iptables -L
# 查看详细规则(包含数据包计数)
iptables -L -v
# 查看规则编号
iptables -L --line-numbers
# 清除所有规则
iptables -F
# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT2. 规则管理
# 添加规则到链的末尾
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 插入规则到链的指定位置
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
# 删除规则(按规则内容)
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# 删除规则(按规则编号)
iptables -D INPUT 1
# 替换规则
iptables -R INPUT 1 -p tcp --dport 22 -j ACCEPT3. 常用规则示例
# 允许本地回环访问
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许SSH连接
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许HTTP连接
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许HTTPS连接
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许特定IP访问
iptables -A INPUT -s 192.168.1.100 -j ACCEPT
# 拒绝特定IP访问
iptables -A INPUT -s 192.168.1.100 -j DROP
# 限制连接速率(防止DDoS)
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT4. iptables服务管理
# 保存iptables规则(CentOS/RHEL)
service iptables save
# 保存iptables规则(Ubuntu/Debian)
iptables-save > /etc/iptables/rules.v4
# 恢复iptables规则
iptables-restore < /etc/iptables/rules.v4
# 启动iptables服务
systemctl start iptables
# 设置iptables开机自启
systemctl enable iptables四、区域(Zone)概念详解
1. firewalld区域说明
firewalld将网络划分为不同的区域,每个区域定义了一套规则,用于控制允许的网络流量。
# 查看默认区域
firewall-cmd --get-default-zone
# 查看所有活动区域
firewall-cmd --get-active-zones
# 查看所有可用区域
firewall-cmd --get-zones2. 区域类型及特点
- public(公共) —— [默认]公网访问,仅接收选定的连接。
- work(工作) —— 用于工作区,基本信任的网络,仅接收选定的连接。
- home(家庭) —— 用于家庭网络,基本信任的网络,仅接收选定的连接。
- internal(内部) —— 内部网络,基本信任的网络。
- trusted(信任) —— 所有网络连接都可接受。
- external(外部) —— 用于路由器等启用伪装功能的外部网络。
- dmz(隔离区) —— 允许隔离区内的计算机提供有限的服务。
- block(限制) —— 拒绝所有连接。
- drop(丢弃) —— 丢弃所有连接,不返回任何信息。
五、防火墙配置最佳实践
1. 安全配置建议
# 1. 设置默认区域为public
firewall-cmd --set-default-zone=public
# 2. 允许必要的服务
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 3. 开放必要的端口
firewall-cmd --permanent --add-port=8080/tcp
# 4. 限制特定IP访问重要服务
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' service name='ssh' accept"
# 5. 阻止ICMP请求(防止ping扫描)
firewall-cmd --permanent --add-icmp-block=echo-request
# 6. 重新加载配置
firewall-cmd --reload
# 7. 验证配置
firewall-cmd --list-all2. 常见服务端口
# Web服务
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 数据库服务
firewall-cmd --permanent --add-port=3306/tcp  # MySQL
firewall-cmd --permanent --add-port=5432/tcp  # PostgreSQL
firewall-cmd --permanent --add-port=27017/tcp # MongoDB
# 应用服务
firewall-cmd --permanent --add-port=8080/tcp  # Tomcat
firewall-cmd --permanent --add-port=6379/tcp  # Redis
firewall-cmd --permanent --add-port=9200/tcp  # Elasticsearch
# 系统服务
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=ntp3. 故障排查命令
# 查看防火墙日志
journalctl -u firewalld
# 查看iptables日志
tail -f /var/log/messages | grep iptables
# 测试端口连通性
telnet 服务器IP 端口号
# 使用nc测试端口
nc -zv 服务器IP 端口号