讲一下iptables

iptables相关概念

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

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

来看一个简单iptables的命令:

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

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

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

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

四表

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

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

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

五链

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

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

规则链的先后顺序:

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

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

在这里插入图片描述

这里要注意一下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 命令详解

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux Iptables命令列表: 用iptables -ADC 来指定链的规则,-A添加 -D删除 -C 修改 iptables - [RI] chain rule num rule-specification[option] 用iptables - RI 通过规则的顺序指定 iptables -D chain rule num[option] 删除指定规则 iptables -[LFZ] [chain][option] 用iptables -LFZ 链名 [选项] iptables -[NX] chain 用 -NX 指定链 iptables -P chain target[options] 指定链的默认目标 iptables -E old-chain-name new-chain-name -E 旧的链名 新的链名 用新的链名取代旧的链名 说明 Iptalbes 是用来设置、维护和检查Linux内核的IP包过滤规则的。 可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处理与之相匹配的包。这被称作'target'(目标),也可以跳向同一个表内的用户定义的链。 TARGETS 防火墙的规则指定所检查包的特征,和目标。如果包不匹配,将送往该链中下一条规则检查;如果匹配,那么下一条规则由目标值确定.该目标值可以是用户定义的链名,或是某个专用值,如ACCEPT[通过], DROP[删除], QUEUE[排队], 或者 RETURN[返回]。 ACCEPT 表示让这个包通过。DROP表示将这个包丢弃。QUEUE表示把这个包传递到用户空间。RETURN表示停止这条链的匹配,到前一个链的规则重新开始。如果到达了一个内建的链(的末端),或者遇到内建链的规则是RETURN,包的命运将由链准则指定的目标决定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值