linux之netfilter与 iptables学习

Linux之netfilter与iptables学习

一、为什么我们的主机需要防火墙

二、Linux下防火墙如何实现

三、四表五链学习

四、主机防火墙

五、网络防火墙

六、iptables命令学习

七、主机防火墙规则备份与恢复

======================================

一、为什么我们的主机需要防火墙?

    1、防止不合理的用户,通过不合理的手段登录系统搞破坏,

    2、企图通过攻击手段组织其继续为用户提供服务,

    3、尤其当我们的主机需要提供互联网服务的时候,安全性就不言而喻,

二、Linux下防火墙如何实现?

    1、iptables,这个只是方便用户编写各类规则交由netfilter处理执行。

    2、一部分是基于TCP/IP协议栈的netfilter安全框架,通过“数据报文进入主机,内核处理完成,

        交由用户空间处理,在由内核处理完成并响应给客户”,

        数据报文的处理路径设置了各种规则链,根据规则链的顺序或者特点,

        又在规则链中增加功能表,通过在不同的功能表中设置具体的规则,来达到安全访问。

    那么netfilter的规则定义是如何来达到安全访问的效果呢?

    首先我们应该知道主机之间的通信是数据流,是参考OSI七层模型来包装用户的数据,OSI七层包括了

    应用层,表示层,会话层,传输层,网络层,数据链路层,物理层,每一层都有其自己的功能,

    netfilter就是通过识别每一层功能中的数据是否符合我们定义的规则,从而达到监控,修改,丢弃,转发的目录。

34.png

    我们学习的防火墙主要部分是监控网络层,传输层,少部分应用层数据。如上图类似主机间通信的数据。

三、四表五链:

    四表:

        1、raw:          关闭NAT,ip_conntrack(连接跟踪)

        2、mangle:    拆开数据,修改数据,封装数据

        3、nat:           源,目的IP地址转换

        4、filter:         过滤

             执行的优先级顺序是:1 > 2 > 3 >4

    五链(数据报文处理路径上的五个钩子):

        1、PREROUTING:         路由前链

        2、INPUT:                    进入用户空间链

        3、FORWARD:              转发链

        4、OUTPUT:                 用户空间出去链

        5、POSTROUTING:       路由后链

四、主机防火墙:

    对于主机防火墙而言(主机就是报文的响应方,处理完成之后,主机在发送响应给请求方),四表五链工作模型(默认情况下并不是所有的链上都必须要有所有的功能规则表,这是设计者精巧设计):

35.png

说明(数据包经过防火墙被处理):

    1、数据包经过网络传输,到达主机网卡缓冲区,接着被内核加载到内核内存空间,

    2、数据报文经过PREROUTING链,

        1、规则表匹配顺序raw–>mangle–>nat,

        2、每个规则表中有N多规则,

    3、被PREROUTING链处理过后的数据将会转发给INPUUT链

        1、规则表匹配顺序mangle–>filter,

        2、通常需要阻止别人访问,或者开放服务给用户都是在此filter规则表中设定

    4、用户空间:程序运行时生成的进程监听在某个套接字(端口)上,内核拆分数据报文到传输层时(TCP/UDP),检查数据报文的目的端口,进而转交给其监控的进程处理。

         用户空间处理完数据包之后,会将需要返回给用户的数据重新打包,交给内核,由内核将数据封装(封装传输层,网络层,数据链层报文头部),

        这里的封装就会参考OUTPUT链与POSTROUTING链,

    5、数据报文到达OUTPUT链

        1、规则表匹配顺序:raw–>mangle–>nat–>filter

    6、数据报文被OUTPUT链处理完毕之后接着交给POSTROUTING

        1、规则表匹配顺序:mangle–>nat

五、网络防火墙:

    网络防火墙的意思是提供数据包转发,数据报文的最终目的地址并不是本机防火墙,需要开启forward功能

36.png

    网络防火墙管控修改数据包源,目的IP地址与过滤数据报文。

六、IPTABLES命令学习(编写规则表):iptables并不是服务,没有进程,是工作在内核

命令学习:

链管理: 规则管理: 查看:
-F Flush 清空规则链 -A Append 将规则追击到指定链的最后 -L List 列出指定链的规则
-N New 创建新的自定义规则链 -I Insert 插入一条规则,不给序号就是第一条 -n Number数字显示IP与端口号
-X 删除用户自定义链 -D Delete 删除规则 -v,-vv,-vvv 显示详细信息
-Z Zero 清零,规则计数器重置为零 -R Replace 替换规则 –line-numbers 显示规则编号
-P Policy 为指定的规则链设置默认策略 -x 显示计数结果精确值
-E rEname 重命名自定义链
-j 指定被规则匹配后所要执行的动作,ACCEPT(允许),DROP(丢弃),REJECT(拒绝),RETURN(返回),REDIRECT(重定向),LOG(记录日志),MARK(标记),DNAT(目的地址转换),SNAT(源地址转换),MASQUERADE(地址伪装)

例子:

    ~]# iptables -t nat -L    #查看nat表中规则链与规则

匹配条件:

    基本匹配:

    [!]    -s    -src    –source    [ip|network]        数据报文源地址匹配,[!]表示取反

    [!]    -d    -dst    –destination    [ip|network]        数据报文目的地址匹配,[!]表示取反

    -p    –protocol    [tcp|udp|icmp]        传输层协议

    -i    –in-interface    指定数据报文入接口    ##仔细想想只能用在PREROUTING,FORWARD,INPUT链上

    -o    –out-interface    指定数据报文This test Page abcdefgh出接口    ##仔细想想只能用在OUTPUT,FORWARD,POSTROUTING链上

    隐含扩展匹配:

    -p tcp {–sport,–dport,–tcp-flage,–sync}

        例:–tcp-flage SYN,ACK,FIN,RST SYN     表示匹配TCP数据报文中TCP首部SYN,ACK,FIN,RST四个关键字位置,并且只有SYN为1,能可以,其它三个位置必须为0(TCP三次握手的第一次)

    -p udp {–sport,–dport}

    -p icmp –icmp-type    icmp类型有很多,常用就是类型为0的表示ping应答(Echo reply) 类型8为ping请求(Echo request)

    显示扩展:使用-m macth_name –spec_options,必须指明使用的扩展模块(重点)

    一、multiport:指定多端口

            使用方法:

            [!] –source-ports,–sports port[,port|,port:port]…

                ~]# iptables -A INPUT -d 192.168.3.21 -p tcp -m multiport –dports 53:80,111 -j ACCEPT        

                #没有指定源IP地址,表示任意源IP地址访问本机192.168.3.31这个IP的TCP协议,目的端口是53~80的所有端口,加上111这个端口

            [!] –destination-ports,–dports port[,port|,port:port]…

            [!] –ports port[,port|,port:port]…

                ~]# iptables -A INPUT -d 192.168.3.21 -p tcp -m multiport –dports 22,80,443 -j ACCEPT        #此规则类似,

    二、iprange:指定IP地址范围

            使用方法:

            [!] –src-range from[-to]

                ~]# iptables -A INPUT -d 192.168.3.21 -p tcp –dport 443 -m iprange –src-range 192.168.3.1-192.168.3.50 -j ACCEPT        

            [!] –dst-range from[-to]
    三、string:指定的字符

            使用方法:

            –algo {bm|kmp}    bm与kmp是匹配字符串的算法

                ~]# iptables -A OUTPUT -s 192.168.3.21 -p tcp –sport 80 -m string –algo bm –string "abcdefg" -j DROP   

                #当192.168.3.21这台web服务器网页上出现abcdefg字符,网站就不能被访问了

    四、time:访问时间控制

            使用方法

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

            –datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

            –timestart hh:mm[:ss]

            –timestop hh:mm[:ss]

                ~]#iptables -A OUTPUT -s 192.168.3.10 -p tcp –sport 80 -m time –timestart 07:00 –timestop 23:00 -j ACCEPT       

                #每天的早上7点到晚上23点才能访问

            [!] –monthdays day[,day…]

            [!] –weekdays day[,day…]    Mon,  Tue,  Wed,  Thu,  Fri,  Sat,  Sun, or values from 1 to 7,

                ~]#iptables -A OUTPUT -s 192.168.3.10 -p tcp –sport 80 -m time ! –weekdays 6,7  -j ACCEPT       

                #星期6,星期7取反,也就是只能星期一到星期五访问

    五、conntlimit:连接限制

            使用方法:

            [!] –connlimit-above n

                ~]# iptables -I INPUT -d 192.168.3.10 -p tcp –dport 22 -m connlimit –connlimit-above 3 -j DROP

                #表示对连接22端口限制最大连接数为3,在规则生效时,在线的ssh服务,不算,之后退出重新连接就算

            –connlimit-mask

              ~]# iptables  -p  tcp  –syn  –dport  80  -m connlimit –connlimit-above 16 –connlimit-mask 24 -j REJECT

                #这个有点意思,限制C类网络地址(掩码是24的),http并发连接不超过16个,

                #假如说我们的客户端地址是192.168.3.0/24,我们这个网段内的所有地址一起发起http请求并发,不能超过16个,

    六、limit:报文速率限制

            使用方法:

            –limit rate[/second|/minute|/hour|/day]

            –limit-burst number

              ~]# iptables -I INPUT -d 192.168.3.10 -p tcp –dport 443 -m limit –limit 100/minute -j DROP

                 #每分钟限制100个报文,多的会DROP掉

    七、state:连接状态追踪,nf_conntrack

            有了状态连接之后,我们可以在OUTPUT方向只放行已经建立连接的数据(在没有启用state功能是,对于规则的编写要考虑到进出两个方向),

            状态类别有:

                NEW:新建连接

                ESTABLISHED:正在建立连接

                RELATED:相关连接(FTP被动模式的控制连接与数据连接)

                INVALID:无效的连接

            [!] –state state:

                ~]# iptables -A OUTPUT -m state –state ESTABLISHED -j ACCEPT    

                    #已经建立的连接OUTPUT方向直接放行流量

                ~]# iptables -I INPUT -d 192.168.3.10 -p tcp -m multiport –dports 22,80,53 -m state –state NEW,ESTABLISHED -j ACCEPT

                    #对于访问192.168.3.10的22,80,53服务,新建或者已经建立连接的流量直接放行

    八、还有很多显示扩展的高级功能,我们需要多多man iptables

七、主机防火墙规则备份与恢复:

    规则保存:~]# iptables-save > iptables-rules

    规则恢复:~]# iptables -restore < iptables-rules


FTP特殊放行:需要加载单独对FTP放行的模块

/lib/modules/2.6.32-573.el6.x86_64/kernel/net/netfilter/nf_conntrack_ftp.ko    模块位置

~]# modprobe nf_conntrack_ftp    #加载模块
~]# iptables -A INPUT -d 192.168.3.10 -p tcp –dport 21 -m state –state NEW,ESTABLISHED -j ACCEPT

~]# iptables -A INPUT -d 192.168.3.10 -p tcp -m state –state RELATED -j ACCEPT

~]# iptables -I INPUT -s 192.168.3.10 -p tcp -m state –state ESTABLISHED -j ACCEPT

原创文章,作者:nice_neo_linux,如若转载,请注明出处:http://www.178linux.com/18952

(0)
nice_neo_linuxnice_neo_linux
上一篇 2016-06-23
下一篇 2016-06-23

相关推荐

  • yum安装 源码安装实例

     yum安装 源码安装实例 §·源码安装 http 2.2.29实例 1     1.下载源码包。 1     2.配置系统需要的编译环境。 2     3 ./configure ; make  ;…

    Linux干货 2016-08-24
  • 马哥linux2014|2015全套教程

    1、本课程全程将基于集成了Openstack云环境、支持高精度时间(PTP)及虚拟化性能大大提升的RHEL 6.5或CentOS 6.6,间或介绍CentOS 7系统的使用; 2、此文章给出的只是个课程知识点框架,实际讲解过程相当精细;另外,知识点讲授的次序未必同此文章所标示的顺序相同; 3、第15期面授班定于2015年3月24号开课;本期将会是马哥教育数年…

    Linux干货 2015-07-14
  • Linux磁盘管理工具

    挂载mount          挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,                 进而使得此目录做为其它文件访问入口的行为         &n…

    Linux干货 2016-08-29
  • iptables-防火,防盗,防老王

        防火墙,其实说白了将,就是用于实现linux下访问控制的功能的,它分为两种方式,硬件防火墙和软件防火墙。不过无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义防火墙如何工作的,这就是防火墙的策略,规则,以达到让它对出入网络的IP,数据进行检测。     目前市…

    Linux干货 2017-05-02
  • DevOps如何重构IT战略

    翻译: 至尊宝 原文: http://www.citeworld.com/article/2897738/development/how-devops-can-redefine-your-it-strategy.html?page=2   DevOps究竟是昙花一现还是你一直在寻找的竞争优势?我们咨询了一些专家,对于这种趋势他们的想法是什…

    Python干货 2015-03-26
  • 推倒一个二十来岁青壮年第一步

    首先:找到他家在哪里,了解他的生长环境 然后:调查他的信息,慢慢了解他,学会和他交流,学会控制他

    Linux干货 2016-09-21