Linux iptables

80 阅读5分钟

iptables 之中的表有哪些

  • filter
  • nat
  • mangle
  • raw 注意:

1:nat表的注意点 只有新连接的第一个数据包 才会流经 nat 表进行处理,此连接的数据包,后续都不会流经nat表的规则。

问题

1: 既然只有连接的第一个数据包 会流经nat表,那么后续的nat转换,背后的地址变换的原理是什么?

第一个数据流经 nat表,执行nat转换后,对应的转换信息会存储在 连接跟踪表之中,所以后续即使数据包不流经nat表,也是可以执行nat转换的。

iptables 之中链有哪些

  • PREROUTING
  • INPUT
  • FORWARD
  • POSTROUTING
  • OUTPUT

自定义链

注意:自定义链不能设置默认策略,它的默认策略是 RETURN

iptables 之中 表与链 的关系 是什么?

表含有某些链。具体哪些表含有哪些链,这里就不详细说了。 执行 iptables -t 表名 -L 可以查看 某些表具有哪些链。

数据包流转 与 iptables 的关系

注意:数据包流转 实质 与链之中的规则有关。不同的表具有相同的链,会按照固定的表顺序来进行规则匹配。raw -> mangle -> nat -> filter 会按照这个顺序,找出表之中的链,按照其中的规则进行匹配的。

接收数据包

服务器接收数据包-数据流向.png

发送数据包

服务器发送数据包-数据流向.png

转发数据包

服务器转发数据包-数据流向.png

Linux iptables 命令行工具

iptables 链上存储规则,规则就是 按照某些条件匹配数据包,对于匹配到的数据包执行动作,对于未匹配到的数据包也会有动作。所以关键点在于 匹配条件 动作。

参数

一般参数

  • -t 指定表名
  • --protocol 后面跟协议名 会对包的协议进行检查,只将规则应到到具有指定协议的包之中。
  • --destination 目的地址 例子 --destination port
  • --syn tcp扩展标志 指tcp新建连接的报文
  • -v 显示更详细信息
  • -n 对目标名称进行解析,获得具体的数字
  • --line-numbers 显示规则的编号
  • -D 删除

自定义链相关的参数

  • -N 后面跟自定义链的名字 使用场景:在某个表之中创建一条自定义链
  • -E 原有自定义链的名字 新自定义链的名字 使用场景: 修改自定义链名字
  • -X 自定义链名 使用场景:删除自定义链。 删除条件:1:自定义链引用计数为1 2:自定义链之中的规则为空。
  • -F 清空所选链

插入链的方式参数:

  • -I (insert的意思,后面跟随链的名字),在链的首部插入
  • -A 后面跟链的名字 增加的意思

匹配方面的参数

基本匹配条件:

  • -s (后面是跟源的ip地址,多个ip地址使用逗号隔开。也可以指定网段 10.0.0.1/16) ! -s 感叹号表示取反的意思
  • -d (后面跟随 目标ip地址) 注意:取反操作不能和多个ip地址一起使用。
  • -p 指定协议类型,目前支持的协议 tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
  • -i 指定网卡,匹配报文流入的网卡的。
  • -o 匹配报文将由哪块网卡流出

扩展匹配条件参数

  • -m 匹配,后面跟模块

模块有哪些

comment 模块

1: iptables comment 模块的作用? 对规则增加注释,当查询的时候,可以迅速知道规则的作用

使用例子:

    iptables -A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-WNBA2IHDGP2BOBGZ
statistic 模块

1: iptables statistic 模块的作用? 该模块根据某些统计条件匹配数据包。 参数: --mode mode : 设置匹配规则的匹配模式,支持的模式是随机的,第n个。 --probability p : 将数据包的概率从0设置为1,以便随机匹配。 它只适用于随机模式。 --every n : 每n个数据包匹配一个数据包。 它只适用于第n个模式(另请参阅--packet选项)。 --packet p : 设置第n个模式的初始计数器值(0 <= p <= n-1,默认为0)

使用例子:

   iptables -A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-WNBA2IHDGP2BOBGZ

动作方面的参数

  • -j

说明:

  • 1:后面跟随动作,当数据包匹配到规则时,如何执行。
  • 2: 还可以跳转到自定义的链上。

动作说明

  • ACCEPT : 接收数据包
  • DROP: 丢弃数据包
  • LOG : 打印日志
  • MASQUERADE:MASQUERADE则不用指定明确的IP,会动态的将报文的源地址修改为指定网卡上可用的IP地址。
  • SNAT:源ip地址转换,需要配合参数 --to-source(后面加ip 将匹配的ip转换成为后面的ip) 使用。
  • DNAT: 目的ip转换,需要配合参数 –to-destination(后面可以加ip:端口)使用。
  • MARK ** 1: MARK 动作的含义是什么? MARK将数据包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。

例子:

 iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

** 2: MARK 动作的过滤方式例子?其实就是匹配标记

 iptables -t nat -A PREROUTING -m mark --mark 33 -j ACCEPT

iptables 使用小例子

1: 写入规则 指定规则号

     iptables -t filter -I INPUT 2 -s 192.168.23.10 -j ACCEPT

2:丢失来源端口为5000 的tcp包

     iptables -t filter -A INPUT --protocol tcp --sport 5000 -j DROP

3: 丢失目标端口为 15000的tcp数据包

     iptables -t filter  -A INPUT --protocol tcp --dport 15000 -j DROP