iptables

9/4/2022

注意

在参照本文进行iptables实验时,请务必在个人的测试机上进行。

# 简介

Linux 系统自带的防火墙工具 iptables

iptables 默认维护着 4 个表和 5 个链。

四表是指 iptables 的功能,默认的 iptables 规则表有 filter 表(过滤规则表)、nat 表(地址转换规则表)、mangle(修改数据标记位规则表)、raw(跟踪数据表规则表)

五链是指内核中控制网络的 NetFilter 定义的 5 个规则链。每个规则表中包含多个数据链:INPUT(入站数据过滤)、OUTPUT(出站数据过滤)、FORWARD(转发数据过滤)、PREROUTING(路由前过滤)和POSTROUTING(路由后过滤)

# 查看规则

# 查看指定表中的规则

查看 filter 表的所有规则 iptables -t filter -nvL

# 查看指定表中的指定链上的规则

查看 filter 表的 INPUT 链的规则 iptables --line-numbers -t filter -nvL INPUT

# 1.参数说明

  • --line-numbers 表示显示规则的编号。
  • -t 指定要操作的表,默认操作 filter 表,如果要操作 nat 表,可以使用 -t nat 参数。
  • -n 表示不对IP地址进行名称反解,直接显示IP地址,显示速度会加快。
  • -v 表示输出详细信息,包含通过该规则的数据包数量、总字节数以及相应的网络接口。
  • -L 表示查看当前表的所有规则。

# 增加规则

# 常用的处理动作

  • ACCEPT:允许数据包通过。
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
  • DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。

# 不指定IP

# 开放某个端口

允许所有ip访问80端口

iptables -I INPUT -p tcp --dport 80 -j ACCEPT

# 开放多个端口

允许所有ip访问80,443和1024以上的端口

iptables -I INPUT -p tcp -m multiport --dport 80,443,1024:65535 -j ACCEPT

# 指定某个IP(白名单或黑名单)

# 允许 指定的ip访问服务器的所有端口

iptables -I INPUT -s 1.12.219.198 -j ACCEPT

# 允许 指定的IP访问服务器的指定端口

iptables -I INPUT -s 1.12.219.198 -p tcp --dport 22 -j ACCEPT

iptables -I INPUT -s 1.12.219.198 -p tcp --dport 3306 -j ACCEPT

# 指定多个IP(白名单或黑名单)

# 拒绝 指定的多个IP访问服务器的所有端口

iptables -I INPUT -s 10.0.8.3,1.12.219.198 -j REJECT

注意:多个IP之间必须用逗号相连,逗号两侧均不能包含空格

# 拒绝 指定的IP段访问服务器的指定端口

iptables -I INPUT -s 172.26.0.0/16 -p tcp --dport 21 -j REJECT

  • 172.0.0.0/8 #封整个IP段即从172.0.0.1到172.255.255.254
  • 172.26.0.0/16 #封部分IP段即从172.26.0.1到172.26.255.254
  • 172.26.4.0/24 #封部分IP段即从172.26.4.1到172.26.4.254

# 2.参数说明

  • -I:表示在链的首部插入规则
  • -A:表示在链的尾部追加规则
  • -s:报文的源地址
  • -p:指定需要匹配的报文的协议类型
  • –dport:表示tcp扩展模块中的一个扩展匹配条件,可用于匹配报文的目标端口
  • -j:满足“匹配条件”时执行的动作,在iptables中,处理动作被称为target

# iptables的工作机制

规则的顺序很重要: 如果报文已经被前面的规则匹配到,iptables则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,很有可能也没有机会再对报文执行相应的动作了。

# 指定新增规则的编号

iptables -I INPUT 2 -s 1.12.219.198 -j DROP

# 删除规则

# 根据规则的编号去删除规则

删除 filter 表中 INPUT 链上的第 3 条规则

iptables -D INPUT 3

# 根据具体的匹配条件与动作删除规则

删除 filter 表中 INPUT 链上源地址为 1.12.219.198,动作为 ACCEPT 的规则

iptables -D INPUT -s 1.12.219.198 -j ACCEPT

# 清空规则(慎用)

清空指定表中某条链上的所有规则 iptables -t 表名 -F 链名

清空指定表中所有链上的所有规则 iptables -t 表名 -F

# 3.参数说明

参照 增加规则

# 修改规则

# 4.参数说明

  • -R:表示修改指定的链上的规则,在修改规则时指定规则对应的编号即可(有坑,慎行)

# 修改示例

将 “filter 表中 INPUT 链上源地址为 1.12.219.198,动作为 ACCEPT” 的规则动作改为 REJECT(假设为第一条规则)

iptables -R INPUT 1 -s 1.12.219.198 -j REJECT

注意:上例中,-s选项以及对应的源地址不可省略!

说明:即使我们已经指定了规则对应的编号,但是在使用 -R 选项修改某个规则时,必须指定规则对应的原本的匹配条件(如果有多个匹配条件,都需要指定)。

建议: 可以先将这条规则删除,然后在同样位置再插入一条新规则。

# 修改指定链的“默认策略”

iptables -t 表名 -P 链名 策略

默认禁止所有人访问 iptables -P INPUT DROP

# 保存规则

在默认的情况下,我们对“防火墙”所做出的修改都是“临时的”,换句话说就是,当重启iptables服务或者重启服务器以后,我们平常添加的规则或者对规则所做出的修改都将消失,为了防止这种情况的发生,我们需要将规则“保存”。

# 方法一

将指令写入系统自启动文件,如 /etc/rc.local 或 sh 脚本等。

# 方法二

安装相应持久化工具辅助,如 iptables-persistent 或 iptables-services 等。所以一般可以使用更上层的工具来配置,如 ufw 或 firewalld。

# 参考

iptables零基础快速入门系列 (opens new window)

Last Updated: 9/4/2022, 5:46:33 PM