Skip to content

iptables

netfilter/iptables(简称 iptables)组成 Linux 平台下的包过滤防火墙 。iptables 组件是一种工具,也称为用户空间,它使插入、修改和除去信息包过滤表中的规则变得容易

基础信息

  • 五链

链就是从报文进入到报文离开这整个期间,计算机处理报文的关键环节

说明
INPUT处理入站数据包,匹配目标IP为本机的数据包
OUTPUT处理出站数据包,一般不在此链上做配置
FORWARD处理转发数据包,匹配流经本机的数据包
PREROUTING在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网中的80端口映射到路由器外网端口上
POSTROUTING在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网
  • 四表

在每个链上都有一堆规则,但是部分规则是相似的,那我们把一些实现相同功能的规则放在一起,就能轻松的完成复用了

说明
raw确定是否对该数据包进行状态跟踪。包含两个规则链,OUTPUT、PREROUTING
mangle修改数据包内容,用来做流量整形的,给数据包设置标记。包含五个规则链,INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
nat负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链,OUTPUT、PREROUTING、POSTROUTING
filter负责过滤数据包,确定是否放行该数据包(过滤)。包含三个规则链,INPUT、FORWARD、OUTPUT
  • 网络流量的五元组
元组说明
S_IP源 IP
S_PORT源端口
D_IP目的 IP
D_PORT目的端口
TCP/UDP四层协议
  • 处理动作
动作说明
ACCEPT允许数据包通过
DROP直接丢弃数据包。不回应任何信息,客户端只有当该链接超时后才会有反应
REJECT拒绝数据包。会给客户端发送一个响应的信息
SNAT源 NAT,解决私网用户用同一个公网 IP 上网的问题
MASQUERADE是 SNAT 的一种特殊形式,适用于动态的、临时会变的 IP 上
DNAT目的 NAT,解决私网服务端,接收公网请求的问题
REDIRECT在本机做端口映射
LOG在 /etc/log/messages 中留下记录,但并不对数据包进行任何操作

用法

shell
iptables + -t 表名 + 规则/链管理参数 + 匹配参数 + 动作类型参数
shell
#  选择表
-t  #  对指定表进行操作(必须是 raw、nat、filter、mangle 中的一个。如没有指定则默认为 filter表)

#  规则管理
-A  #  在指定规则链的末尾加入新规则
-I  #  在指定规则链的头部加入新规则(默认在第一行添加)
-D  #  删除指定链中的一条规则(可按规则序号和内容删除)
-R  #  修改、替换指定链中的某一条规则(可按照规则序号和内容替换)

#  链管理
-P  #  设置指定链默认策略
-N  #  新建一条用户自己定义的规则链
-X  #  删除指定表中用户自定义的规则链
-E  #  重命名用户定义的链(不改变链本身)
-Z  #  将所有表的所有链的字节和数据包计数器清零

#  规则链
INPUT       #  处理入站的数据包
OUTPUT      #  处理出站的数据包
FORWARD     #  处理转发的数据包
PREROUTING  #  处理入站的路由规则
POSTROUTING #  处理出站的路由规则

#  匹配(加感叹号 “!“表示这个目标除外(加感叹号后需加空格后在加匹配项))
-s  #  匹配来源地址 IP/MASK
-d  #  匹配目标地址
-i  #  网卡名称(匹配从这块网卡流入的数据)
-o  #  网卡名称(匹配从这块网卡流出的数据)
-m  #  使用扩展模块
-p  #  匹配协议(如:tcp、udp、icmp)
    tcp     #  扩展选项:--source-port (扩展选项可用 iptables -p tcp -h 查看)
    udp     #  扩展选项:--source-port (扩展选项可用 iptables -p icmp -h 查看)
    icmp    #  可用扩展:  --icmp-type  (可用扩展可用 iptables -p icmp -h 查看)
    --dport 80  #  匹配目标端口 80
    --sport 81  #  匹配来源端口 81

#  指定动作类型
-j  #  指定动作类型
    动作类型:
    ACCEPT      #  允许数据包通过
    REJECT      #  拒绝数据包通过(必要时会发送响应信息)
    DROP        #  直接丢弃(不给出任何回应)
    QUEUE       #  中断过滤程序,将封包放入队列,交由其它程序处理
    RETURN      #  停止当前链中的后续规则,并返回到调用链(the calling chain)中
    REDIRECT    #  在本机上做端口映射
    DNAT        #  改变数据包的目的地址
    SNAT        #  改变数据包的源地址
    MASQUERADE  #  SNAT 的一种特殊形式,适用于动态、临时会变的 IP 上(只能用户 nat 表的 POSTROUTING 链)
    LOG         #  在 /var/log/messages 文件中记录日志信息,然后在将数据包传递给下一条规则

#  查看/清空 规则
-L  #  列出指定链中所有的规则
-n  #  IP地址和端口会一数字的形式打印
-v  #  详细输出
-F  #  清空规则链
  • 使用实例
shell
iptables -L             #  列出所有规则
iptables -L -nv         #  查看详细信息(IP 跟 端口会以数字形式显示)
iptables -t nat -L      #  列出 nat 表中的所有规则
iptables -t nat -L -nv  #  查看详细信息(IP 跟 端口会以数字形式显示)
iptables -F             #  清除所有规则(如不指定表,则默认表为 filter)
iptables -t nat -D INPUT 1  #  删除 nat 表 INPUT 链下的第一条规则
  • 清空所有规则 (在 iptables 工作异常时全尝试)
shell
# 备份规则:
iptables-save > ~/iptables_backup.txt
# 清空规则:
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
# 自行重启可能影响的嗠,比如: docker, containerd

Released under the MIT License.