iptables 参考
- How To Choose an Effective Firewall Policy to Secure your Servers
- Drop versus Reject
- iptables-cheatsheet.md
- http://ipset.netfilter.org/ipset.man.html
- https://github.com/coreos/go-iptables
- https://linux.die.net/man/8/iptables
- http://www.netfilter.org/
- https://wiki.archlinux.org/index.php/Iptables_(简体中文)
- http://ipset.netfilter.org/iptables-extensions.man.html
- 详解 iptables 概念
- IPTables packet traverse map
- 第九章、防火墙与 NAT 服务器
- How can I port forward with iptables?
- How To Mangle The Packets
Hook
- 本地流入 PREROUTING -> INPUT
- 外部流量 PREROUTING -> FORWARD -> POSTROUTING
- 本地发出 OUTPUT -> POSTROUTING
內建目标
- RETURN - 从 chain 返回
- ACCEPT - 退出 chain,退出当前 table
- DROP - 立即丢弃包
- QUEUE
- REJECT - 返回拒绝包 - 存在于 INPUT, FORWARD, OUTPUT
- DANT - nat 表的 PREROUTING, OUTPUT
- SNAT - nat 表的 POSTROUTING
- LOG
iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
- ULOG - 多播到 netlink socket,应用可以订阅进行处理
- MARK - mangle 表
- MASQUERADE - 类似于 SNAT,但用于 outbound 接口,IP 可能会变
- REDIRECT - nat 表的 PREROUTING, OUTPUT - 重定向包、流到机器
- NOTRACK - raw 表 - 用于关闭连接跟踪 - 不被 iptables/netfilter 处理
连接状态
- NEW
- 包未关联连接 - 第一个未关联包不会认为是 INVALID
- 会创建新的连接
- ESTABLISHED
- 包已关联连接 - 从 NEW 关联连接
- TCP 当返回 SYN/ACK 时
- UDP/ICMP 当 src 和 dst 交换时
- RELATED
- 包未关联已有连接但关联了系统中被标记为 RELATED 的连接
- 会创建新的连接或 ICMP 错误
- 例如 FTP 双端口
- INVALID - 无法识别、内存溢出、ICMP 错误、无法路由
- UNTRACKED - 在 raw 中使用 NOTRACK
- SNAT - 虚拟状态,确保后续 恢复 响应包 源地址
- DNAT - 虚拟状态,确保后续 恢复 响应包 目标地址
常用匹配模块
-m
/--match
指定模块- connmark
- conntrack
- ipvs
- mark
- redirect
A Deep Dive into Iptables and Netfilter Architecture
- A Deep Dive into Iptables and Netfilter Architecture
- 5 个 Hook
- NF_IP_PRE_ROUTING - PREROUTING
- 进入网络栈
- 先于路由决策
- NF_IP_LOCAL_IN - INPUT
- 如果包被路由到本地
- NF_IP_FORWARD - FORWARD
- 如果包被路由到其他主机
- NF_IP_LOCAL_OUT - OUTPUT
- 本地发起流量
- NF_IP_POST_ROUTING - POSTROUTING
- 本地发起流量或转发流量
- 在被发送之前
- NF_IP_PRE_ROUTING - PREROUTING
- 使用表来组织规则 - 通过规则返回的决策类型进行表划分
- filter - 过滤包
- nat - 地址转换
- mangle - 修改包
- raw - 用于 opt-out 包跟踪
- security - 用于设置 SELinux 上下文 mark
- chain - 规则链 - 控制包规则求值的路径
Tables↓/Chains→ | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
---|---|---|---|---|---|
(routing decision) | ✓ | ||||
raw | ✓ | ✓ | |||
(connection tracking enabled) | ✓ | ✓ | |||
mangle | ✓ | ✓ | ✓ | ✓ | ✓ |
nat (DNAT) | ✓ | ✓ | |||
(routing decision) | ✓ | ✓ | |||
filter | ✓ | ✓ | ✓ | ||
security | ✓ | ✓ | ✓ | ||
nat (SNAT) | ✓ | ✓ |
- 到本地的包 PREROUTING -> INPUT
- 到其他主机 PREROUTING -> FORWARD -> POSTROUTING
- 本地发出包 OUTPUT -> POSTROUTING