前言
虽然更喜欢 ufw的简单,忘记当时为啥必须要用 iptables了
Iptables 是一个很大的软件,不止可以做防火墙,还有 Nat、转发等。本篇关注作为防火墙时,“入方向” 的拦截规则
总结
- 抛开其他的功能,了解 iptables的结构及基本命令,就可以很快上手“防火墙”的操作了
开始
1. 软件运行结构
iptables 包含 4个表并存在优先级,依次是(从左到右)
raw | mangle | nat | filter |
---|---|---|---|
链接跟踪前处理 | 改写封包 | 网址转译工作 | 封包过滤(防火墙) |
filter
是默认表,操作中如不指定表,即为对 filter表操作
表中有一些链,其中 filter
表中的链有
INPUT | FORWORD | OUTPUT |
---|---|---|
进入的包 | 通过的包 | 本地生成的包 |
现在我们知道,iptables
默认选择的 filter
表的 INPUT
链即为:"防火墙入方向"
2. 操作命令
链本身(INPUT)的操作有哪些?
-L
查看链详情、规则
iptables -L # 查看 filter表下所有链
iptables -L INPUT # 查看 INPUT链
# --line 附带规则行号。可根据行号进行删除规则
# -n 不解析主机名,将显示 IP地址
iptables -L INPUT --line -n
-P
指定链的默认动作
iptables -P
链名 (DROP
/ACCEPT
)
iptables -P INPUT ACCEPT # 设置 input链默认允许通过
-F
清空链规则
iptables -F # 清除 filter 表下所有链的规则
iptables -F INPUT # 清除 INPUT链所有规则
为什么执行 iptables -F 要小心?为什么会断网失联?
如果默认动作为拒绝,清除规则后网络连接会被阻止。所以执行前要确保默认动作不是 DROP
- 其他操作 本篇不涉及
-N 指定名字建立新的链 -X 删除用户自定义链 -E 重命名链名称
3. 规则操作
链(INPUT)上的规则怎么操作?
有 3个步骤:操作 -> 匹配 -> 动作
操作
参数 | 定义 | 备注 |
---|---|---|
-N | 新的规则 | |
-A | 追加规则 | |
-D | 删除规则 | 删除指定序号 |
-R | 修改规则 | 修改指定序号 |
-I | 插入规则 | 在指定序号之前增加 |
匹配
参数 | 定义 | 备注 |
---|---|---|
-p | 指定协议 | tcp、udp、icmp |
-s | 来源地址 | 192.168.1.1 |
-d | 目的地址 | 192.168.1.1 |
--sport | 来源端口 | 8080 |
--dport | 目的端口 | 80 |
-i | 指定入口网卡 | eth0 |
-o | 指定出口网卡 | eth1 |
动作-j
[DROP 丢弃
| REJECT 拒绝
| ACCEPT 接受
]
4. 完整规则操作命令
根据上表,将操作 -> 匹配 -> 动作
组合出来即可
iptables -N INPUT -s 192.168.2.1 -p tcp --dport 80 -j DROP
-N
新加一条-s
从192.168.2.1来-p
tcp协议的--dport 80
去80端口的-j DROP
丢弃
删除规则需要和添加规则语句一致,将添加动作(N
、A
、I
等)换为删除动作(D
)
iptables -D INPUT -s 192.168.2.1 -p tcp --dport 80 -j DROP
或者通过行号(--line)
iptables -D INPUT 1
5. 其他
规则的行号越小(越靠上)优先级越高
规则保存
service iptables save
如无法保存,则保存至文件,启动时执行规则恢复
iptables-save > /etc/iptables.rules
iptables-restore < /etc/iptables.rules
/etc/network/if-pre-up.d/custom
[附录]
表名 | 优先级 | 包含的链 | 特性 |
---|---|---|---|
raw | 1 | 链接跟踪前处理,处理后跳过 nat表 | |
mangle | 2 | 改写封包 | |
nat | 3 | PREROUTING INPUT OUTPUT POSTROUTING | 一对一、一对多、多对多等网址转译工作 |
filter | 4 | INPUT FORWARD OUTPUT | 预设规则表,进行封包过滤 |
-t
指定不同表
iptables -t [nat | mangle | filter]
不使用 -t
指定表的话 默认使用的 filter表。