深色模式
iptables 基础
摘要:iptables 是 Linux 内核 netfilter 的用户态工具。本文讲清「四表五链」的模型,并手敲一条放行 22 端口的规则,理解规则匹配顺序。
适用环境
bash
# 需要 root;新系统可能默认 nftables,但 iptables 命令仍可用(兼容性层)
sudo iptables -V
sudo lsmod | grep ip_tables1
2
3
2
3
操作步骤
1. 理解表与链
- 表(tables):
filter(过滤,最常用)、nat(地址转换)、mangle、raw - 链(chains):
INPUT(进本机)、OUTPUT(出本机)、FORWARD(转发)
一条包进本机:先看 PREROUTING → INPUT → 本机进程。
2. 查看当前 filter 表规则
bash
sudo iptables -L -n -v
# -L 列表 -n 数字 -v 详细(含计数,便于看命中)1
2
2
3. 写一条放行 SSH(22) 的规则
bash
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT1
-A INPUT:追加到 INPUT 链尾部-p tcp --dport 22:TCP 目的端口 22-j ACCEPT:动作接受
4. 放行已建立连接(重要)
bash
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT1
不加这条,回应包会被后续 DROP 规则丢弃,连接建立后数据也传不了。
5. 保存规则(防重启丢失)
bash
# Debian/Ubuntu
sudo iptables-save | sudo tee /etc/iptables/rules.v4
# RHEL/CentOS(用 iptables-services)
sudo service iptables save1
2
3
4
2
3
4
验证
bash
sudo iptables -L INPUT -n -v | grep -E ':22|state'
# 看到 dpt:22 的 ACCEPT 计数在 ssh 连接时增长即生效1
2
2
常见坑
WARNING
规则是顺序匹配,第一条命中即执行动作。把 DROP 放在 ACCEPT 前面会把该端口一并拦掉。排错时用 iptables -L -n -v 看每条规则的命中计数(pkts 列)。
DANGER
在远程机器上若默认策略是 DROP(iptables -P INPUT DROP)却还没放行 22,会立刻断 SSH。务必先放行 ESTABLISHED/SSH 再改默认策略,或改用 iptables-apply 带超时回滚。