iptables 学习总结

参考文章: 朱双印 iptables

防火墙概念

逻辑分类:

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

物理分类:

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

iptables 概念

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

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

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

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

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

网络层部分的流图:

iptables 学习总结_第1张图片

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文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配

在一张表的某条链上的多条规则会被顺序执行,当有一条规则匹配成功了,且处理工作不是 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 链默认处理动作

保存:

规则匹配
  • 匹配 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 设置到数据包中

你可能感兴趣的:(iptables,习总)