iptables

什么是iptables

iptables其实只是一个简称,其真正代表的是netfilter/iptables这个IP数据包过滤系统。为了简便,本文也将整套系统用iptables简称。iptables是3.5版本的Linux内核集成的IP数据包过滤系统。当系统接入网络时,该系统有利于在Linux系统上更好地控制IP信息包和防火墙配置。此外,iptables还可以进行NAT规则的管理。 上面有提到netfilter/iptables这个组合,这个组合中:

  • netfilter位于内核空间,是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集;而netfilter又是由内核中若干hook组成的,程序在执行到内核hook处时便会执行数据包过滤的相关逻辑。
  • iptables位于用户空间,是一种工具。该工具可以很便捷地对netfilter所维护的表数据进行修改。从而可以很便捷地控制数据包的过滤规则

执行顺序

什么是包过滤防火墙

包过滤防火墙在网络层截取网络数据包的包头(header),针对数据包的包头,根据事先定义好的防火墙过滤规则进行对比,根据对比结果,再执行不同的动作。 包过滤防火墙一般工作在网络层,所以也称为“网络防火墙”,通过检查数据流中每一个数据包的源ip地址,目标ip地址,源端口,目标端口,协议类型(tcp,udp,icmp等),状态等信息来判断是否符合规则

什么是NAT

NAT(Network Address Translation)网络地址转换,常用于局域网主机想与互联网服务通信时做地址转换,因为公网IP有限,且局域网主机访问公网必须要使用公网IP才可以访问到,因此使用NAT方法对地址做转换是一个很高效的方法。根据NAT使用场景不同可以将NAT分为SNAT(Source Network Address Translation)和DNAT(Destination Network Address Translation)

  • SNAT:用于局域网服务访问公网服务的场景。即将局域网发出的请求的原地址转换成NAT主机所拥有的公网IP地址,从而与公网服务进行通信
  • DNAT:用于公网请求访问局域网服务的场景。即将从公网接收到的请求的目的地址通过NAT规则所配置的局域网网段进行目标服务器局域网地址的转换,从而与局域网内服务通信

Netfilter Hooks

etfilter其实是内核中若干个Hook点组成的。数据包经过内核协议栈处理程序时,处理程序会触发内核模块注册在相关Hook点上的数据包处理函数。至于处理程序会触发哪个Hook函数,取决于当前数据包的方向(ingress/egress)数据包的目的地址数据包在上一个Hook点的状态等等。 内核中有关数据过滤的Hook点有如下几个:

  • NF_IP_PRE_ROUTING:接收到的数据包进行协议栈后立即触发此Hook,在进行任何路由判断之前;
  • NF_IP_LOCAL_IN:接收到的数据包经过了路由判断,如果目的地址是本机,将触发此Hook;
  • NF_IP_FORWARD:接收到的数据包经过了路由判断,如果目的地址是其他机器,将触发此Hook;
  • NF_IP_LOCAL_OUT:本机产生的准备发送的数据包,在进入协议栈之前立即执行该Hook;
  • NF_IP_POST_ROUTING:本机产生的准备发送的或者转发的数据包,在经过路由判断之后,将执行该Hook

注册处理函数时必须提供优先级,以便 hook 触发时能按照 优先级高低调用处理函数。这使得多个模块(或者同一内核模块的多个实例)可以在同一 hook 点注册,并且有确定的处理顺序。内核模块会依次被调用,每次返回一个结果给 netfilter 框架,提示该对这个包做什么操作

iptables 表和链(Tables and Chains)

iptables 使用 table 来组织规则,根据用来做什么类型的判断(the type of decisions they are used to make)标准,将规则分为不同 table。

在每个 table 内部,规则被进一步组织成 chain,内置的 chain 是由内置的 hook 触发 的。chain 基本上能决定(basically determin)规则何时被匹配。

下面可以看出,内置的 chain 名字和 netfilter hook 名字是一一对应的:

  • PREROUTING: 由 NF_IP_PRE_ROUTING hook 触发
  • INPUT: 由 NF_IP_LOCAL_IN hook 触发
  • FORWARD: 由 NF_IP_FORWARD hook 触发
  • OUTPUT: 由 NF_IP_LOCAL_OUT hook 触发
  • POSTROUTING: 由 NF_IP_POST_ROUTING hook 触发

Table

一共有五种table类型:

  • filter table: 过滤(放行/拒绝)

  • nat table:实现网络地址转换规则

  • manle table:修改IP头

  • raw table:conntrack 相关

  • security table:打SELinux标记

filter table

filter table 是最常用的 table 之一,用于判断是否允许一个包通过

在防火墙领域,这通常称作“过滤”包(”filtering” packets)。这个 table 提供了防火墙 的一些常见功能

filter表中有三条链:input、forward和output。

  • input:用来过滤进入主机的数据包;

  • forward:负责转发流经主机的数据包,起到转发的作用,和NAT关系很大。想要主机支持转发需要设置相关内核参数 / 将数据转发到本机的其他网卡设备上

    • net.ipv4.ip_forward=1 
      

      - output:用来处理从主机发出去的数据包。

      ### nat table

      `nat` table 用于实现网络地址转换规则。

      当包进入协议栈的时候,这些规则决定是否以及如何修改包的源/目的地址,以改变包被 路由时的行为。`nat` table 通常用于将包路由到无法直接访问的网络

      > nat表中有三条链:prerouting,postrouting和output

      - prerouting:在数据包到达netfilter系统时,在进行路由判断之前执行该链上的规则,作用是改变数据包的目的地址、目的端口等,起到DNAT的作用;
      - postrouting:数据包发出时,当数据包经过了路由判断后执行该链上的规则,作用是改变数据包的源地址、源端口等,起到SNAT的作用;
      - output:用来处理从主机发出去的数据包。

      ### mangle table

      `mangle`(修正)table 用于**修改包的 IP 头**。

      例如,可以修改包的 TTL,增加或减少包可以经过的跳数。

      这个 table 还可以对包打**只在内核内有效的**“标记”(internal kernel “mark”),后 续的 table 或工具处理的时候可以用到这些标记。标记不会修改包本身,只是在包的内核 表示上做标记。

      ### raw table

      **iptables 防火墙是有状态的**:对每个包进行判断的时候是**依赖已经判断过的包**。

      建立在 netfilter 之上的连接跟踪(connection tracking)特性**使得 iptables 将包 看作已有的连接或会话的一部分**,而不是一个由独立、不相关的包组成的流。 数据包到达网络接口之后很快就会有连接跟踪逻辑判断。

      ### 链(chain)

      filter表中有三条链:input、forward和output。

      - input:用来过滤进入主机的数据包
      - forward:负责转发流经主机的数据包,起到转发的作用,和NAT关系很大。想要主机支持转发需要设置相关内核参数
      - output:用来处理从主机发出去的数据包

      `raw` table 定义的功能非常有限,其**唯一目的就是提供一个让包绕过连接跟踪的框架**

      ### security table

      `security` table 的作用是给包打上 SELinux 标记,以此影响 SELinux 或其他可以解读 SELinux 安全上下文的系统处理包的行为。这些标记可以基于单个包,也可以基于连接

      ## 每种 table 实现的 chain(链)

      | Tables/Chains | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
      | :------------- | :--------- | :---- | :------ | :----- | :---------- |
      | (路由判断) | | | | Y | |
      | **raw** | Y | | | Y | |
      | (连接跟踪) | Y | | | Y | |
      | **mangle** | Y | Y | Y | Y | Y |
      | **nat (DNAT)** | Y | | | Y | |
      | (路由判断) | Y | | | Y | |
      | **filter** | | Y | Y | Y | |
      | **security** | | Y | Y | Y | |
      | **nat (SNAT)** | | Y | | Y | Y |

      **当一个包触发 netfilter hook 时,处理过程将沿着列从上向下执行**。触发哪个 hook(列)和包的方向(ingress/egress)、路由判断、过滤条件等相关

      ## Chain 遍历优先级

      假设服务器知道如何路由数据包,而且防火墙允许数据包传输,下面就是不同场景下包的游 走流程:

      - 收到的、目的是本机的包:`PRETOUTING` -> `INPUT`
      - 收到的、目的是其他主机的包:`PRETOUTING` -> `FORWARD` -> `POSTROUTING`
      - 本地产生的包:`OUTPUT` -> `POSTROUTING`

      ## 规则

      规则是最终影响数据包的地方,一条有效的规则必须由`匹配规则+动作目标`组成:

      - 匹配规则:提供了需要执行对应动作的目标匹配机制。通常可以匹配协议类型、目的地址、源地址、目的端口、源端口、目的网段、源网段、接收数据包的网卡、发送数据包的网卡、协议头、连接状态等。
      - 动作目标:又称为Target。是数据包满足匹配规则时触发的相应的动作。Target分为两种类型:终止目标和非终止目标

      ### 终止目标

      Linux内核提供如下的终止目标动作:

      | 动作 | 含义 |
      | ---------- | ------------------------------------------------------------ |
      | ACCEPT | 允许数据包通过 |
      | DROP | 直接丢弃数据包,不给任何回应信息,这时候[客户端](https://zhida.zhihu.com/search?q=客户端&zhida_source=entity&is_preview=1)会感觉自己的请求没有响应,过了超时时间才会有反应。 |
      | REJECT | 拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息 |
      | SNAT | 源地址转换,解决内网用户用同一个公网地址上网的问题 |
      | MASQUERADE | 是SNAT的一种特殊形式,适用于动态的、临时会变的ip上 |
      | DNAT | 目标地址转换 |
      | REDIRECT | 在本机做端口映射 |
      | LOG | 在/var/log/messages文件中记录日志信息(其实就是写入系统日志,通过dmesg也可以看到),然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配 |

      ### 特殊的非终止目标 —— Jumping Target

      那如果我想在不影响其他链的情况下使用自己定义的链,该如何操作呢?这时就可以在内置链上配置一个Jumping Target。实际上这里指定的就是我自定义的链的名字。例如下面的配置:

      ```text
      [root@localhost ~]# iptables -L
      Chain INPUT (policy ACCEPT)
      target prot opt source destination
      KUBE-FIREWALL all -- anywhere anywhere

      Chain KUBE-FIREWALL (2 references)
      target prot opt source destination
      DROP all -- anywhere anywhere /* kubernetes firewall for dropping marked packets */ mark match 0x8000/0x8000

上面的配置中,INPUT链的target为一条自定义的名为KUBE-FIREWALL的链,这样,从INPUT入口进入的数据包将会沿着链到达KUBE-FIREWALL链,然后将所有带有0x8000/0x8000标记的包丢弃。

Linux命令操作Iptables

链操作

# -N 新建链,自定义一条新的规则链
iptables -N test

# X 删除链,删除自定义的规则链;
# 仅能删除用户自定义的引用计数为0的空的链
iptables -X test

# -E 重命名,重命名自定义链;
#引用计数不为0的自定义链不能够被重命名,也不能被删除;
iptables -N testrn
iptables -E testrn testrename

# -P 默认策略,设置默认策略
# 对filter表中的链而言,其默认策略有
# ACCEPT:接受
# DROP:丢弃
# REJECT:拒绝
iptables -P INPUT DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

规则管理

# -A 追加规则,在已有规则后追加规则
# 增加一条拒绝80端口的规则
iptables -A INPUT -p tcp --dport 80 -j REJECT

# -R 替换规则,替换指定链上的指定规则
# 使用-R命令修改拒绝80端口的规则为接受访问
iptables -R INPUT 2 -p tcp --dport 80 -j ACCEPT

# -I 插入规则,要指明位置,省略时表示第一条
# 不指定位置
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
# 指定位置2
iptables -I INPUT 2 -p tcp --dport 443 -j ACCEPT

# -D:delete,删除规则按照规则序号或规则本身
[root@note1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
2 882 55100 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
# 序号删除
iptables -D INPUT 2
# 指定规则删除
ptables -D INPUT -p tcp --dport 3306 -j ACCEPT


# -Z 置零
# iptables的每条规则都有两个计数器:
# (1) 匹配到的报文的个数;pkts
# (2) 匹配到的所有报文的大小之和;bytes
[root@note1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 11 packets, 774 bytes)
num pkts bytes target prot opt in out source destination
1 1028 63752 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
[root@note1 ~]# iptables -Z INPUT
[root@note1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 6 364 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
[root@note1 ~]#

# -F 清空规则链

基础

# 查看Filter表中所有链以及规则
# -n:将主机信息(IP地址,端口等)以数字的形式打印出来。默认会以hostname等方式打印出来; -L:显示规则链中已有的条目; --line-numbers:显示条目序号
iptables -nL --line-numbers

# 保存当前系统iptables规则
iptables-save > $HOME/iptables-save.bak

新增


# 向filter表的INPUT链中新增拒绝所有来自192.168.1.1的数据包并指定其序号为2
#-I:表示insert,即向链中插入一条规则,INPUT为链名,2为规则的序号; -s: 代表匹配源地址; -j:规则目标(Target),DROP代表丢弃所有包
iptables -I INPUT 2 -s 192.168.1.1/32 -j DROP

# 向filter表的INPUT链中追加一条拒绝所有发送到192.168.1.1的数据包
# -A:表示append,即向链末尾追加一条规则; -d:代表匹配目的地址。
iptables -A INPUT -d 192.168.1.1/32 -j DROP

# 在nat表的PREROUTING链中新增一条序号为1的LOG规则
# -I:表示insert,即向链中插入一条规则,PREROUTING为链名,没有指定序号默认为1,即顶部插入; -j:规则目标(Target),LOG代表获取数据包并打印日志; --log-prefix:日志信息的前缀,只能在-j LOG的情况下使用。可以通过man iptables-extensions查看其他针对某个Target的配置使用方式
iptables -I PREROUTING -t nat -j LOG --log-prefix "[NAT_PREROUTING_LOG]"

删除

# 删除filter表的INPUT链中拒绝所有来自192.168.1.1的数据包的规则
iptables -D INPUT -s 192.168.1.1/32
# -D:表示delete,即从链中删除相关规则
iptables -D INPUT -s 192.168.1.1/32

# 删除filter表的INPUT链中序号为2的规则
# -D:表示delete,即从链中删除相关规则,链名后面可以接数字,表示删除某个序号。序号怎么获取可以在查看链规则时使用--line-numbers选
iptables -D INPUT 2

修改

# 在filter表的INPUT链上对所有经过路由选择后判定为发给本机的数据包做跳转至KUBE-NODE-PORT链的操作
# -m:表示match,这里涉及到iptables扩展的用法,即包匹配扩展模块(extended packet matching modules)。这里使用的addrtype意思是通过选项指定的地址类型进行匹配,结合--dst-type不难得知:当数据包的目的地址类型是本机时,则该包匹配该规则。
iptables -I INPUT -m addrtype --dst-type LOCAL -j KUBE-NODE-PORT

example

# 实现所有192.168.1.0/24的地址通过123.123.123.123公网地址访问公网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 123.123.123.123

# 拒绝一分钟内新建超过4次SSH连接的IP再次连接
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH --rsource -j DROP

扩展模块选项

  • iptables可以使用带有-m或–match选项的扩展包匹配模块,后跟匹配模块名称;之后,根据特定的模块,可以使用各种额外的命令行选项。您可以在一行中指定多个扩展匹配模块,并且可以在指定模块以接收特定于该模块的帮助后使用-h或–help选项。扩展匹配模块按照规则中指定的顺序进行计算

  • 隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块,即
    有的模块只需要指定协议名称,不需要指定模块名称,这样在定义协议时,间接的使用了模块,如TCP、UDP、icmp协议,因为协议名与模块名同名;

    显示扩展:必须使用-m选项指明要调用的扩展模块的扩展机制(手动指定引用的模块名称),要手动加载扩展模块

    rpm -ql iptables #查看iptables所支持的模块

tcp模块

iptables -A INPUT -s 192.168.39.6 -p tcp --dport 80 -j ACCEPT
#filter表input链添加一条规则,允许192.168.39.6通过tcp协议访问本机的80端口;-p指定tcp协议时间接使用了tcp模块

iptables -A INPUT -s 192.168.39.6 -p tcp --dport 80:90 -j ACCEPT
#允许192.168.39.6通过tcp协议访问本机的80-90之间的所有端口;连续的端口号只会占用一条规则

iptables -A INPUT -s 192.168.39.100 -p tcp --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
#filter表input链添加规则,指定192.168.39.100三次捂手的第一次握手直接拒绝;指定6个标记位,三次握手的第一次握手只有SYN标记位为1,其余都为0,所以最后的SYN表示为SYN为1;标记位只属于TCP协议,所以需要指定协议为TCP;第二次握手为SYN,ACK为1,其余为0;第三次握手为ACK为1,其余为0;并且标记位不存在6个都为1或者都为0的报文

iptables -A INPUT -s 192.168.39.100 -p tcp --syn -j REJECT
#--syn也表示三次握手的第一次握手,即只检查6个标记位中的4个,并且syn位为1

icmp模块

#filter表input链添加规则,允许客户端ping的响应报文;icmp协议中,type为0的表示为响应报文,为8的表示为请求报文;间接引用了icmp模块
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT

multiport模块

#filter表input链添加规则,允许客户端通过TCP协议访问3306和80端口;multiport模块的作用是指定多个不连续的端口,并且只会生成一条规则,不会生成多余的规则;离散端口最多能指定15个
iptables -A INPUT -p tcp -m multiport --dports 80,3306 -j ACCEPT

string模块

# iptables虽然不是应用层防火墙,但是也可以通过string模块分析数据报文中的特定关键字
--algo {bm|kmp} 字符串匹配检测算法
--from offset 指定数据帧的开始偏移位置
--to offset 指定数据帧的结束偏移位置
--string pattern 要检测的字符串模式

# filter表output链添加规则,拒绝客户端访问的站点页面内容中带有google关键字的页面;此规则需要设置在output链上,此规则只针对站点页面的内容,所以客户端在访问时,请求报文中是不带有站点页面内容的,只有回复报文中才包含页面内容,并且回复报文的源端口为本机的80端口
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT

time模块

# 通过time模块定义具体时间的访问策略
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 开始日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 结束日期
--timestart hh:mm[:ss] 开始时间
--timestop hh:mm[:ss] 结束时间
--monthdays day[,day...] 每个月的几号
--weekdays day[,day...] 星期几,1 – 7 分别表示星期一到星期日
--kerneltz:内核时区,不建议使用,不设置此选项CentOS7系统默认为UTC,设置规则时需要+8小时;centos6不支持--kerneltz,centos6默认就是当地时间,不需要进行转换;

#filter表input链添加规则,拒绝所有客户端在周六、周日的早9点到晚6点访问本机的所有地址
iptables -A INPUT -m time --timestart 1:00 --timestop 10:00 --weekdays Sat,Sun -j DROP

connlimit模块

# 根据每个客户端IP做并发连接数数量匹配限制,可防止Dos(Denial of Service,拒绝服务)攻击
--connlimit-upto 连接的数量小于等于多少时匹配
--connlimit-above 连接的数量大于多少时匹配

#filter表input链添加规则,当每个客户端IP访问tcp80端口,并发连接超过100时,拒绝访问
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j REJECT

limit模块

limit模块可以限制报文收发速率
--limit #[/second|/minute|/hour|/day] #限制收发报文速率
--limit-burst number #指定前多少个报文不限制

1、iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
#filter表input链添加规则,指定每分钟接收20个报文,并且前5个报文不进行限制

2、iptables -A INPUT -j REJECT
#需要配合此条规则一起使用,否则第一条规则不成立,默认会全部允许访问

state模块

通过state状态跟踪模块,判断新旧用户发起的请求,从而进行访问控制;

状态有如下几种:
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求,即new为一次连接的第一个请求;如断开连接后,重新建立连接,再次发送请求,此请求也为new;
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态,即一次连接第一次请求之后的请求都为ESTABLISHED;
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系;
INVALID:无效的连接,如flag标记位不正确,如TCP6个标记位都为0或者都为1;
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪;

1、iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
#ESTABLISHED为已经建立连接的,RELATED为与已有连接相关的连接,这两个状态都代表老用户;允许老用户通过tcp协议访问22端口

2、iptables -A INPUT -j REJECT #配合第一条规则使用,拒绝新用户连接22端口

###注意
连接跟踪功能是通过conntrack模块实现的,通过“lsmod | grep conntrack”查看内核中是否加载了该模块,此模块会因为iptables规则中调用了state模块,则内核会自动加载conntrack模块,否则不会加载此模块
/proc/net/nf_conntrack #此文件为跟踪库,记录了连接过本机的IP,但是记录在内存中,终究是有极限的

/proc/sys/net/nf_conntrack_max #此文件记录了最大跟踪连接的数量,超过此文件数量的连接将会被拒绝;连接跟踪会占用较多内存,加大系统负载

/proc/sys/net/netfilter/ #此目录下的文件记录了各个协议的连接超时时长


conntrack连接跟踪模块还有另外一个功能,ftp的被动模式开启的端口不固定,这样在防火墙策略中不方便开启端口,跟踪模块可以通过分析ftp协议的21端口,通过分析命令通道获取到被动模式所要开启的数据通道端口号,需要让内核加载一个能够分析ftp协议的conntrack跟踪模块,具体步骤如下:
1、modprobe nf_conntrack_ftp #使内核加载能够分析ftp协议的conntrack跟踪模块

2、iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已经建立连接或和已有连接相关的连接访问;连通21端口,后续连接都算ESTABLISHED或RELATED;

3、iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许客户端访问tcp的21端口

4、iptables -A INPUT -J REJECT

state

state模块允许访问此数据包的连接跟踪状态。

  • NEW: 新连接请求;
  • ESTABLISHED:已建立的连接;
  • INVALID:无法识别的连接;
  • RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;
  • UNTRACKED:未追踪的连接;

state内核模块装载:

nf_conntrack
nf_conntrack_ipv4

手动装载

nf_conntrack_ftp

追踪到的连接

/proc/net/nf_conntrack

调整可记录的连接数量最大值

/proc/sys/net/nf_conntrack_max

超时时长

/proc/sys/net/netfilter/timeout

保存、重载

保存:iptables-save > /PATH/TO/SOME_RULE_FILE

重载:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交