美文网首页
iptables简介

iptables简介

作者: hubery_zhao | 来源:发表于2020-12-11 16:53 被阅读0次

    第1章 Iptables简介

    防火墙分为硬件防火墙与软件防火墙,硬件防火墙价格很高,多数中小型公司使用软件防火墙,免费的iptables使用是很多的,现在复习一下iptables。

    iptables其实不是真正的防火墙,用户通过iptables这个代理,将用户的安全设定执行到对应的netfilter,是linux内核的一个软件框架,用来管理网络数据包。使用的是内核组件,iptables不像其他服务那样有进程。

    主要功能有 :网络地址转换(NAT)、包内容修改、数据包过滤、数据包处理、地址伪装、透明代理等功能。

    Iptables根据定义的规则来处理这些数据包,例如:放通(ACCEPT)、拒绝(REJECT)、丢弃(DROP)、源地址转换(SNAT)、目标地址转换(DNAT)、端口映射(REDIRECT)、地址伪装(MASQUERADE)、日志记录(LOG)…

    第2章 经典的报文流向

    上面讲到iptables是根据定义额规则来处理数据包,就要从经典数据包流向来看

    image.png

    涉及到本机的的流程有:

    本机某进程发报文:OUTPUTàPOSTROUTING

    目标为本机的报文:PREROUTINGàINPUT

    由本机转发的报文:PREROUTINGàFORWARDàPOSTROUTING

    上图对应就是对应的“五链”,那么所谓的“四表”又有哪些??

    第3章 表链结构

    接触iptables最初老是听说表链结构,有哪些表?有哪些链呢?

    3.1 四表五链

    “四表”:filter , nat , mangle , raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter

    filter表:负责过滤功能,防火墙;内核模块:iptables_filter

    nat表:network address translation,网络地址转换功能;内核模块:iptable_nat

    mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle

    raw表:关闭nat表上启用的连接追踪机制;iptable_raw ,raw表优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能。RAW 表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链 上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.

    “五链”:

    INPUT链 :处理输入数据包。

    OUTPUT链 :处理输出数据包。

    FORWARD链 :处理转发数据包。

    PREROUTING链 :用于目标地址转换(DNAT)。

    POSTOUTING链 :用于源地址转换(SNAT)。

    3.2 表链对应关系

    需要使用iptables还需要对表链的对应关系了解才能流畅的使用

    image.png

    表可以被哪些链使用?
    表名 -----> 表规则可以被哪些链使用
    raw -----> PREROUTING、OUTPUT
    mangle -----> PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
    nat -----> PREROUTING、OUTPUT、POSTROUTING
    filter -----> INPUT、FORWARD、OUTPUT

    链中可以存在多个表,那么在一个链中有多个表,应该如何执行呢??

    例如从上图得知,OUTPUT 可以包含四个表,单这些表都存在时,他们的优先级(从高到低):raw --> mangle --> nat --> filter ,其他表也可以参照对比。

    链中可以包含哪些表?优先级?
    链 -----> 可以包含哪些表?优先级?
    PREROUTING -----> Raw > nangle > nat
    INPUT -----> Mangle > filter
    FORWARD -----> Mangle > filter
    OUTPUT -----> Raw > mangle > nat > filter
    POSTROUTING -----> Mangle > nat

    image.png

    其中INPUT 中在centos7就包含了nat表,centos6中不包含,需要了解一下。

    第4章 Iptables设置规则

    上文就在说,iptables匹配自定义的规则 ,当匹配到了指定的规则之后就会按照定义的动作进行处理

    例如:

    我们设置一个规则,公交车上低于1.2m的儿童能够免票。

    那么想要免票就需要满足两个规则:儿童、低于1.2m。不是儿童或者>=1.2m或者不是儿童且>=1.2m 就不满足条件,售票员就不能让

    Iptables设置的规则也是这样,当匹配上了符合条件的报文,就执行自定义的动作进行处理这个报文。

    4.1 匹配条件

    匹配条件分为基本匹配条件与扩展匹配条件,需要注意的是iptables 是从上往下开始匹配,以先达条件规则执行。

    4.1.1 基本匹配条件:

    源地址Source IP,目标地址 Destination IP

    上述内容都可以作为基本匹配条件。

    4.1.2 扩展匹配条件:

    除了上述的条件可以用于匹配,还有很多其他的条件可以用于匹配,这些条件泛称为扩展条件,这些扩展条件其实也是netfilter中的一部分,只是以模块的形式存在,如果想要使用这些条件,则需要依赖对应的扩展模块。

    源端口Source Port, 目标端口Destination Port

    上述内容都可以作为扩展匹配条件

    4.2 处理动作

    处理动作在iptables中被称为target(这样说并不准确,我们暂且这样称呼),动作也可以分为基本动作和扩展动作。

    此处列出一些常用的动作,之后的文章会对它们进行详细的示例与总结:

    ACCEPT:允许数据包通过。

    DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。

    REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。

    SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。

    MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。

    DNAT:目标地址转换。

    REDIRECT:在本机做端口映射。

    LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

    第5章 Iptables基本使用

    5.1 Iptables基本语法参数

    语法 :iptables(选项)(参数)

    选项:
    参数 作用
    -t ,--table table 对指定的表 table 进行操作, table 必须是 raw, nat,filter,mangle 中的一个。如果不指定此选项,默认的是 filter 表。
    #通用匹配:源地址目标地址的匹配
    -p ,指定要匹配的数据包协议类型;
    -s ,--source [!] address[/mask] :把指定的一个/一组地址作为源地址,按此规则进行过滤。当后面没有 mask 时,address 是一个地址,比如:192.168.1.1;当 mask 指定时,可以表示一组范围内的地址,比如:192.168.1.0/255.255.255.0。
    -d ,--destination [!] address[/mask] :地址格式同上,但这里是指定地址为目的地址,按此进行过滤。
    -i ,--in-interface [!] <网络接口name> :指定数据包的来自来自网络接口,比如最常见的 eth0 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。同前面类似,"!" 表示取反。
    -o ,--out-interface [!] <网络接口name> :指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。
    #查看管理命令
    -L ,--list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则。
    #规则管理命令
    -A ,--append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。
    -I ,--insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则。如果指定的规则号是1,则在链的头部插入。这也是默认的情况,如果没有指定规则号。
    -D ,--delete chain rule-specification -D, --delete chain rulenum 在指定的链 chain 中删除一个或多个指定规则。
    -R num ,Replays替换/修改第几条规则
    #链管理命令(立即生效)
    -P ,--policy chain target :为指定的链 chain 设置策略 target。注意,只有内置的链才允许有策略,用户自定义的是不允许的。
    -F ,--flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。
    -N ,--new-chain chain 用指定的名字创建一个新的链。
    -X ,--delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。
    -E ,--rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部造成任何影响。
    -Z ,--zero [chain] :把指定链,或者表中的所有链上的所有计数器清零。
    -j ,--jump target <指定目标> :即满足某条件时该执行什么样的动作。target 可以是内置的目标,比如 ACCEPT,也可以是用户自定义的链。
    -h ,显示帮助信息;

    命令选项输入顺序 :
    iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

    5.2 实例

    5.2.1 查看已添加规则

    iptables -nL


    image.png

    5.2.2 清空当所有规则和计数

    iptables -F # 清空所有的防火墙规则

    iptables -X # 删除用户自定义的空链

    iptables -Z # 清空计数

    5.2.3 允许本地回环地址可以正常使用

    本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许

    iptables -A INPUT -i lo -j ACCEPT

    iptables -A OUTPUT -o lo -j ACCEPT

    5.2.4 设置默认的规则

    iptables -P INPUT DROP # 配置默认的不让进,注意:当前远程连接也会断开,请视情况使用

    iptables -P FORWARD DROP # 默认的不允许转发

    iptables -P OUTPUT ACCEPT # 默认的可以出去

    默认规则 使用iptables -nL 不能查看到,所以需要谨慎使用

    image.png

    当我们怀疑是iptables出现问题 ,清理规则之后还是失败,就需要考虑将INPUT、OUTPUT、FORWARD等修改为默认ACCEPT

    iptables -P INPUT ACCEPT # 配置默认 放通

    iptables -P FORWARD ACCEPT # 默认放通转发

    iptables -P OUTPUT ACCEPT # 默认放通

    5.2.5 配置tcp 22端口放通

    iptables -A INPUT -i ens33 -p tcp --dport 22 -j ACCEPT

    “-A INPUT” – 表示我们要在 INPUT 链的最后增加后面的规则。所以这条规则将会应用于入站的数据包。

    “-i ens33″ – 表示检查通过 eth0 接口进入的数据包,看看是否匹配此规则。

    “-p tcp –dport 22″ – 该规则针对的是 TCP 数据包,并且使用了 -p 参数的选项 “–dport 22″ 来指定该规则针对的是要发送到服务器 22 号端口(即 SSH 端口)的数据包。

    “-j ACCEPT” – 跳转到 ACCEPT,即接受满足这些匹配规则的数据包的传输。

    放通之后修改默认规则input 为 drop ,可以正常连接,测试ping 失败

    image.png
    image.png

    5.2.6 在input规则最后添加“丢弃所有包”

    这个设置可以代替默认规则,

    iptables -A INPUT -j DROP

    image.png

    5.2.7 指定协议匹配。

    匹配指定协议。

    iptables -A INPUT -p tcp

    匹配指定协议之外的所有协议。

    iptables -A INPUT -p !tcp

    5.2.8 指定地址匹配。

    指定匹配的主机。

    iptables -A INPUT -s 192.168.0.18

    指定匹配的网络。

    iptables -A INPUT -s 192.168.2.0/24

    匹配指定主机之外的地址。

    iptables -A FORWARD -s 192.168.0.19

    匹配指定网络之外的网络。

    iptables -A FORWARD -s ! 192.168.3.0/24

    5.2.9 指定网络接口匹配。

    指定单一的网络接口匹配。

    iptables -A INPUT -i eth0

    iptables -A FORWARD -o eth0

    指定同类型的网络接口匹配。

    iptables -A FORWARD -o ppp+

    5.2.10 指定端口匹配。

    指定单一端口匹配。

    iptables -A INPUT -p tcp --sport www

    iptables -A INPUT -p udp –dport 53

    匹配指定端口之外的端口。

    iptables -A INPUT -p tcp –dport

    匹配端口范围。

    iptables -A INPUT -p tcp –sport 22:80

    匹配ICMP端口和ICMP类型。

    iptables -A INOUT -p icmp –icimp-type 8

    指定ip碎片。

    每个网络接口都有一个MTU(最大传输单元),这个参数定义了可以通过的数据包的最大尺寸。如果一个数据包大于这个参数值时,系统会将其划分成更小的数据包

    (称为ip碎片)来传输,而接受方则对这些ip碎片再进行重组以还原整个包。这样会导致一个问题:当系统将大数据包划分成ip碎片传输时,第一个碎片含有

    完整的包头信息(IP+TCP、UDP和ICMP),但是后续的碎片只有包头的部分信息(如源地址、目的地址)。因此,检查后面的ip碎片的头部(象有TCP、UDP和ICMP一样)是不可能的。假如有这样的一条规则:

    iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 –dport 80 -j ACCEPT

    并且这时的FORWARD的policy为DROP时,系统只会让第一个ip碎片通过,而余下的碎片因为包头信息不完整而无法通过。可以通过—fragment/-f 选项来指定第二个及以后的ip碎片解决上述问题。

    iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT

    注意现在有许多进行ip碎片攻击的实例,如DoS攻击,因此允许ip碎片通过是有安全隐患的,对于这一点可以采用iptables的匹配扩展来进行限制。

    相关文章

      网友评论

          本文标题:iptables简介

          本文链接:https://www.haomeiwen.com/subject/lonjgktx.html