zoukankan      html  css  js  c++  java
  • Linux8.3 netfilter

    逻辑上防火墙分为主机防火墙和网络防火墙。

    主机防火墙针对于单个主机进行防护。网络防火墙往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网。两者并不冲突,理解为,后者主外(集体),前者主内(个人)。

    物理上分为硬件防火墙和软件防火墙。

    硬件防火墙实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。软件防火墙应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低成本低。

    防火墙firewalld

      关闭selinux

    [root@chyuanliuNJ ~]# setenforce 0
    setenforce: SELinux is disabled
    [root@chyuanliuNJ ~]# vi /etc/selinux/config
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=disabled
    # SELINUXTYPE= can take one of three two values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    [root@chyuanliuNJ ~]# getenforce
    Disabled
    

      centos7之前使用netfilter防火墙,之后开始使用firewalld防火墙,防火墙机制不太一样,但是工具用法iptables一样。两个防火墙都要懂。

      netfilter使用,可以在7上关闭firewalld开启netfilter。

    [root@chyuanliuNJ ~]# systemctl disable firewalld
    [root@chyuanliuNJ ~]# systemctl stop firewalld
    [root@chyuanliuNJ ~]# yum install -y iptables-services
    ... ...
    [root@chyuanliuNJ ~]# systemctl enable iptables
    Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
    [root@chyuanliuNJ ~]# systemctl start iptables
    

    iptables理解

      iptables并不是真正的防火墙,可以理解为客户端代理,用户通过iptables代理讲用户的安全设定执行到对应的安全框架中,这个框架才是真正的防火墙,名字为netfilter。位于内核空间。

      可以理解iptables为一条流水线上的筛选机制,开启了 iptables 之后,所有通过系统网卡接口的数据都会经过 iptables 的检查和处理。各条规则就像是流水线上的技工,按照一定的顺序排列在流水线上。所有进入 iptables 的数据包,在通过这个流程的过程中都会被各条规则检查。每条规则包括匹配条件(如果不指定匹配条件则默认匹配所有)和处理方法 2 个部分。某规则看到有个数据包从流水线上过来了,首先查看是不是满足自己的匹配条件,不满足就让它继续往下游走;满足就按照自己的处理方法对其进行处理。每个数据包最终的处理的结果只有这么 3 种,且必须为这 3 种中的一个,否则就是还没处理完:

    1. ACCEPT – 接受。如果被接受,一个数据包就可以从 iptables 中出来了,不用再接着被后面的规则检验。
    2. DROP – 丢弃。如果被丢弃,这个数据包就沉没了,直接从 iptables 的流水线上被拿下来扔掉。
    3. REJECT – 拒绝。如果被拒绝,这个数据包会被拒收,但是 iptables 会让希望告诉发送方它的数据包被扔掉了。也就是说,实际上这个数据包还是被扔掉了,但是系统会发送回去一个消息,告诉别人一声。

      如果一个数据包得到了上面 3 种最终判决结果中的一个,它就会从 iptables 这条流水线上被请下来,否则就继续往下游走。并不是每条规则都能给出上面的最终判决。如果不能给出最终判决,这条规则的操作有:

    1. 跳转(-j)- 有 2 个跳转方向:
      1. -j LOG – 做个记录,然后让数据包接着被下面的检查员检查;
      2. -j other_chain – 将数据包交给另一个链(other_chain)来处理,然后撒手不管。
    2. 撒手不管 – 这个数据包就流向下一个检查员,由后面的规则进行处置。

      设计 iptables 的规则就是设计这么一条流水线,使用iptables选项命令组合出满足自己需要的匹配规则并指定处理方式,同时考虑到 iptables 规则在流水线上的前后顺序。一般采取的思路是,只“接受”满足我们要求的数据包,对于没有规则与之匹配的数据包,默认采取丢弃(或拒绝)操作(一般最后一条规则都是 -j DROP,不能处理的都给丢弃了)。不过也有人说,直接 DROP 不是太礼貌,可以选择 REJECT(丢弃并通知一声)。

      iptables是按照规则来办事的,规则就是网络管理员预定义的条件,可以理解为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,指定了源地址、目标地址、传输协议(TCP、UDP、ICMP)和服务类型(HTTP、FTP、SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理数据包,处理方式有放行accept、拒绝reject、丢弃drop等。配置防火墙的主要工作就是添加、修改和删除这些规则。

      报文流向:

      到本机某进程的报文: PREROUTING --> INPUT

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

      由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING

    netfilter5表5链介绍

      链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。

      表(tables)提供特定的功能,iptables内置了5个表,即filter表、nat表、mangle表、raw表和security表,链的容器,即所有的链(chains)都属于其对应的表(tables)。

      netfilter的5个链

      1.INPUT——进来的数据包应用此规则链中的策略,通过路由表后目的地为本机
      2.OUTPUT——外出的数据包应用此规则链中的策略,由本机产生,向外发出
      3.FORWARD——转发数据包时应用此规则链中的策略,通过路由表后,目的地不为本机
      4.PREROUTING——对数据包作路由选择前应用此链中的规则,数据包进入路由表之前
      (记住!所有的数据包进来的时侯都先由这个链处理)
      5.POSTROUTING——对数据包作路由选择后应用此链中的规则,发送到网卡接口之前
      (所有的数据包出来的时侯都先由这个链处理)

      

      netfilter的5个表

      filter表用于过滤包,最常用的表,有INPUT、FORWARD、OUTPUT三个链

      nat表用于网络地址转换,有PREROUTING、OUTPUT、POSTROUTING三个链

      managle表用于给数据包做标记,几乎用不到

      raw表可以实现不追踪某些数据包,不常用。

      security表在CentOS6中并没有,用于强制访问控制(MAC)的网络规则,不常用。

      1.filter表——三个链:INPUT、FORWARD、OUTPUT
      作用:过滤数据包  内核模块:iptables_filter.
      2.Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
      作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
      规则表之间的优先顺序:

      Raw——>mangle——>nat——>filter
      规则链之间的优先顺序(分三种情况):

      参考文献  http://www.cnblogs.com/metoy/p/4320813.html

    iptables语法

    #默认规则
    [root@chyuanliuNJ ~]# iptables -nvL
    ... ...
    
    #规则保存在
    [root@chyuanliuNJ ~]# cat /etc/sysconfig/iptables
    ... ...
    
    #清空规则
    [root@chyuanliuNJ ~]# iptables -F
    #如果不保存,重启iptables服务,都会加载配置文件的规则
    
    #保存规则
    [root@chyuanliuNJ ~]# service iptables save
    iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
    
    #指定表,查看nat表规则
    [root@chyuanliuNJ ~]# iptables -t nat -nvL
    
    #把记录的数据清零
    [root@chyuanliuNJ ~]# iptables -Z
    
    [root@chyuanliuNJ ~]# iptables -A INPUT -s 49.77.177.237 -p tcp --sport 1234 -d                                47.96.170.152 --dport 80 -j DROP
    #禁来源IP  tcp的协议   源端口1234 目标端口80 目标IP  不符合就drop
    [root@chyuanliuNJ ~]# iptables -nvL
    Chain INPUT (policy ACCEPT 50 packets, 3891 bytes)
     pkts bytes target     prot opt in     out     source               destination
        0     0 DROP       tcp  --  *      *       49.77.177.237        47.96.170.152        tcp spt:1234 dpt:80
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain OUTPUT (policy ACCEPT 40 packets, 10732 bytes)
     pkts bytes target     prot opt in     out     source               destination
    #从源IP访问了一次目标IP,多了43个包
    [root@chyuanliuNJ ~]# iptables -nvL
    Chain INPUT (policy ACCEPT 93 packets, 6382 bytes)
     pkts bytes target     prot opt in     out     source               destination
        0     0 DROP       tcp  --  *      *       49.77.177.237        47.96.170.152        tcp spt:1234 dpt:80
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain OUTPUT (policy ACCEPT 71 packets, 26006 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    #不指定IP,如果指定了-p,后面必须加端口。 -I 是插入, -A是在规则后增加
    [root@chyuanliuNJ ~]# iptables -I INPUT -p tcp --dport 80 -j DROP
    [root@chyuanliuNJ ~]# iptables -nvL
    Chain INPUT (policy ACCEPT 24 packets, 1922 bytes)
     pkts bytes target     prot opt in     out     source               destination
        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
        0     0 DROP       tcp  --  *      *       49.77.177.237        47.96.170.152        tcp spt:1234 dpt:80
    ... ...
    
    #同时符合两条规则,则优先匹配上面的
    [root@chyuanliuNJ ~]# iptables -nvL
    Chain INPUT (policy ACCEPT 427 packets, 34560 bytes)
     pkts bytes target     prot opt in     out     source               destination
        7   356 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
        0     0 DROP       tcp  --  *      *       49.77.177.237        47.96.170.152        tcp spt:1234 dpt:80
    ... ...
    
    #删除规则
    [root@chyuanliuNJ ~]# iptables -D INPUT -p tcp --dport 80 -j DROP
    [root@chyuanliuNJ ~]# iptables -nvL
    Chain INPUT (policy ACCEPT 9 packets, 734 bytes)
     pkts bytes target     prot opt in     out     source               destination
        0     0 DROP       tcp  --  *      *       49.77.177.237        47.96.170.152        tcp spt:1234 dpt:80
    ... ...
    
    #那么问题来了,如果用户忘了之前规则如何添加,还有什么办法删除?
    
    [root@chyuanliuNJ ~]# iptables -nvL --line-number
    Chain INPUT (policy ACCEPT 527 packets, 45366 bytes)
    num   pkts bytes target     prot opt in     out     source               destination
    1        0     0 DROP       tcp  --  *      *       49.77.177.237        47.96.170.152        tcp spt:1234 dpt:80
    ... ...
    [root@chyuanliuNJ ~]# iptables -D 链名 编号
    
    
    #可以针对网卡  -i 或者 -o  包进出网卡名字
    

      语法

    iptables(选项)(参数)
    

       选项

    -t<表>:指定要操纵的表; 
    -A:向规则链中添加条目;在后 
    -D:从规则链中删除条目; 
    -I:向规则链中插入条目;在前 
    -R:替换规则链中的条目; 
    -L:显示规则链中已有的条目; 
    -F:清楚规则链中已有的条目;
    -Z:清空规则链中的数据包计算器和字节计数器;
    -N:创建新的用户自定义规则链;
    -P:定义规则链中的默认目标; 
    -h:显示帮助信息; 
    -p:指定要匹配的数据包协议类型; 
    -s:指定要匹配的数据包源ip地址; 
    -j<目标>:指定要跳转的目标;
    -i<网络接口>:指定数据包进入本机的网络接口;
    -o<网络接口>:指定数据包要离开本机所使用的网络接口。
    

       iptables命令选项输入顺序

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

       规则链名包括

    INPUT链:处理输入数据包。 
    OUTPUT链:处理输出数据包。 
    PORWARD链:处理转发数据包。 
    PREROUTING链:用于目标地址转换(DNAT)。 
    POSTOUTING链:用于源地址转换(SNAT)。
    

      1.PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT,DNAT 、REDIRECT   (路由之前)只支持-i,不支持-o。在作出路由之前,对目的地址进行修改
      2.POSTROUTING:可以在这里定义进行源NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则。SNAT、MASQUERADE (路由之后)只支持-o,不支持-i。在作出路由之后,对源地址进行修改
      3.OUTPUT:定义对本地产生的数据包的目的NAT规则。DNAT 、REDIRECT   (本机)DNAT和REDIRECT规则用来处理来自NAT主机本身生成的出站数据包.

      动作包括

    accept:接收数据包。
    DROP:丢弃数据包。 
    REDIRECT:重定向、映射、透明代理。 
    SNAT:源地址转换。 
    DNAT:目标地址转换。 
    MASQUERADE:IP伪装(NAT),用于ADSL。 
    LOG:日志记录。
    

         SNAT,DNAT,MASQUERADE

      互联网是由众多局域网组织连接起来的,但是私网地址不能直接访问互联网,如果每台主机都配置公网地址就不够用了,因此需要用到地址转换功能,有两种情况:

    • 作为服务器端,要接受客户端的请求,而客户端访问的是公网地址,而服务器端是私网地址,于是需要将公网地址转换为对应的私网地址,这就是所谓的DNAT
    • 作为客户端,比如公司内部的局域网内的主机需要访问互联网,就需要通过网关路由出去,除了添加路由,我们可以将这些主机配置的私网地址转换为网关的地址,这就是SNAT
          说明:SNAT和DNAT可以不仅可以针对单个地址做转换,也可以针对连续的地址做转换;并且可以针对端口做nat,但是这些都是静态的ip地址转换,若是以dhcp获取的地址怎么办?此时需要用MASQUREADE来转换,它可以自动识别来源地址自动判断后做转换,也可以做静态ip地址的转换,但是开销比较大,因此,如果是静态地址,不建议使用MASQUREADE方式进行转换

      开放指定的端口

    iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机) 
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行 iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问 iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口 iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口 iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口 iptables -A INPUT -j reject #禁止其他未允许的规则访问 iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问

       屏蔽IP

    iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令 
    iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
    

       灵活对某些IP段进行操作, -m iprange --src-range  后接IP范围

    iptables -I INPUT -m iprange --src-range 61.4.176.0-61.4.191.255 -j DROP
    

    iptables限制syn速度

      原理,每5s内tcp三次握手大于20次的属于不正常访问。

    iptables -A INPUT -s ! 192.168.0.0/255.255.255.0 -d 192.168.0.101 -p tcp -m tcp --dport 80 -m state --state NEW -m recent --set --name httpuser --rsource
    
    iptables -A INPUT -m recent --update --seconds 5 --hitcount 20 --name httpuser --rsource -j DROP
    

          其中的 -m 选项为模块,-m module_name,module_name可以在接其他选项。 

      其中192.168.0.0/255.255.255.0 为不受限制的网段, 192.168.0.101  为本机IP。
      该iptables策略,可有效预防syn攻击,也可以有效防止机器人发垃圾帖。

    filter小案例

    #注意在shell脚本中一定要写全局路径
    #!/bin/bash
    ipt="/usr/sbin/iptables"
    $ipt -F
    
    #没有加表默认操作filter表
    $ipt -P INPUT DROP
    $ipt -P OUTPUT ACCEPT
    $ipt -P FORWARD ACCEPT
    
    #为了保障TCP/IP链接,保障ESTABLISHED状态链接
    $ipt -A INPUT -m state --state RELATED.ESTABLISHED -j ACCEPT
    
    #针对源IP放行和开放端口
    $ipt -A INPUT -s 192.168.133.0/24 -p tcp --dport 22 -j ACCEPT
    $ipt -A INPUT -p tcp --dport 80 -j ACCEPT
    $ipt -A INPUT -p tcp --dport 21 -j ACCEPT
    -m state --state <状态>
    
    有数种状态,状态有:
    
    ▪ INVALID:无效的封包,例如数据破损的封包状态
    
    ▪ ESTABLISHED:已经联机成功的联机状态;
    
    ▪ NEW:想要新建立联机的封包状态;
    
    ▪ RELATED:这个最常用!表示这个封包是与我们主机发送出去的封包有关, 可能是响应封包或者是联机成功之后的传送封包!这个状态很常被设定,因为设定了他之后,只要未来由本机发送出去的封包,即使我们没有设定封包的 INPUT 规则,该有关的封包还是可以进入我们主机, 可以简化相当多的设定规则。

      -F选项意思是修改默认选项,每一条链的匹配为,如果没有其他规则,就会有默认选项,-F就是修改其默认选项。下图中横线就是其默认选项。可以通过上面shell脚本修改。

      禁其他服务器ping本机,可以ping通外服务器

    iptables -I INPUT -p icmp --icmp-type 8 -j DROP
    

     NAT表应用

      需求一:

      解决方案:

      可以看做把A机器当作路由器,B机器作为客户机与A机器链接。

      注意两台机器配置时候,选择同一台交换机的LAN区段,才能保证可以通信互联。

       

    #命令行临时设置ip,服务器重启则没有,永久生效则修改配置文件
    ifconfig ens37 192.100.1/24
    

       B机器只要一块网卡,只能在虚拟机内进行操作。如果有两块网卡,则down掉一块。命令行设置完IP,测试是否可以Ping通A机内网网卡。

      A机器打开路由转发,修改内核参数

    echo "1" > /proc/sys/net/ipv4/ip_forward
    

       A机器增加iptables规则,让100.0 网段可以上网。

    iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
    

       B上设置网关

    route -n   #查看网关
    route add default gw 192.168.100.1    #设置网关
    

      只要是收到ping包,每个网卡都会予以响应,地址是内核的,与网卡无关,所以把A的内网网卡设置为A的网关可以实现B网卡与A的ens33通信。

      需求二:C机器只能和A机器通信,让C机器可以直接连通B机器的22端口。可以理解为要远程登陆B机器。

      通过A机器跳转到B机器,理解为端口映射。比如可以把B机器的22端口映射为A机器的1122端口。

      打开A上的路由转发

    echo "1" > /proc/sys/net/ipv4/ip_forward
    

        可以把之前规则删除以防影响,在A上执行,这是进去的包操作规则

    iptables -t nat -A PREROUTING -d 192.168.133.130 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22
    

       返回的包操作规则,在A上执行

    iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.133.130
    

       B机器加上网关

      就可以在C机器上远程A机器的IP:1122来链接B机器

      总结一下iptables中DNAT、SNAT和MASQUERADE的机制:

      图中正菱形的区域是对数据包进行判定转发的地方。在这里,系统会根据IP数据包中的destination ip address中的IP地址对数据包进行分发。如果destination ip adress是本机地址,数据将会被转交给INPUT链。如果不是本机地址,则交给FORWARD链检测。

      这也就是说,我们要做的DNAT要在进入这个菱形转发区域之前,也就是在PREROUTING链中做,比如我们要把访问192.168.133.130的访问转发到192.168.100.100上:

      iptables -t nat -A PREROUTING -d 192.168.133.130 -j DNAT --to-destination 192.168.100.100

      这个转换过程当中,其实就是将已经达到这台Linux网关(防火墙)上的数据包上的destination ip address从192.168.133.130修改为192.168.100.100然后交给系统路由进行转发。

      而SNAT自然是要在数据包流出这台机器之前的最后一个链也就是POSTROUTING链来进行操作

      iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to-source 192.168.133.130

      这个语句就是告诉系统把即将要流出本机的数据的source ip address修改成为192.168.133.130。这样,数据包在达到目的机器以后,目的机器会将包返回到192.168.133.130也就是本机。如果不做这个操作,那么你的数据包在传递的过程中,reply的包肯定会丢失。

      假如当前系统用的是ADSL/3G/4G动态拨号方式,那么每次拨号,出口IP都会改变,SNAT就会有局限性。

      iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens37 -j MASQUERADE

      重点在那个『 MASQUERADE 』!这个设定值就是『IP伪装成为封包出去(-o)的那块装置上的IP』!不管现在ens37的出口获得了怎样的动态ip,MASQUERADE会自动读取ens37现在的ip地址然后做SNAT出去,这样就实现了很好的动态SNAT地址转换。

    iptables规则备份和恢复

      service iptables save会把规则保存到  /etc/sysconfig/iptables中

      把iptables 规则备份到 my.ipt文件中

      iptables-save > my.ipt

      恢复刚才备份的规则

      iptables-restore < my.ipt

    iptables常用示例

      https://www.cnblogs.com/bill1015/p/6847841.html

  • 相关阅读:
    TCP/IP四层模型
    Java编程题
    大整数阶乘的运算(可以计算1000!) .
    sleep和wait的区别
    Javascript保留字(Javascript Reserved Words)
    WEBLOGIC 内存溢出 解决方案
    Java学习的30个目标以及系统架构师推荐的书
    笔记分析
    MySQL分区(Partition)功能试验
    Java线程:生产者消费者模型
  • 原文地址:https://www.cnblogs.com/chyuanliu/p/7922767.html
Copyright © 2011-2022 走看看