Linux防火墙--iptables(一)基础篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ghost_leader/article/details/79022350

一.iptables 简介

      iptables防火墙是由Netfilter项目开发的,iptables提供了全面的协议状态跟踪、数据包的应用层检查、速率限制、指定策略过滤等。而iptables使用Netfilter框架进行过滤。Netfilter本身不对数据包进行过滤---它只是允许可以过滤数据包的函数挂接到内核的位置。


二.iptables的过滤策略

     iptables策略是由一组有序的规则建立的。其中体现在五表五链(其中security表是新加入的)

                   

表:1.filter(主要功能是过滤)

        2.nat(用于网络转换SNAT和DNAT)

        3.mangle(修改分组数据的特定规则)

        4.raw(独立于Netfilter连接跟踪子系统起作用的规则)

链:

       每个表都有自己的一组内置链,而链就在数据包流经的必经之路上,上图可见。

       1.INPUT链:当数据包要由内核流向Linux系统中必将经过INPUT链的检查,当然检查的规则是各个表上的规则。

       2.OUTPUT链:linux 系统自己生成的数据包流出本机。

       3.FORWARD链:管理经过Linux系统路由的数据包。

       4.PREROUTING链:在进行路由判断之前要进行的规则(DNAT,REDIRECT)

       5.POSTROUTING链:在进行路由判断之后要进行的规则(SNAT,MASQUERADE)

匹配:

      匹配是指数据包满足所有的匹配条件时,iptables才能根据处理该数据包。

      一般的匹配如下:

      1. --source (-s)  -----  匹配源IP地址。

      2. --destination (-d) ----- 匹配目的IP地址。

      3. --protocol  (-p) -----  匹配协议。

      4. --in-interface (-i)  ----- 匹配流入接口(如eth0)

      5. --out-interface (-o) ----- 流出接口

      6. --state  ------ 匹配一组连接状态

      7. --string ------ 匹配应用层数据字节序列

      8. --comment  ------ 在内核内存中为一个规则关联多达256个字节的注释数据

目标:

      这指的是当匹配数据包后触发的一个动作。

      1.ACCEPT  -----  允许数据包通过

      2.DROP  ------  丢弃数据包,不对该数据包做进一步处理,对接收栈而言,相当于对该数据包从没有接收过。

      3.LOG   ------  将数据包记录到syslog

      4.REJECT  ------  丢弃数据包,并且作出适当的回应包文

      5.RETURN  -----  在调用链中继续处理数据包

       iptables的运行时基于模块的,加载模块可以实现更复杂的匹配。如ip_conntrack,iptable_nat,ip_nat_ftp。具体一会讲到。其次iptables是基于网络层的,也就是说它只能过滤IP层及其以上的数据包,所以iptables不能过滤ARP报文。

      下图是内核加载的iptables相关的模块。

      这里介绍一下ip_conntrack 模块。先看看ip_conntrack 实现的状态追踪实现。

# iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID" --log-ip-options --log-tcp-options
# iptables -A INPUT -m state --state INVALID -j DROP
# iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

     上面的命令是指 遇到非法的连接(INVALID) 会用日志记录起来,再忽律该非法数据包,最后一行是指 NEW,ESTABLISHED,RELATED 状态的可以通过。

       那什么属于INVALID的数据包呢,INVALID数据包指的是一个不能被识别为属于一个已有连接的数据包---例如,突如其来的一个TCP FIN 数据包(不属于任何TCP连接)就是一个非法连接。而ESTABLLISHED是指一个已经建立的连接。RELATED状态指的是再Netfilter连接跟踪子系统中打开的一个新的连接,且这个连接和现有的连接是相关的,如当数据包发送给一个没有绑定UDP套接字的时候,服务器将返回一个ICMP端口不可达。而NEW呢,当然是指一个新的连接了。看下面的命令。

# iptables -A OUTPUT -m state --state NEW -j DROP
# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms

     从本机发起的请求全部被DROP了。也就是不能发起一个新的请求了。那状态追踪有什么意义呢?假设这样一个场景。一台处于内网的服务器是不允许自己向外发出tcp连接的,它只被允许客户端向它发起连接请求,那么就需要追踪状态了。因为正常情况下服务器不会主动向外请求,如果这个情况真的突然发生了,那么只可能是服务器中病毒了,做这样的状态追踪还可以防止中毒服务器向外发请求,但是有一个问题,追踪状态是十分消耗资源的,当加载了ip_conntrack 模块去追踪连接的话,这样会限制当前的连接数量,这个具体要修改内核参数 net.ipv4.ip_conntrack_max ,在sysctl.conf 中。

      当然iptables还可以出色的实现地转转换,通过 --to-destination 等参数,可以实现目的地址转化。MASQUERADE 可以实现地址伪装,算是SNAT的一种,是一种自动化的SNAT,为了防止ADSL导致的IP地址乱变。 

# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o enp0s3 -j MASQUERADE

猜你喜欢

转载自blog.csdn.net/Ghost_leader/article/details/79022350