防火墙命令是系统管理员和安全运维人员调度网络策略的核心手段,熟练使用iptables、firewalld、netsh等命令行工具,才能实现精确到规则级的流量管控。
Linux防火墙命令体系:iptables与firewalld实操对比
Linux环境下防火墙命令主要分为传统的iptables和现代化的firewalld(firewall-cmd),两者底层均基于netfilter,但管理方式差异明显,实际部署需根据发行版和运维习惯选择。
iptables传统命令详解
iptables直接操作内核netfilter规则表链,日常操作为:
- 查看规则及包计数:
iptables -L -n -v - 按链查看:
iptables -L INPUT -n -v - 放行TCP 80端口:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT - 放行特定网段SSH:
iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j ACCEPT - 更改默认入站策略为拒绝:
iptables -P INPUT DROP(需先放开必要端口)
规则匹配顺序为链顶至链底,-A追加末尾,-I插入指定位置,封禁高频攻击源可用-I INPUT 1置于首位。
端口转发也是常见场景:iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
注意iptables规则即时生效,但对已建连接无影响。iptables -F清空所有规则,慎用。
firewalld现代命令firewall-cmd
firewalld通过firewall-cmd提供动态管理,分离运行时与永久配置,引入区域概念,默认public。
基本操作:
- 查看默认区域:
firewall-cmd --get-default-zone - 开放服务:
firewall-cmd --add-service={http,https} --permanent - 开放端口:
firewall-cmd --add-port=8080/tcp --permanent - 重载规则:
firewall-cmd --reload - 查看已开放资源:
firewall-cmd --list-services和firewall-cmd --list-ports
精细访问控制通过rich-rule实现,例如拒绝特定IP:
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.100 reject'
提升安全基线可切换默认区域至drop(仅允许明确放行):firewall-cmd --set-default-zone=drop
行业共识建议日常调试使用无--permanent的临时规则,确认无误后再转为持久配置,避免误操作影响运行环境。
Windows防火墙命令批处理:netsh advfirewall精准管控
Windows高级安全防火墙通过netsh命令行支持完整配置,适合远程管理、批量部署和自动化运维。
常用netsh advfirewall命令
- 查看所有配置文件状态:
netsh advfirewall show allprofiles - 启用防火墙:
netsh advfirewall set allprofiles state on - 入站放行端口3389:
netsh advfirewall firewall add rule name="RDP" dir=in action=allow protocol=TCP localport=3389 - 出站禁用某程序:
netsh advfirewall firewall add rule name="BlockApp" dir=out action=block program="C:bad.exe" - 入站允许源IP段:
netsh advfirewall firewall add rule name="AllowSubnet" dir=in action=allow remoteip=192.168.1.0/24
使用show rule name=xxx verbose查看详细属性。
批处理脚本应用场景
将多条命令写入.bat,通过计划任务每日更新黑名单:
@echo off
netsh advfirewall firewall delete rule name="BlockList"
netsh advfirewall firewall add rule name="BlockList" dir=in action=block remoteip=203.0.113.1,198.51.100.2
备份与还原:
- 导出:
netsh advfirewall export "C:fwbackup.wfw" - 导入:
netsh advfirewall import "C:fwbackup.wfw"
根据运维实践经验,将防火墙命令嵌入初始化脚本可确保新部署设备策略一致,规避手工遗漏。
防火墙命令封禁IP与端口限流细节
DDoS或暴力破解发生时,通过防火墙命令行封禁恶意IP是最直接手段。
iptables封禁与限速
单IP封禁:iptables -I INPUT -s 10.20.30.40 -j DROP
限制SSH新连接频率(30秒内超5次封禁):
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 30 --hitcount 5 -j DROP
查看recent列表:cat /proc/net/xt_recent/SSH
端口限流可使用hashlimit模块,如限制HTTP请求速率:iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-above 200/sec --hashlimit-mode srcip --hashlimit-name http -j DROP
firewalld封禁IP
添加丰富规则拒绝源IP:firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.20.30.40 reject'
同样支持日志记录,添加log prefix="BLOCK: "便于审计,删除时使用remove-rich-rule。
Windows下封禁IP
netsh advfirewall firewall add rule name="BlockAttacker" dir=in action=block remoteip=10.20.30.40
多IP逗号分隔,整段网段写remoteip=10.20.30.0/24,查看封禁列表:netsh advfirewall firewall show rule name=BlockAttacker verbose
防火墙命令的持久化保存与自动加载
内存规则重启即失,持久化是运维管理不可或缺的环节。
iptables持久化方案
Debian/Ubuntu:
- 安装:
apt install iptables-persistent - 保存:
netfilter-persistent save - 开机自动加载:
netfilter-persistent服务执行restore;单次手动恢复:iptables-restore < /etc/iptables/rules.v4
RHEL/CentOS:
- 保存:
iptables-save > /etc/sysconfig/iptables - 通过
systemctl enable iptables并确认文件存在,开机自动加载
规则变更后应立即执行保存命令,避免因计划内或意外重启丢失配置。
firewalld配置持久
firewalld天然分离runtime与permanent,加--permanent的参数写入/etc/firewalld/zones/,也可将当前运行时配置同步为持久:firewall-cmd --runtime-to-permanent
查看各zone持久配置:ls /etc/firewalld/zones/,手动编辑XML文件后需执行firewall-cmd --reload。
Windows防火墙策略备份与组策略
本地多机可通过脚本执行netsh advfirewall export生成模板,结合域组策略统一分发,组策略中配置高级防火墙后,客户端执行gpupdate /force同步,据统计,采用脚本化持久管理可大幅降低因策略缺失导致的安全事件。
防火墙命令是纵深防御体系的实操基础,从单机到大规模集群,命令行工具提供的可编程性远超图形界面。
防火墙命令常见问题解答
iptables规则保存后重启不生效如何排查?
首先确认保存文件路径和加载服务正常,Debian系列检查netfilter-persistent服务状态为enabled;RHEL系列确认iptables服务启动且/etc/sysconfig/iptables文件存在,手动执行iptables-restore < 文件路径测试能否恢复,若仍无效,查看/var/log/syslog或/var/log/messages定位服务启动错误,部分云环境需额外关闭ufw或firewalld避免冲突。
firewalld运行时报错COMMAND_FAILED如何解决?
多数候原因是rich-rule语法错误或与服务冲突,先执行firewall-cmd --check-config校验XML语法,调试时使用临时规则(不加--permanent),确认无误再转为永久,与docker或libvirt共存时,它们会自行管理iptables,建议在firewalld中调整zone或使用direct规则,或将docker网桥列入trusted区域。
netsh advfirewall如何区分入站和出站规则?
通过dir=in指定入站,dir=out指定出站,add rule时必须明确方向,查看规则时使用show rule name=xxx verbose会显示方向、协议、端口、远程地址等全部属性,Windows防火墙默认所有入站阻止,出站允许,修改出站规则通常用于限制内部程序外联,此时需计划好出站放行清单以避免业务异常。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/495772.html



