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 种中的一个,否则就是还没处理完:
- ACCEPT – 接受。如果被接受,一个数据包就可以从 iptables 中出来了,不用再接着被后面的规则检验。
- DROP – 丢弃。如果被丢弃,这个数据包就沉没了,直接从 iptables 的流水线上被拿下来扔掉。
- REJECT – 拒绝。如果被拒绝,这个数据包会被拒收,但是 iptables 会让希望告诉发送方它的数据包被扔掉了。也就是说,实际上这个数据包还是被扔掉了,但是系统会发送回去一个消息,告诉别人一声。
如果一个数据包得到了上面 3 种最终判决结果中的一个,它就会从 iptables 这条流水线上被请下来,否则就继续往下游走。并不是每条规则都能给出上面的最终判决。如果不能给出最终判决,这条规则的操作有:
- 跳转(-j)- 有 2 个跳转方向:
- -j LOG – 做个记录,然后让数据包接着被下面的检查员检查;
- -j other_chain – 将数据包交给另一个链(other_chain)来处理,然后撒手不管。
- 撒手不管 – 这个数据包就流向下一个检查员,由后面的规则进行处置。
设计 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