4

iptables 学习总结

 3 years ago
source link: http://yangxikun.com/2020/06/20/iptables.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

iptables 学习总结

20 June 2020

参考文章:朱双印 iptables

防火墙概念

逻辑分类:

  • 主机防火墙:对单个主机进行防护
  • 网络防火墙:通常处于网络的入口/出口,服务于其背后的局域网

物理分类:

  • 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高
  • 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低

iptables 概念

iptables 是一个客户端程序,与内核空间的 netfilter 交互。

netfilter 是集成到 linux 内核协议栈中的一套防火墙系统,用户可通过运行在用户空间的 iptables 来把相关配置下发给 netfilter。

netfilter 分为多个模块,各个模块的用户空间配置工具为:

  • 链路层:ebtables
  • 网络层ipv4:iptables
  • 网络层 ipv6:ip6tables
  • 专门用于 ARP 协议:arptables

wikipedia 关于 netfilter 中数据包的流图:

Netfilter-packet-flow.svg

网络层部分的流图:

iptables.png
iptables 中的链

从流图的视角,可以看到一共有 5 条链,每条链上会有按顺序串联的表。当数据包到达某条链时,会顺序执行每张表中的规则。

这 5 条链实际上就是 netfilter 提供的在数据包流转路径上的 HOOK。

iptables 中的表

表用于聚合某种类型的规则,从 iptables 客户端的视角,一共有 4 张表,每张表里会有该表可以附加上去的链。

  • filter:负责过滤功能,防火墙;内核模块:iptables_filter
  • nat:network address translation,网络地址转换功能;内核模块:iptable_nat
  • mangle:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
  • raw:关闭nat表上启用的连接追踪机制;iptable_raw

所以我们是通过 iptables 对某张表上的某条链的规则进行增删改。

iptables 中的规则

规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理。

匹配条件:

  • 基本匹配条件:
    • 源地址 Source IP
    • 目标地址 Destination IP
  • 扩展匹配条件:由扩展模块提供,比如 tcp 模块支持端口匹配

处理动作:

  • ACCEPT:允许数据包通过
  • DROP:直接丢弃数据包,不给任何回应信息
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息
  • SNAT:源地址转换,需要指定转换的 ip,解决内网用户用同一个公网地址上网的问题
  • MASQUERADE:是 SNAT 的一种特殊形式,适用于动态的、临时会变的 ip 上,指定使用某张网卡上的 ip 用于转换
  • DNAT:目标地址转换
  • REDIRECT:在本机做端口映射
  • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配
  • RETURN:如果在自定义链中命中,将会返回上一级链继续往下匹配;如果在默认链中命中,将会执行默认链的 policy

在一张表的某条链上的多条规则会被顺序执行,当有一条规则匹配成功了,且处理工作不是 LOG,之后的规则不会再执行。

在一张表的每条链上可以设置默认的处理动作,即但没有匹配到规则时,执行链的默认处理动作。

iptables 操作

  • iptables -t filter –line-numbers -nvxL
    • -t 指定查询的表,默认 filter
    • –line-numbers 显示规则编号
    • -n 显示 IP 地址,而不是名称解析
    • -v 显示详细信息
      • pkts: 对应规则匹配到的报文的个数
      • bytes: 对应匹配到的报文包的大小总和
      • target: 规则对应的target,往往表示规则对应的”动作”,即规则匹配成功后需要采取的措施
      • prot: 表示规则对应的协议,是否只针对某些协议应用此规则
      • opt: 表示规则对应的选项
      • in: 表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则
      • out: 表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则
      • source: 表示规则对应的源头地址,可以是一个IP,也可以是一个网段
      • destination: 表示规则对应的目标地址。可以是一个IP,也可以是一个网段
    • -x 显示精确的值,而不是经过可读性优化过的计数值
  • iptables -A INPUT -s 192.168.1.3 -j ACCEPT
    • 在 filter 表的 INPUT 链尾追加规则
  • iptables -I INPUT -s 192.168.1.3 -j ACCEPT
    • 在 filter 表的 INPUT 链头插入规则
  • iptables -I INPUT 2 -s 192.168.1.3 -j ACCEPT
    • 在 filter 表的 INPUT 链位置 2 插入规则
  • iptables -D INPUT 3
    • 删除 filter 表的 INPUT 链的规则 3
  • iptables -D INPUT -s 192.168.1.3 -j ACCEPT
    • 删除 filter 表的 INPUT 链中源地址为 192.168.1.146,动作为 ACCEPT 的规则
  • iptables -t 表 -F 链
    • 清空表中的某条链
  • iptables -t 表 -F
    • 清空表中的所有链
  • iptables -R INPUT 1 -s 192.168.1.3 -j ACCEPT
    • 修改 filter 表的 INPUT 链规则 1
    • -s 如果省略的话,默认会修改为 0.0.0.0/0
  • iptables -P FORWARD DROP
    • 修改 filter 表的 FORWARD 链默认处理动作
  • 安装并启动服务 netfilter-persistent
    • 执行 netfilter-persistent save
    • 规则会保存到 /etc/iptables/rules.v4
  • 匹配 IP 地址:
    • -s 192.168.1.3,192.168.1.4
    • -s 192.168.1.0/24
    • ! -s 192.168.1.3
  • 匹配协议
    • -p tcp
    • 可选的值:tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh, all
  • 匹配网卡接口
    • -i 流入数据包的网卡
    • -o 流出数据包的网卡
  • 扩展匹配条件,需要相应的协议模块支持
    • 端口号:
      • -p tcp -m tcp –sports 80 –dports 8080:65535
        • 无法同时指定多个离散的、不连续的端口
      • -p tcp -m multiport –sports 80,81,82:88 –dports 8080:65535
        • multiport 扩展只能用于 tcp 协议与 udp 协议
    • iprange:连续 IP 地址范围
      • iptables -I INPUT -m iprange –src-range 192.168.1.3-192.168.1.8 -j DROP
    • string:字符串匹配
      • iptables -I INPUT -m string –algo bm –string “OOXX” -j REJECT
    • time:时间相关
      • iptables -I INPUT -m time –timestart 09:00:00 –timestop 18:00:00 -j REJECT
    • connlimit:连接数
      • iptalbes -I INPUT -p tcp –dport 22 -m connlimit –connlimit-above 2 -j REJECT
    • limit:速率限制
      • iptables -I INPUT -p icmp -m limit –limit 10/minute -j ACCEPT
      • iptables -A INPUT -p icmp -j REJECT
    • –tcp-flags:根据 TCP 协议头中的 Flags 匹配
      • iptables -t filter -I INPUT -p tcp -m tcp –dport 22 –tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
        • 拒绝第一次握手请求
        • –tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN 可缩写为 –syn
    • icmp:
      • iptables -t filter -I INPUT -p icmp -m icmp –icmp-type 8/0 -j REJECT
    • state:只要两台机器在”你来我往”的通信,就算建立起了连接
      • “连接”其中的报文可以分为5种状态:
      • NEW:连接中的第一个包,状态就是NEW,我们可以理解为新连接的第一个包的状态为NEW
      • ESTABLISHED:我们可以把 NEW 状态包后面的包的状态理解为 ESTABLISHED,表示连接已建立
      • RELATED:ftp 中数据连接中的报文与命令连接中的报文关系
      • INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是 INVALID,我们可以主动屏蔽状态为 INVALID 的报文
      • UNTRACKED:表示报文未被追踪,无法找到相关的连接
    • set:ipset 管理的集合
      • iptables -I INPUT -m set –match-set setname src -p tcp –destination-port 80 -j DROP

iptables 自定义链

自定义链用于复用规则,以及方便管理大量规则。

  • 创建:iptables -t filter -N IN_WEB
  • 引用:iptables -t filter -I INPUT -p tcp –dport 80 -j IN_WEB
  • 重命名:iptables -E IN_WEB WEB
  • 删除:iptables -X WEB
    • 需要先删除引用和清空规则

iptables 处理动作

  • REJECT:使用–reject-with选项,可以设置提示信息,当对方被拒绝时,会提示对方为什么被拒绝。
    • icmp-net-unreachable
    • icmp-host-unreachable
    • icmp-port-unreachable:默认
    • icmp-proto-unreachable
    • icmp-net-prohibited
    • icmp-host-prohibited
    • icmp-admin-prohibited
  • LOG:
    • –log-level:选项可以指定记录日志的日志级别,可用级别有emerg,alert,crit,error,warning,notice,info,debug
    • –log-prefix:选项可以给记录到的相关信息添加”标签”之类的信息,以便区分各种记录到的报文信息,方便在分析时进行过滤
      • –log-prefix 对应的值不能超过29个字符
  • NAT:echo 1 > /proc/sys/net/ipv4/ip_forward
    • SNAT:
      • iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT –to-source 公网IP
      • iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADE
    • DNAT:iptables -t nat -I PREROUTING -d 公网IP -p tcp –dport 公网端口 -j DNAT –to-destination 私网IP:端口号
  • REDIRECT:
    • iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080
      • 访问本机的80端口时,会被映射到8080端口
  • MARK:
    • iptables -t mangle -A INPUT -m state –state NEW-j MARK –set-mark 1
      • 设置连接的 mark
  • CONNMARK:
    • iptables -t mangle -A INPUT -j CONNMARK –restore-mark
      • 把连接的 mark 设置到数据包中

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK