面对现如今的网络环境,网络安全意识是相当重要,而网络安全也越来越受到人们的重视,而网络防护中最简单且便捷的就是防火墙。

今天就来为大家介绍Linux下的防火墙的应用。

 

 

一、简介

Iptables一般分为主机防火墙(工作与主机边缘)和网络扩防火墙(工作与网络边缘)

 

防火墙主要作用:工作于主机或网络边缘,对于进出的报文根据定义的规则作检查,进而对被规则匹配到的报文作为相应处理。

 

而现实环境中会有硬件厂商设计的专门的防火墙硬件设备,其性能要比软件防火墙好。(但此设备也并非完全依靠硬件,毕竟每个企业的网络环境不一样,也需要软件搭配来完成防火功能)

 

硬件设备分类:IDS(入侵检测系统)、IPS(入侵防御系统)大部分还用到了HoneyPot(蜜罐)

 

Linuxiptables并不是防火墙,而只是一种规则生成器,真正的防火墙是netfilter,所有的包过滤等功能都是由netfilter提供的。

 

netfilter有五个链来实现控制:INPUT到达本机内部的报文必经之路

                             PREROUTING:路由前

                             FORWARD:由本机转发的报文必经之路

                             OUTPUT:由本机发出的报文的必经之路

                             POSTROUTING:路由后

netfilter规则的功能(表):raw用户请求nat时限制追踪功能

                           mangle修改TCP报文首部内容

                           nat地址转换

                           filter包过滤

表和链的关系:filter表用到的链有INPUT, FORWARD, OUTPUT

              mangle表用到全部的链

              nat表用到的链有PREROUTINGSNAT),POSTROUTINGDNAT),OUTPUT

              raw表用到的链有PREROUTING, OUTPUT

 

数据报文流程:

   跟本机内部进程通信:

         进入:PREROUTING, INPUT

         出去:OUTPUT, POSTROUTING

 

由本机转发:

        PREROUTING, FORWARD, POSTROUTING

 

 

数据报文的流向:

        源IP和目标IP由流向决定;

 

 

对于上述表和链的叙述我们用一张图片来展示会更加直观Linux之iptables_ iptables


如图示,主机A与主机B之间的通信过程

1、主机A的请求到达网卡1,网卡1交给PREROUTING

2PREROUTING查看该信息是请求的本机还是别的主机,不是本机的话就交给    FORWARD

3、由FORWARD转发给POSTROUTING

4、由POSTROUTING决定给网卡2,让网卡2发给主机B

 

主机A与中间应用通信过程

1、主机A的请求到达网卡1,网卡1交给PREROUTING

2、PREROUTING查看该信后发现是请求的本机,所以交给INPUT处理

3、INPUT把信息交给上层处理

4、处理完信息后需要给主机A回复,所以交给了OUTPUT处理

5、OUTPUT在交给POSTROUTING,由POSTROUTING决定从哪个网卡发给主机A

 


 

二、iptables配置语法

基本语法:iptables  [-t 表名链管理 链名 匹配条件 -j 处理动作

注:如果不指明表明默认为filter

对链中规则的管理:-A 添加规则

                  -I 插入新规则

                  -D删除规则

                  -R替换规则

对规则的查询:-L 列出规则表

              -L -n 以数字格式显示主机地址和端口

              -L -v 详细格式

              -L --line-numbers 显示规则编号

对链的管理:    -Fflush, 清空规则链;

                -Nnew, 自建一条链

                -X: delete, 删除一条自定义的空链

                -Zzero,计数器归零

                -Ppolicy,设置默认策略,对filter表来讲,默认规则为ACCEPTDROP

                -E:重命名自定义链

匹配条件:

   通用匹配: -s 地址:指定报文源IP地址匹配的范围;可以是IP,也可以是网络地址;可使用!取反;

              -d 地址:指定报文目标IP地址匹配的范围;

              -p 协议:指定匹配报文的协议类型,一般有三种tcp, udpicmp;

              -i INTERFACE: 数据报文流入的接口;PREROUTING, INPUT, FORWARD

              -o INTERFACE: 数据报文流出的接口;OUTPUT, FORWARD, POSTROUITING

 

扩展匹配

    隐式扩展:当使用-p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项;

              -p tcp:

                 --sport PORT[-PORT]: 指定源端口

                 --dport PORT[-PORT]: 指定目标端口

                 --tcp-flags

 

               -p udp:

                   --sport 

                   --dport

 

显式扩展:必须明确说明使用哪个模块进行扩展,而后才能使用其扩展专用选项;

-m state --state 

注:这些规则定义后是立即生效的,但不会永久有效,若想永久有效则需要修改规则文件

Iptables-save > /etc/sysconfig/iptables

 

【示例1】我们在本机上做访问规则,我们把本机的默认规则全部设置为拒绝

iptables -t filter -P INPUT -j DROP
iptables -t filter -P OUTPUT -j DROP
iptables -t filter -P FORWORD -j DROP


【示例2】在示例1的基础上开放自己ping自己

iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT


显式扩展: -m 扩展模块名称

    multiport: 多端口匹配

       专用选项:

           --source-ports, --sports port[,port,port:port]

           --destination-ports, --dports

           --ports

 

【示例3】:开放本机的web服务和ssh服务

 iptables -I INPUT -d 172.16.249.29 -p tcp -m multiport --dports 22,80 -j ACCEPT
 iptables -I OUTPUT -s 172.16.249.29 -p tcp -m multiport --sports 22,80 -j ACCEPT


iprange: 匹配指定范围内的地址;

   专用选项:

          [!] --src-ragne IP[-IP]

          [!] --dst-range

【示例4】:允许来自172.16.250.1-100的主机telnet本机

iptables -A INPUT -d 172.16.249.29 -p tcp --dport 23 -m iprange --src-range 172.16.250.1-172.16.250.100 -j ACCEPT
iptables -A OUTPUT -s 172.16.249.29 -p tcp --sport 23 -m iprange --dst-range 172.16.250.1-172.16.250.100 -j ACCEPT


string: 字符串匹配,能够检测报文应用层中的字符串

字符匹配检查高效算法kmp, bm

             专用选项:

                   --algo {kmp|bm}

                   --string "STRING"

                   --hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串;

【示例5】:禁止访问本机含有“sex”的内容

iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP


time: 基于时间做访问控制

专用选项:

     --datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]

     --datestop 

                --timestart hh:mm[:ss]

     --timestop hh:mm[:ss]

                --weekdays day[,day]

【示例6】:仅周一周二周四周五的8:20-18:40开放本机的web服务

iptables -I INPUT -d 172.16.249.29 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT


connlimit: 连接数限制,对每IP所能够发起并发连接数做限制;

专用选项:

    !] --connlimit-above [n] 

 

【示例7】:限制每个IP最多能迸发2ssh请求

iptables -A INPUT -d 172.16.249.29 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP


limit: 速率限制

专用选项:

     --limit n[/second|/minute|/hour|/day]

     --limit-burst n

 

【示例8】:限制每分钟只能对本机发起20ICMP请求报文并且空闲5个令牌

iptables -A INPUT -d 172.16.249.29 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT


state: 状态检查

专用选项:

  --state 

 

连接追踪中的状态:

     NEW: 新建立一个会话

     ESTABLISHED:已建立的连接

     RELATED: 有关联关系的连接

     INVALID: 无法识别的连接

 

调整连接追踪功能所能容纳的连接的最大数目:

/proc/sys/net/nf_conntrack_max


当前追踪的所有连接

/proc/net/nf_conntrack


不同协议或连接类型追踪时的属性:

/proc/sys/net/netfilter目录:


注:优化规则方法,尽量减少规则条目,彼此不相关的条目,匹配机会较多的放在上边,属于同一功能的条目,匹配规则更严格的放在上面。