防火墙笔记
# iptables
# iptalbes 概念
1.基本定义和功能:iptables 是运行在用户空间的命令行工具,通过控制内核态的 netfilter 框架 实现对网络数据包的处理
- 数据包过滤:根据源/目的 IP、端口、协议等条件允许或拒绝数据包通过
- 网络地址转换(NAT):修改数据包的源/目的 IP 或端口,常用于端口转发和共享上
- 数据包修改:调整 TTL、TOS 等字段,或设置标记用于流量控制
2.核心结构:表、链、规则
表(Table):按功能分类,包含 4 种主要表:
- filter(默认表):过滤数据包,决定放行(ACCEPT)或丢弃(DROP)
- nat:处理地址转换(DNAT/SNAT)
- mangle:修改数据包头(如 TTL、TOS)
- raw:控制连接追踪机制
链(Chain):数据包处理流程中的关键节点,共有 5 条内建链:
- PREROUTING:路由前,用于 DNAT
- INPUT:处理目标为本机的数据包
- FORWARD:处理转发的数据包
- OUTPUT:处理本机发出的数据包
- POSTROUTING:路由后,用于 SNAT
规则(Rule):匹配条件(如协议、IP 地址)与动作(如 ACCEPT、DROP)的组合,按顺序匹配并执行
3.数据包处理流程
数据包的生命周期中会依次经过以下路径(以入站和转发为例):
入站数据包
- 经过 PREROUTING 链(可能触发 DNAT)
- 路由判断目标为本机后,进入 INPUT 链
- 若未被拦截,交由本机进程处理,回程时经过 OUTPUT 链,最终通过 POSTROUTING 链离开
- 总结: PREROUTING --> INPUT --> OUTPUT --> POSTROUTING
转发数据包
- 经过 PREROUTING 链
- 路由判断需转发后,进入 FORWARD 链
- 通过 POSTROUTING 链完成 SNAT 后转发
- 总结:PREROUTING --> FORWARD --> POSTROUTING
# iptables 常用参数
- 规则管理
- -A:追加规则到链末尾(iptables -A INPUT -p tcp --dport 80 -j ACCEPT)
- -D:删除规则(按规则号或内容删除,如 iptables -D INPUT 2)
- -I:插入规则到指定位置(默认插入到链首)
- -R:替换规则(如 iptables -R INPUT 1 -j DROP)
- -L:列出规则(iptables -L -n --line-numbers 显示行号)
- -F:清空链规则(iptables -F 清空所有规则)
- -N:创建自定义链(如 iptables -N custom_chain)
- -X:删除自定义链(iptables -X custom_chain)
- -P:设置默认策略(如 iptables -P INPUT DROP)
- 匹配条件
- -p:指定协议(tcp、udp、icmp 等)
- -s/-d:源/目标 IP 地址(如 -s 192.168.1.0/24)
- --dport/--sport:目标/源端口(如 --dport 22)
- -m:指定iptables使用哪个匹配模块
- state:允许根据连接的状态过滤数据包,如NEW(新连接)、ESTABLISHED(已建立的连接)、RELATED(与已有连接相关的)和INVALID(无法识别的数据包) 例如:-m state --state ESTABLISHED,RELATED
- conntrack:类似于state模块,但提供了更多功能来跟踪连接状态 例如:-m conntrack --ctstate ESTABLISHED,RELATED
- tcp:用于匹配TCP协议相关的特性,比如特定标志位(SYN、ACK等)或端口范围 例如:-m tcp --dport 80
- udp:用于匹配UDP协议相关的特性,如端口号 例如:-m udp --dport 53
- icmp:用于匹配ICMP协议类型,如echo请求(ping) 例如:-m icmp --icmp-type echo-request
- limit:限制规则匹配的速度,可以用来防止日志洪水或DoS攻击 例如:-m limit --limit 5/min
- multiport:允许在一条规则中指定多个端口或一个端口范围 例如:-m multiport --dports 80,443,8080
- mac:基于MAC地址过滤数据包 例如:-m mac --mac-source 00:11:22:33:44:55
- time:根据时间条件进行匹配,可以限定规则生效的时间段 例如:-m time --timestart 09:00 --timestop 18:00
- nth:按照数据包的数量进行匹配,可以实现简单的负载均衡或流量分配 例如:-m nth --every 3 --packet 0
- owner:允许匹配本地生成的数据包的UID/GID信息 例如:-m owner --uid-owner 1000
- 动作处理
- ACCEPT:允许流量通过
- DROP:直接丢弃数据包(不回应)
- REJECT:拒绝并发送响应(如 icmp-host-prohibited)
- REDIRECT:目标地址转换(端口转发),仅修改数据包的目的端口,不改变目的IP,通常用于本地端口重定向
- DNAT:目标地址转换(NAT 路由),可以修改数据包的目的IP地址和目的端口,适用于将外部请求转发到内部服务器(在数据包从外部网络发送到内部网络时,将目标IP地址替换为内部设备的私有IP地址)
- SNAT:源地址转换(NAT 路由),在数据包从内部网络发送到外部网络时,将源IP地址替换为公共IP地址的技术(内部设备发起请求时,NAT设备(如路由器)自动将源IP替换为配置的公网IP,使外部网络看到的源地址统一为公网IP)
- MASQUERADE:自动伪装源地址(动态 IP 环境)
- 其他选项
- -n:以数字形式显示 IP(避免 DNS 解析延迟)
- -v:显示详细信息(如数据包计数)
- -vL:列出规则及计数器
- iptables-save/iptables-restore:保存/恢复规则
详细解释下 REDIRECT、DNAT、SNAT、MASQUERADE 动作
# iptables 应用案例
# 基础安全防护
# 禁止特定 IP 访问
iptables -A INPUT -s 192.168.1.100 -j DROP # 拒绝来自该 IP 的所有流量
# 允许 SSH 连接
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许外部 SSH
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT # 允许响应
# 正常情况下,为避免兼容性问题,应该加上 -m tcp,及
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT # 允许外部 SSH
iptables -A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT # 允许响应
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 网络地址转换(NAT)
# 使用iptables将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地网卡eth0
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j REDIRECT --to-port 8080
# DNAT 端口映射 将 8080 映射到内网服务器
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
1
2
3
4
5
2
3
4
5
# 流量控制与负载均衡
# 简单负载均衡(轮询)轮询到三台服务器
iptables -t nat -A PREROUTING -p tcp --dport 443 -m state --state NEW -m nth --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
iptables -t nat -A PREROUTING -p tcp --dport 443 -m state --state NEW -m nth --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
iptables -t nat -A PREROUTING -p tcp --dport 443 -m state --state NEW -m nth --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443
# 防 DDoS 攻击 限制 SYN 洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
1
2
3
4
5
6
7
2
3
4
5
6
7
# 端口开放高级应用
# 对一组 IP 开放 一个端口
iptables -A INPUT -m iprange --src-range 192.168.1.129-192.168.1.146 -p tcp -m tcp --dport 8080 -j ACCEPT
# 对一个 IP 开放 多个端口
iptables -A INPUT -s 192.168.1.100 -p tcp -m tcp --dport 0:65335 -j ACCEPT
iptables -A INPUT -s 192.168.1.100 -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
# 对一组 IP 开放 多个端口
iptables -A INPUT -m iprange --src-range 192.168.1.129-192.168.1.146 -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
持久化:iptables-save > /etc/iptables.rules