iptables 使用
iptables 用于管理 Linux 防火墙配置,最近需要用到,作个记录。
主要内容来自:iptables 命令,Linux iptables 命令详解。
四表五链
四表
filter: iptables 默认表,具有链(INPUT、FORWARD、OUTPUT)
nat: 用于 nat 功能,比如端口映射、地址映射等,具有链(PREROUTING、OUTPUT、POSTROUTING)
mangle: 用户修改数据包,具有链(PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING)
raw: 用于处理异常,具有链(PREROUTING、OUTPUT)
五链
PREROUTING: 处理刚到达本机并在路由转发前的数据包,用于目标地址转换(DNAT)
INPUT: 处理来自外部的数据
FORWARDING: 处理转发的数据,将数据转发到本机的其他网卡设备上
OUTPUT: 处理向外发送的数据
POSTROUTIONG: 处理即将离开本机的数据包,用于源地址转换(SNAT)
拓扑图
┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓
┌───────────────┐ ┃ Network ┃
│ table: filter │ ┗━━━━━━━┳━━━━━━━┛
│ chain: INPUT │◀────┐ │
└───────┬───────┘ │ ▼
│ │ ┌───────────────────┐
┌ ▼ ┐ │ │ table: nat │
│local process│ │ │ chain: PREROUTING │
└ ┘ │ └─────────┬─────────┘
│ │ │
▼ │ ▼ ┌─────────────────┐
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ │ ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ │table: nat │
Routing decision └───── outing decision ─────▶│chain: PREROUTING│
┅┅┅┅┅┅┅┅┅┳┅┅┅┅┅┅┅┅┅ ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ └────────┬────────┘
│ │
▼ │
┌───────────────┐ │
│ table: nat │ ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ │
│ chain: OUTPUT │ ┌─────▶ outing decision ◀──────────────┘
└───────┬───────┘ │ ┅┅┅┅┅┅┅┅┳┅┅┅┅┅┅┅┅
│ │ │
▼ │ ▼
┌───────────────┐ │ ┌────────────────────┐
│ table: filter │ │ │ chain: POSTROUTING │
│ chain: OUTPUT ├────┘ └──────────┬─────────┘
└───────────────┘ │
▼
┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓
┃ Network ┃
┗━━━━━━━━━━━━━━━┛
命令说明
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
选项
-t, --table table 对指定的表 table 进行操作, table 必须是 raw、nat、filter、mangle 中的一个,默认是 filter 表
-p 指定数据包协议,如 tcp、udp、icmp
-s, --source 源 IP 地址,格式是 address[/mask]
-d, --destination 目标 IP 地址,格式是 address[/mask]
--sport num 来源端口号
--dport num 目标端口号
-i, --in-interface 指定数据包的来自的网卡,如 eth0
-o, --out-interface 指定数据包出去的网卡
-L, --list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则
# 添加规则
-A, --append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行,规则是由后面的匹配来指定
-I, --insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则,如果指定的规则号是 1,则在链的头部插入,这也是默认的情况,如果没有指定规则号
# 删除规则
-D, --delete chain rule-specification
-D, --delete chain rulenum 在指定的链 chain 中删除一个或多个指定规则
# 更新规则
-R, --replace chain rulenum rule-specification 替换/修改第几条规则
# 链管理命令(立即生效)
-P, --policy chain target 为指定的链 chain 设置策略 target,注意,只有内置的链才允许有策略,用户自定义的是不允许的
-F, --flush [chain] 清空指定链 chain 上面的所有规则,如果没有指定链,清空该表上所有链的所有规则
-N, --new-chain chain 用指定的名字创建一个新的链
-X, --delete-chain [chain] 删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则,如果没有指定链名,则会删除该表中所有非内置的链
-E, --rename-chain old-chain new-chain 用指定的新名字去重命名指定的链,这并不会对链内部照成任何影响
-Z, --zero [chain] 把指定链,或者表中的所有链上的所有计数器清零
-j, --jump target 规则执行动作,如 ACCEPT、DROP、REJECT
-n, --numeric 输出数字格式,IP、端口等
-h:显示帮助信息;
命令使用
清空所有规则和计数
iptables -F # 清空所有的防火墙规则
iptables -X # 删除用户自定义的空链
iptables -Z # 清空计数
设置默认的规则
iptables -P INPUT DROP # 配置默认的不让进
iptables -P FORWARD DROP # 默认的不允许转发
iptables -P OUTPUT ACCEPT # 默认的可以出去
配置白名单
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允许某个 IP 段访问
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许某个 IP 访问某个端口
开放指定的端口或者服务
iptables -A INPUT -p icmp -j ACCEPT # 允许 ping
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 接受已经建立的连接
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT # 允许本机访问本机
iptables -A OUTPUT -j ACCEPT # 允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许访问 80 端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许访问 22 端口
iptables -A INPUT -j REJECT # 禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT # 禁止其他未允许的规则访问
限制访问端口
iptables -A INPUT -p tcp --dport 80 -j DROP # 先禁止访问 22 端口
iptables -I INPUT -p tcp --dport 80 -s 1.1.1.1 -j ACCEPT # 在链的头部插入白名单规则
屏蔽 IP
iptables -I INPUT -s 123.45.6.7 -j DROP # 屏蔽单个 IP
iptables -I INPUT -s 123.0.0.0/8 -j DROP # 屏蔽整个段,即 123.0.0.1-123.255.255.254
iptables -I INPUT -s 124.45.0.0/16 -j DROP # 屏蔽 IP 段,即 123.45.0.1-123.45.255.254
iptables -I INPUT -s 123.45.6.0/24 -j DROP # 屏蔽 IP 段,即 123.45.6.1-123.45.6.254
列出已有的规则
iptables -nL
iptables -nvL # 详细信息
iptables -nL INPUT # 输出 INPUT 链上的规则
iptables -nL -t nat # 输出 nat 表上的规则
iptables -nL --line-numbers # 输出带编号的规则,用于删除某个编号的规则
清除已有的规则
iptables -F INPUT # 清空指定链 INPUT 上面的所有规则
iptables -X INPUT # 删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则,如果没有指定链名,则会删除该表中所有非内置的链
iptables -Z INPUT # 把指定链,或者表中的所有链上的所有计数器清零
删除指定的规则
iptables -nL --line-numbers # 获取要删除的规则编号
iptables -D INPUT 8 # 删除指定编号规则
规则保存与还原
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak
iptables-save > /etc/sysconfig/iptables
cat /etc/sysconfig/iptables
# 保存某个表的规则
iptables-save -t filter > iptables.bak
cat iptables.bak
# 还原已备份的规则
iptables-restore < iptables.bak
指定数据包出去的网卡
iptables -A FORWARD -o eth0
启动网络转发规则
公网 1.1.1.1
让内网 192.168.188.0/24
上网。
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 1.1.1.1
端口映射
本机的 2222 端口映射到内网虚拟机的 22 端口。
iptables -t nat -A PREROUTING -d 192.168.128.100 -p tcp --dport 2222 -j DNAT --to-dest 192.168.137.100:22
字符串匹配
比如过滤所有 TCP 连接中的字符串 test
,一旦出现就终止这个连接。
iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset
阻止 Windows 蠕虫的攻击
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"
防止 SYN 洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT