Hugh's Blog

iptables 使用

iptables 用于管理 Linux 防火墙配置,最近需要用到,作个记录。

主要内容来自:iptables 命令,Linux iptables 命令详解

四表五链

四表

  1. filter: iptables 默认表,具有链(INPUT、FORWARD、OUTPUT)

  2. nat: 用于 nat 功能,比如端口映射、地址映射等,具有链(PREROUTING、OUTPUT、POSTROUTING)

  3. mangle: 用户修改数据包,具有链(PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING)

  4. raw: 用于处理异常,具有链(PREROUTING、OUTPUT)

五链

  1. PREROUTING: 处理刚到达本机并在路由转发前的数据包,用于目标地址转换(DNAT)

  2. INPUT: 处理来自外部的数据

  3. FORWARDING: 处理转发的数据,将数据转发到本机的其他网卡设备上

  4. OUTPUT: 处理向外发送的数据

  5. 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

参考

iptables 命令,Linux iptables 命令详解