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

 

posted @ 2017-11-29 21:15  chyuanliu  阅读(283)  评论(0编辑  收藏  举报