iptables简单使用
iptables 生产环境高频命令详解
说明:
iptables是 Linux 传统防火墙,netfilter 内核框架;CentOS7+/Ubuntu18+ 底层已逐步迁移到nftables,但绝大多数生产依旧在用 iptables;注意:iptables 规则重启失效,持久化需要单独保存。
四表五链先理清,再给高频生产命令、示例、坑点。
一、基础概念:四表五链
4张表(优先级从高→低)
- raw:关闭连接追踪,极少用
- mangle:修改数据包TTL、TOS、MARK标记
- nat:地址转换 SNAT/DNAT/PNAT、端口映射
- filter(默认表,防火墙过滤):放行/拒绝数据包,最常用
5条钩子链
| 链名 | 触发时机 | 用途 |
|---|---|---|
| PREROUTING | 数据包刚进网卡,路由判断前 | DNAT、端口映射 |
| INPUT | 目标为本机进程 | 管控外部访问本机端口 |
| FORWARD | 数据包经过本机转发 | 本机当网关/路由,跨主机转发 |
| OUTPUT | 本机进程向外发包 | 本机出站流量控制 |
| POSTROUTING | 数据包离开网卡之前 | SNAT、MASQUERADE源地址转换 |
默认不加
-t指定表时,默认就是filter表
规则匹配顺序
从上往下依次匹配,匹配到一条规则就执行对应动作(target),不再往下匹配;最后默认策略。
常用动作(target)
ACCEPT:允许数据包通过DROP:丢弃数据包,无任何回应(推荐生产拒绝外部)REJECT:拒绝,返回报错报文SNAT:源地址转换(固定公网IP)MASQUERADE:动态源地址伪装(拨号、DHCP公网IP)DNAT:目标地址转换,端口映射LOG:打日志,继续往下匹配
二、生产高频查询命令
1. 查看filter表所有规则
# 精简查看
iptables -L -n
# 完整带行号、计数器、详细规则(生产最推荐)
iptables -L -n -v --line-numbers
参数解释
-Llist列出规则-n数字格式,禁止反向DNS解析,速度极快,生产必带-vverbose,显示数据包、字节计数器--line-numbers打印规则行号,删除规则时非常好用
2. 指定链查看
# 只看INPUT链
iptables -L INPUT -nv --line-numbers
# 查看nat表所有规则
iptables -t nat -L -nv --line-numbers
3. 清空计数器(包流量统计清零)
iptables -Z
iptables -Z INPUT
三、增删改规则(生产最核心)
⚠️ 高危提醒!不要先执行 iptables -F 清规则再没加放行ssh!会直接断开远程服务器,生产事故!
1. 追加规则 -A (Append,加到链末尾)
末尾匹配优先级最低
# 放行TCP 22端口 ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 放行来自内网网段 192.168.1.0/24 所有访问
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
# 拒绝单个IP访问本机
iptables -A INPUT -s 10.0.0.123 -j DROP
2. 插入规则 -I (Insert,插到链头部!优先匹配)
封禁IP必须用-I,放到最前面,否则前面ACCEPT已经放行就无效!
# 将封禁规则插到INPUT链第1行,优先执行
iptables -I INPUT -s 1.2.3.4 -j DROP
# 插到第3行
iptables -I INPUT 3 -s 1.2.3.4 -j DROP
3. 删除规则 2种方式(生产高频)
方式1:按行号删除(最安全!推荐)
先查出行号 --line-numbers
# 删除filter表INPUT链第5条规则
iptables -D INPUT 5
方式2:完整匹配规则内容删除
iptables -D INPUT -s 1.2.3.4 -j DROP
4. 修改链默认策略 -P Policy
默认策略:所有数据包没有匹配到任何规则时执行的动作
# 默认拒绝所有入站流量(生产防火墙标准配置)
iptables -P INPUT DROP
# 默认允许转发、出站
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
⚠️ 如果
INPUT默认DROP,一定要先放行SSH端口,再设置默认策略!否则直接断连
5. 清空规则(高危慎用!)
# 清空filter表所有链规则
iptables -F
# 清空nat表
iptables -t nat -F
# 清空单条链规则
iptables -F INPUT
-F不会清空默认策略! 如果你INPUT默认DROP,清空后所有外部访问全部拒绝。
四、生产环境过滤规则实战示例(filter表 INPUT链)
1. 放行ssh 22端口,仅内网可访问
iptables -A INPUT -s 192.168.0.0/16 -p tcp --dport 22 -j ACCEPT
2. 放行多端口 80,443
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
-m multiport多端口模块,最多一次性传15个端口
3. 放行本机回环网卡 lo(127.0.0.1,生产必加!很多服务依赖)
iptables -A INPUT -i lo -j ACCEPT
4. 放行已建立、相关连接(最关键一条!)
服务器响应外部请求返回数据包放行
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
状态模块 state:
- NEW:新连接请求
- ESTABLISHED:已建立连接
- RELATED:关联连接(ftp被动模式等)
- INVALID:无效数据包,通常DROP
5. 限制单IP最大并发连接数(防CC攻击)
# 单个IP最多20个tcp新连接
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j DROP
6. 限速:短时间内防暴力破解SSH(limit模块)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/min --limit-burst 5 -j ACCEPT
7. 禁止ICMP ping(不让别人ping服务器)
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
五、NAT转发实战(网关、端口映射,nat表高频)
开启内核转发前提,必须先打开:
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p
场景1:SNAT 内网机器共享公网IP上网(固定公网IP)
公网网卡eth0 IP:203.0.113.10
内网网段:192.168.1.0/24
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 203.0.113.10
场景2:MASQUERADE 动态公网IP(宽带拨号,IP经常变,无需填IP)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
场景3:DNAT端口映射:公网8080→内网192.168.1.100:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
额外注意:filter表FORWARD链也要放行该流量,否则转发不通
iptables -A FORWARD -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT
六、规则持久化!重中之重(iptables重启丢失)
iptables规则内存生效,服务器重启全部清空,生产必须持久保存
CentOS7/8
# 保存规则
iptables-save > /etc/sysconfig/iptables
# 开机加载
yum install -y iptables-services
systemctl enable iptables
systemctl start iptables
# 恢复规则
iptables-restore < /etc/sysconfig/iptables
Ubuntu/Debian
apt install iptables-persistent
# 保存
netfilter-persistent save
# 重载
netfilter-persistent reload
通用方式(跨发行版)
iptables‑save导出当前全部规则;iptables‑restore导入规则文件
七、生产环境标准安全模板(可直接微调使用)
# 1.清空旧规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
# 2.放行lo回环网卡
iptables -A INPUT -i lo -j ACCEPT
# 3.放行已有连接
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 4.放行内网网段
iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT
# 5.放行公网80、443
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
# 6.默认拒绝所有入站
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
八、生产高频踩坑清单
- 设置INPUT默认DROP前,一定放行SSH,否则远程失联
-A追加到末尾,如果前面已经ACCEPT了IP,后面DROP不会生效;封禁IP必须-I插到头部- nat转发除了nat表规则,filter FORWARD链流量也要放行,不然转发不通
- 不要忘记
RELATED,ESTABLISHED这条规则,否则服务器访问外网收不到响应 - iptables 和 firewalld / ufw 不能同时混用,会冲突
- 云服务器:iptables只是操作系统防火墙,还要配置云厂商安全组!两层防护
iptables中DROP和REJECT的区别
- DROP:丢弃,无任何回应
- REJECT:拒绝,返回报错报文
举例:禁止10.10.249.156访问本机17822端口
在10.10.249.156主机,telnet 10.10.184.85 17822
- 如果是DROP:
# iptables -I INPUT -s 10.10.249.156 -p tcp --dport 17822 -j DROP
Trying 10.10.184.85...
telnet: Unable to connect to remote host: Connection timed out
返回连接超时
- 如果是REJECT:
# iptables -I INPUT -s 10.10.249.156 -p tcp --dport 17822 -j REJECT
Trying 10.10.184.85...
telnet: Unable to connect to remote host: Connection refused
返回连接拒绝
生产环境推荐用DROP

浙公网安备 33010602011771号