firewalld防火墙
firewalld防火墙
什么是防火墙?
就是隔离工具,工作于主机或者网络的边缘,对于进出本主机或者网络的报文根据事先定义好的网络规则做匹配检测,对于能够被规则所匹配的报文做出相应处理的组件(这个组件可以是硬件,也可以是软件)。他与杀毒软件并不是一回事。
Linux大致分为两类:用户空间,内核空间
用户空间:输入命令的地方就是用户空间,这些命令都是运行在用户空间的。输入的命令都是管理的工具。
内核空间:当你敲入命令的时候,它会从用户空间调内核空间的东西。
对于防火墙而言:
比如我的简图,我要上网,是通过ip地址上网的,c类地址是不可以直接连接外网的(可以通过路由转发功能),那么我的机器是怎么上网的呢,是通过出口这么一个其前端的路由,我所在的学校是有一个公共IP,大家都是通过这么一个IP上网的,这个前端路由除了起到上网作用,还起到防火墙的作用,如果没有一套过滤的规则,那么是不是什么报文都能接收到,是极为不安全。所以这个前端可以是路由,也可以是防火墙,可是是主机firewalld,可以是硬件防火墙。
主机防火墙(就是访问本主机):上边是用户空间,下边是内核空间,当外面有一台主机去访问你这台主机的时候,它首先经过内核空间,你的用户空间是根本接收不到任何消息的,我用户空间跑着一个web服务,你访问的时候首先是经过网卡,那么你想访问我的web就涉及到我的防火墙规则允不允许你访问,你访问的是我的主机,就涉及到了INPUT和OUTPUT。
如果我还有另一台主机,我想访问的是最左边的,而不是中间的,但是我又没有办法直接去访问,那么有没有可能client在访问中间主机的时候并不是访问的这个主机,而是通过它来传递报文,将报文传递给最左边的主机,实现访问,这样就不会经过用户空间了,就会有一个forward,路由转发。
比如最左端的机器是一个外网地址,最右端的机器是内网地址,那么,我中间的机器就会有两个网口,一个内网接口,一个外网接口,外网接口用于我client端访问外网的请求进来了,我的源地址是client端的,经过中间机器的路由转发功能,将我的源地址转换成外网地址,这样我的请求就可以发送到外网,这就是源地址转换,但访问是一来一回的,光过去不行,还得回来,那么回来的地址是外网的,经过内网接口,将目标地址转换为内网地址,这就是目标地址转换。
功能(也叫表)
filter:过滤,防火墙
nat:network address translation,网络地址转换
mangle:拆分报文,做出修改,在封装起来
raw:关闭nat表上启用的连接追踪功能
链(内置):
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
数据报文的流向
流入:PREROUTING --> INPUT
流出:OUTPUT --> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING
各功能可以在哪些链上实现
filter: INPUT,FORWARD,OUTPUT
nat:PREROUTING(DNAT),OUTPUT,INPUT,POSTROUTING(SNAT)
mangle: PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
raw:PREROUTING,OUTPUT
firewalld优先级
策略应用优先级:raw, mangle, nat, filter
比如说你在raw表上创建的规则跟nat表上创建的规则相违背,它会先遵循raw表上的,这是优先级。
策略常用优先级:filter,nat,mangle,raw
iptables命令
#-t是制定表 不家-t默认是filter表
#查看防火墙原有策略
iptables –L
#以数字显示选定表上的所有链。
iptables –t 选择要查看的表 –L - n
#清空选定表上原有的链(就是规则)
iptables -t 选定的表 –F
#删除选定的表上所有自定义的链
iptables –t 选定的表 –X
#实现过滤功能
#在这个链上去创建一个规则,只要你访问的是这个表上的ip,并且用的是icmp协议,我都拒绝你访问。这个没有响应。
iptables –t filter –A INPUT –d(dest) ip地址 –p icmp(ping的协议) -j REJECT
#这样也是拒绝访问,只不过是有返回值。
iptables –t filter –A INPUT –d(dest) ip地址 –p icmp(ping的协议) -j DROP
#给链显示序列号
iptables –L –n - -line-numbres
#删除指定链上的规则
iptables –D 选择要删除的链和序列号
只要一重启,里面的策略都会消失。如何保存?
iptables-save > /etc/sysconfig/iptables (保存)
重启firewalld之后,iptables-restore < /etc/sysconfig/iptables即可。(恢复)
#设立黑名单,这是把INPUT和OUTPUT都锁死,任何的流入跟流出都不允许
iptables –P INPUT DROP
iptables –P OUTPUT DROP
#这样我在设立规则,就是白名单了
#只允许我windows访问22端口并且是tcp协议。
iptables –A INPUT -s 原地址 –d 要访问的ip – tcp(ssh协议)--dport(指定端口号) 22 –j ACCEPT
#比如你去访问一个网页,他的端口是80,但你的客户端的端口是不确定的。
iptables –A OUTPUT –s 原地址 –d 要访问的ip –p tcp(ssh协议)--sport(指定端口号) 22 –j ACCEPT
#只允许我windows访问22端口并且是tcp协议。
iptables –A INPUT -s 原地址 –d 要访问的ip –p tcp(ssh协议)--dport(指定端口号) 80 –j ACCEPT
#只允许我windows访问22端口并且是tcp协议。
iptables –A INPUT -s 要访问的ip –d 原地址 –p tcp(ssh协议)--sport(指定端口号) 80 –j ACCEPT
#插入
iptables –I
nat表的常用操作
路由转发功能
当我client端向web端发起访问请求,此时,我的的源地址是20.2,目标地址是100.2,因为C类地址是没有办法在互联网上进行访问的,所以他需要进行网络地址转换,转换后,源地址变为了100.1,目标地址还是100.2,这就是SNAT。
回应的时候,源地址是100.2,目标地址是100.1,在经过网络地址转换,源地址是100.2,目标地址变为20.2,这就是DNAT。
首先准备三台虚拟机,一台做firewalld,另两台一台充当内网机器,一台充当外网机器,firewalld机器的网卡需两个,他们的ip分别充当内网机器跟外网机器的网关,内网机器跟外网机器ip选择不同的vmnet,这样初步的实验环境以搭建好。
server端:
两块网卡,一块vmnet2,一块vnmet3
vmnet2对应ens33
TYPE=Ethernet
ONBOOT=yes
DEVICE=ens33
BOOTPROTO=static
IPADDR=172.16.100.1
NETMASK=255.255.255.0
vmnet3对应ens37
TYPE=Ethernet
ONBOOT=yes
DEVICE=ens37
BOOTPROTO=static
IPADDR=192.168.20.1
NETMASK=255.255.255.0
client1端(vmnet2)
TYPE=Ethernet
ONBOOT=yes
DEVICE=ens33
BOOTPROTO=static
IPADDR=172.16.100.2
GATEWAY=172.16.100.1
NETMASK=255.255.255.0
client2端(vmnet3)
TYPE=Ethernet
ONBOOT=yes
DEVICE=ens33
BOOTPROTO=static
IPADDR=192.168.20.2
GATEWAY=192.168.20.1
NETMASK=255.255.255.0
现在firewalld可以ping通内网跟外网的机器,但是内网跟外网却不能相互ping通,这个就需要路由转发功能。他的参数是/proc/sys/net/ipv4/ip_forward,0代表没有开启,1代表开启。但是用echo 1 这种开启是临时的,重启就没有了。(在client端操作)
如何永久性保存路由转发功能
编辑 /etc/sysctl.conf这个配置文件,在里面写入net.ipv4.ip_forward=1,而后sysctl –p 让刚才设置的生效即可永久实现路由转发功能。
网络地址转化
我现在client1端开启httpd服务,我的client2端是可以访问到的,那么我们看一下client1端的httpd的访问日志,,这是client2端的访问记录,那么我们可以设立规则,使用统一的IP去访问client1端,这样尽可能的保护了访问端。
#那么我们需要在nat表上做策略,因为是源地址转换,所以在POSTROUTING链上做
iptables –t nat –A POSTROUTING –s 192.168.20.2 –d 172.16.100.2 -j SNAT --to-source 你想设立的统一IP
#这样你再去访问client1端,那么,他的日志显示的都是你设置的统一IP。
怎么验证DNAT,当我client1访问server端的httpd,可是server端并没有开启httpd,但是server端将client1端的请求转到了有httpd的client2端上。这样我还是能访问到页面,这就是做了DNAT。
iptables –t nat –A PREROUTING -s 172.16.100.2 –d 172.16.100.1 –j DNAT –to-destination 192.168.20.2