讲一下iptables

2022年01月13日 阅读数:6
这篇文章主要向大家介绍讲一下iptables,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

iptables相关概念

iptables是运行在用户空间的应用软件,经过控制Linux内核netfilter模块,来管理网络数据包的处理和转发。它经过定义规则并交给内核中的netfilter即网络过滤器来读取,从而实现iptables的功能。它的做用有:html

  • ip数据包的条件过滤(防火墙,流量统计)
  • 重定向SNAT,DNAT(内外网访问)
  • 透明代理REDIRECT(代理服务器)

来看一个简单iptables的命令:android

iptables -t filter -A INPUT -i eth0 -p tcp -s X.X.X.X -j DROPweb

它表示在filter表INPUT链中增长一条规则,规则的条件是:shell

  • 数据包从指定网卡eth0进来
  • 数据包是采用tcp协议传输
  • 数据包的源地址为X.X.X.X

规则的动做是:知足上面条件的数据包直接进行丢弃。这里就涉及到表,链,规则的几个核心概念。理解iptables,核心是要先理解四表五链和规则的概念。表由链组成,链容纳各类规则,以下图所示:在这里插入图片描述服务器

四表

iptables内部(kernel的netfilter模块)维护四个Table,分别是filter, nat, mangle, raw, 他们分别对应不一样的功能。四表网络

如上图所示,四种内建规则表,优先级 raw > mangle > nat > filtertcp

规则表 描述
filter 1. 主要用于对数据包进行过滤
2. 表内包含三个链,INPUT,OUTPUT, FORWARD
nat 1. 主要用于修改数据包的ip地址,端口等信息(网络地址转换)
2. 表内包含三个链,PREROUTING, POSTROUTING, OUTOUT;
raw 1. 主要用于肯定是否对该数据包进行状态跟踪
2. 表内包含两个链,OUTPUT, PREROUTING;
mangle 1. 主要用于修改数据包的TOS,TTL以及数据包设置mark标记
2. 表内包含五个链,PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD

五链

iptables中的表是用于容纳规则链,iptables命令中设置数据过滤或处理数据包的策略就作规则,将多个规则合成一个链,叫作规则链。规则链依据处理数据包的位置不一样分类以下:ide

规则链 描述
PREROUTING 在进行路由判断以前所要进行的规则(DNAT/REDIRECT)
INPUT 处理入站的数据包
OUTPUT 处理出站的数据包
FORWARD 处理转发的数据包
POSTROUTING 在进行路由判断以后所要进行的规则(SNAT/MASQUERADE)

规则链的前后顺序:svg

  • 入站: PREROUTING -> INPUT
  • 出站: OUTPUT -> POSTROUTING
  • 转发: PREROUTING -> FORWARD -> POSTROUTING

下图就是数据包在表和规则链中的发送顺序。post

在这里插入图片描述

这里要注意一下PREROUTING和POSTROUTING的区别

一般内网到外网是post,外网到内网是pre,可是外和内只是个相对概念,在必定条件下是能够转换的。落实到网卡上,对于每一个网卡数据流入的时候必然通过pre,数量流出必然通过post。最要紧的是咱们要记住PREROUTING是“路由规则”以前的动做,POSTROUTING是“路由规则”以后的动做

源地址发送数据–> {PREROUTING–>路由规则–>POSTROUTING} -->目的地址接收到数据。 因此这就是为何咱们打标签是在mangle表的PREROUTING链。

规则

规则(rules)是iptables过滤数据包的具体方法和策略。

  • rules包含一个条件和一个目标。
  • 若是条件知足,就执行目标中的规则或者特定动做
  • 若是不知足,就判断下一条rule。

目标动做: ACCEPT, DROP, REJECT, LOG, SNAT, DNAT, MARK, RETURN, MASQUERADE。

目标 动做
ACCEPT 容许数据包经过
DROP 直接丢弃数据包,不给任何回应信息
REJECT 拦阻该数据包,并传达封包通知对方
REDIRECT 将数据包从新导向另外一个端口(PNAT)
LOG 保存数据包信息记录
SNAT 改写数据包的来源IP
DNAT 改写数据包的目的IP
MARK 将数据包打上标记
RETURN 结束目前规则链中的过滤程序
MASQUERADE 改写数据包源IP为网卡IP

如今来看看ACCEPT,DROP,REJECT,RETURN的执行流程。

ACCEPT

匹配到目标为ACCEPT的rule时的执行顺序,将数据包放行而且不在对比同一链其余规则,直接跳往下一个规则链。
在这里插入图片描述

DROP

匹配到目标为DROP的rule时的执行顺序,丢弃数据包不予处理,而且再也不对比其余规则,直接中断数据过滤程序。
在这里插入图片描述

REJECT

匹配到目标为REJECT的rule时的执行顺序,阻拦数据包并传送数据包通知对方,再也不对比其余规则,直接中断过滤程序。返回的数据包有:ICMP port-unreachable, ICMP echo-reply, tcp-reset。

在这里插入图片描述

RETURN

匹配到目标为RETURN的rule时的执行顺序,结束在目前规则链中的过滤程序,返回主规则链继续过滤。

在这里插入图片描述

SNAT

匹配到Target为SNAT的rule时的执行顺序(同ACCEPT), 改写数据包源IP为某特定IP或IP范围,能够指定port范围,处理完动做后,将直接跳往下一个规则链。

DNAT

匹配到Target为DNAT的rule时的执行顺序(同ACCEPT), 改写数据包目的IP为某特定IP或IP范围,能够指定port范围,处理完动做后,将直接跳往下一个规则链。(同ACCEPT)

MARK

匹配到Target为MARK的rule时的执行顺序, MARK将数据包标上标记数,以便做为后续过滤条件的判断依据,处理完此动做后,将会继续比对其它规则。

LOG

匹配到Target为LOG的rule时的执行顺序,将数据包记录在日志中,处理完此动做后,将会继续比对其它规则。

MASQUERADE

匹配到Target为MASQUERADE的rule时的执行顺序,动态改写数据包来源IP为网络接口IP,能够指定port对应的范围,处理完此动做后,直接跳往下一个规则链.

iptables命令语法

命令格式

iptables [-t 表名] 命令选项 [链名][条件匹配][-j 目标动做或跳转]

说明:表名、链名用于指定命令所操做的表和链,命令选项用于指定iptables的执行方式(好比:插入规则、增长规则、删除规则、查看规则等;条件匹配用于指定对符合什么样条件的数据包进行处理;目标动做或跳转用于指定数据包的处理方式,好比容许经过、拒绝、丢弃、跳转给其它链处理。

表名

表选项用于指定命令应用于哪一个iptables內建表。若是不指定,默认是filter表

命令选项

命令选项用于指定iptables的执行方式,包括插入规则,删除规则和添加规则,以下表所示:

在这里插入图片描述

条件匹配

指定数据包所具备的特征,包括源地址,目的地址,传输协议和端口号等。

在这里插入图片描述

iptables使用案例

1.拒绝进来的全部ICMP协议数据包

iptables -I INPUT -p icmp -j REJECT

2.丢弃从接口(eth1)进入本机的源地址为某个网段地址的数据包

iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP

3.容许全部来自外部的http链接请求

iptables -A INPUT -p tcp --dport 80 -m state --state NEW, ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

4.阻止指定IP地址

iptables -A INPUT -i eth0 -p tcp -s x.x.x.x -j DROP

5.对局域网内mac地址为00:0C:29:56:A6:A2主机开放其联机

iptables -A INPUT -m mac --mac-source 00:0C:29:56:A6:A2 -j ACCEPT

6.将80端口的封包传递到8080端口

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

分析手机中的规则链

在android手机中,手机启动时netd进程会去建立iptables的规则链。咱们能够经过adb shell执行iptables命令,来查看有哪些规则链,也能够来分析里面的规则信息。

经过iptables -L INPUT来查看INPUT链里面的规则,能够看到它包含了不少子链。

seaice:/ # iptables -L INPUT
iptables -L INPUT
Chain INPUT (policy ACCEPT)//表示默认是ACCEPT
target(目标)            prot(协议)    opt          source(源地址)        destination(目的地址)
bw_INPUT                all          --           anywhere             anywhere
fw_INPUT                all          --           anywhere             anywhere
input_dos               all          --           anywhere             anywhere
limit                   all          --           anywhere             anywhere
bw_VIDEOCALL_IN         all          --           anywhere             anywhere
bw_VIDEOCALL_OUT        all          --           anywhere             anywhere
bw_videocall_box        all          --           anywhere             anywhere
firewall_f              all          --           anywhere             anywhere

咱们选择其中的input_dos这个子链来继续分析,以下所示:

seaice:/ # iptables -L input_dos
iptables -L input_dos
Chain input_dos (1 references)
target    prot   opt   source       destination
ACCEPT    tcp    --    anywhere     anywhere      ctstate NEW limit: avg 50/sec burst 50
DROP      tcp    --    anywhere     anywhere      ctstate NEW

input_dos包含两个规则,target是ACCEPT的这个规则,表示每秒能够接收50个新链接而且对前面50个连接不进行限制,直接ACCEPT。假如不知足这个条件,每秒超过50个新链接,就会接着走target是DROP的规则,表示只要是新链接就直接丢弃。这两个规则须要配合使用。能够看出,这个是防范SYN-FLOOD碎片攻击的规则链。那么反推出来它的iptables命令应该是:

iptables -N input_dos
iptables -A input_dos -m conntrack --ctstate NEW -m limit --limit 50/s --limit-burst 50 -j ACCEPT
iptables -A input_dos -m conntrack --ctstate NEW -j DROP
iptables -A INPUT -j input_dos

其中,iptables使用的-m模块的用法能够参考这个连接:
iptables经常使用扩展模块用法

参考

Linux prerouting和postrouting的区别
iptables经常使用扩展模块用法
Linux iptables用法与NAT
Linux ip 命令详解