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)
上一篇 2016-06-23 11:01
下一篇 2016-06-23 11:02

相关推荐

  • 马哥教育网络班22期+第3周课程练习 忍者乱太郎喻成

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。  who|awk '{print $1}'|uniq 2、取出最后登录到当前系统的用户的相关信息。 题目不是很清晰我估计是题目想要的是 last -1   cat /etc/pa…

    Linux干货 2016-09-06
  • Hadoop集群配置(最全面总结)

    通常,集群里的一台机器被指定为 NameNode,另一台不同的机器被指定为JobTracker。这些机器是masters。余下的机器即作为DataNode也作为TaskTracker。这些机器是slaves\ 官方地址:(http://hadoop.apache.org/common/docs/r0.19.2/cn/cluster_setup.ht…

    Linux干货 2015-04-13
  • 马哥教育网络班22期+第2周课程练习

    1、Linux上文件/目录相关命令有哪些? 1)目录管理类命令:mkdir、rmdir (1)mkdir:make directorise 创建文件夹  使用格式:      mkdir [OPTION]… DIRECTORY…    &nb…

    Linux干货 2016-09-08
  • Linux终端类型介绍

    相关命令:tty 适合阅读人群:所有   终端机 终端(Computer terminal),是一台电子计算机或者计算机系统,用来让用户输入数据,及显示其计算结果的机器。又名终端机,它与一部独立的电脑不同,其实就是一种输入输出设备,一台电脑多人使用,每增加一个用户只须增加一台显示器和一套键盘鼠标就可以成为一个独立的终端,多用户可同时使用互相独立,跟…

    Linux干货 2016-10-14
  • ​Linux 硬连接与软连接的区别

        Linux 硬连接与软连接的区别                        &…

    Linux干货 2016-10-25
  • ngx_http_proxy_module

    ngx_http_proxy_module 1.proxy_pass Syntax: proxy_pass URL; Context: location, if in location, limit_except 这条指令将来是用的相当多的指令。 v  附加1:proxy_pass后面的路径不带uri时,其会将loca…

    2016-10-30