防火墙是整个数据包进入主机前的第一道关卡。防火墙主要通过Netfilter与TCPwrappers两个机制来管理的。
(1)Netfilter:数据包过滤机制
(2)TCP Wrappers:程序管理机制关于数据包过滤机制有两个软件:firewalld与iptables
动态防火墙后台程序 firewalld 提供了一个动态管理的防火墙,用以支持网络 “ zones” ,以分配对一个网络及其相关链接和界面一定程度的信任。它具备对 IP v4 和 IP v6 防火墙设置的支持。它支持以太网桥,并有分离运行时间和永久性配置选择。它还具备一个通向服务或者应用程序以直接增加防火墙规则的接口。
iptables和firewalld是防火墙中常用的两种程序,可以灵活运用。
- firewalld 和 iptables之间最本质的不同是:
iptables service 在 /etc/sysconfig/iptables 中储存配置。
firewalld 将配置储存在 /usr/lib/firewalld/和/etc/firewalld/中的各种xml文件里。其中/usr/lib/firewalld/目录下的文件更全。services目录中是可以为firewalld添加的各种服务;zones目录中是firewalld的各种域的相关文件
- iptables通过控制端口来控制服务,而firewalld则是通过控制协议来控制端口
我们这里先对firewalld做实验。Iptables和firewalld只能开一个。
主机环境:rhel7.0
各主机信息
主机名 | IP |
---|---|
server | 172.25.254.1 |
desktop | 172.25.254.2 |
物理机(rhel7.3版本) | 172.25.254.7 |
安装配置
- "yum install firewalld"安装firewalld服务。
- "yum insatll firewall-config"安装firewall-config图形化管理工具。
- "systemctl start firewalld"开启firewalld服务。
- "systemctl stop firewalld"关闭firewalld服务。
- "systemctl disable firewalld"设置firewalld服务开机不自启动。
- "systemctl enable firewalld"设置firewalld服务开机自启动。
- "systemctl status firewalld"查看firewalld服务的当前状态。
系统提供了三种配置firewalld的方法:(1)图形化的配置工具 firewall-config ;(2)直接编辑xml文件;(3) 命令行工具 firewall-cmd;
这里主要介绍命令行的方式配置firewalld。
- "firewall-config"。打开firewalld的图形化界面
其中左下角为软件管理的域,有以下9种(public为firewalld的默认域)
block域(限制)和drop域(丢弃)的区别:
- block有回应;
- 而drop没有回应。
Configuration有临时设定(Runtime)和永久(Permanent)设定两种,临时设定reload后会恢复原状态,而永久不会。
每个域后有管理的服务,端口等等
- "cd /etc/firewalld/zones"。进入目录/etc/firewalld/zones
- "vim public.html"。编辑public域的文件。删除第6行(http的设置)和第7行(ssh的设置),重新加载firewalld(或者重启firewalld服务)生效
- "firewall-cmd --list-all"。可以看到刚刚删除的http服务和ssh服务消失。
- "cd /usr/lib/firewalld./services"。进入目录/usr/lib/firewalld/services
- "cp http.xml http8080.xml"。复制http.xml为http8080.xml
- "vim http8080.xml"。编辑http8080.xml文件,将其中的80该为8080。保存退出。重新加载firewalld(或者重启firewalld服务)生效
- "firewall-cmd --get-services"。可以看到新增了一个http8080服务。
此时就可以把http8080服务加入到firewalld里面了
1、
- "firewall-cmd --state"。查看firewalld的当前状态,查询状态还可以用"systemctl status firewalld"
2、
- "firewall-cmd --get-zones"。查看firewalld有哪些域
- "firewall-cmd --get-active-zones"。查看firewalld当前生效的域
- "firewall-cmd --get-default-zone"。查看firewalld默认生效的域
3、
- "firewall-cmd --get-services"。列出系统中用名称表示的服务,即firewalld可以允许的服务
4、
- "firewall-cmd --set-default-zone=trusted"。修改firewalld的默认域,将其修改为trusted
- 注意:此修改是永久生效,不需要加参数permanent。而且不用重新加载firewalld。
如果将firewalld的默认域修改为trusted,那么相当于所有的都能通过。此时,即使firewalld里面没有添加http,也是可以访问apache的。
5、
- "firewall-cmd --list-all"。列出firewalld当前域的规则
- "firewall-cmd --list-all-zones"。列出firewalld所有域的状态
6、
- "firewall-cmd --zone=trusted --list-all"。列出firewalld的trusted域的规则
7、
- "firewall-cmd --reload"。重新加载firewalld配置
- "firewall-cmd --complete-reload"。重新加载firewalld配置
- --complete-reload与--reload的区别在于:--complete-reload断开连接,而--reload不断开连接
此时别的主机,已经通过ssh远程连接
删除ssh服务,通过--reload重新加载,发现客户端仍然可以操作
删除ssh服务,通过--complete-reload重新加载,发现客户端已经不能继续操作了
8、
- "firewall-cmd --add-service=xxxx"。临时添加一个服务,例如添加http,使得这个服务的数据可以通过,但是这个添加是临时的,重新加载firewalld(或者重启firewalld服务)后就会消失
- "firewall-cmd --permanent --add-service=xxxx"。永久添加一个服务,重新加载firewalld(或者重启firewalld服务)生效
9、
- "firewall-cmd --remove-service=xxxx"。临时删除一个服务,重新加载firewalld(或者重启firewalld服务)后又会出现
- "firewall-cmd --permanent --remove-service=xxxx"。永久删除一个服务,重新加载firewalld(或者重启firewalld服务)生效
10、
- "firewall-cmd --add-port=xxxx/tcp"。临时添加一个端口,添加是临时的,重新加载firewalld(或者重启firewalld服务)后就会消失
- "firewall-cmd --permanent --add-port=xxxx/tcp"。使某个端口的数据可以通过。例如在Apache配置文件中将端口改为8080,则即使firewall中添加 了htpp也无法访问,因为其设置的可以通过的端口是80。此时需要用上述命令,添加8080端口,完成后,即可使用Apache访问。重新加载firewalld(或者重启firewalld服务)生效
11、
- "firewall-cmd --remove-port=xxxx/tcp"。临时删除一个端口,重新加载firewalld(或者重启firewalld服务)后又会出现
- "firewall-cmd --permanent --remove-port=xxxx/tcp"。永久删除某tcp端口,重新加载firewalld(或者重启firewalld服务)生效
12、
- "firewall-cmd --add-source=172.25.254.83 --zone=trusted"。临时往trusted域添加一个源IP,添加是临时的,重新加载firewalld(或者重启firewalld服务)后又会消失
- "firewall-cmd --permanent --add-source=172.25.254.7 --zone=trusted"。永久往trusted域添加一个源IP。表示来自"172.25.254.7"的数据全部通过。如果开启,firewalld不添加http,且改为8080 端口后不添加到firewalld,"172.25.254.7 "主机也可以访问Apache,重新加载firewalld(或者重启firewalld服务)生效
此时172.25.254.83可以访问172.25.254.1的apache
而172.25.254.2不可以访问172.25.254.1的apache
13、
- "firewall-cmd --remove-source=172.25.254.7 --zone=trusted"。临时删除trusted域的一个源IP。重新加载firewalld(或者重启firewalld服务)后又会出现
- "firewall-cmd --permanent --remove-source=172.25.254.83 --zone=trusted"。永久删除trusted域的一个源IP。重新加载firewalld(或者重启firewalld服务)生效
14、
firewall-cmd --remove-interface=eth0"。删除默认域public中的端口eth0。注意:不需要添加参数"--permanent",也不需要重新加载firewalld(或者重启firewalld服务),立即生效。重载firewalld服务之后,不会失效,但是重启firewalld服务之后,就是失效。
firewall-cmd --permanent --remove-interface=eth0"。此语句有错误。
15、
"firewall-cmd --add-interface=eth0"。往默认域public中添加端口eth0。注意:不需要添加参数"--permanent",也不需要重新加载firewalld(或者重启firewalld服务),立即生效。重载firewalld(或是重启firewalld)服务之后,也不会失效。
"firewall-cmd --permanent --add-interface=eth0"。往默认域public中添加端口eth0。注意:需要重新加载firewalld(或者重启firewalld服务),才能生效。
16、
"firewall-cmd --change-interface=eth0 --zone=trusted"。改变端口eth0所在的域,将域改为trusted域。注意:不需要添加参数"--permanent",也不需要重新加载firewalld(或者重启firewalld服务),立即生效。重载firewalld服务之后,不会失效。但是重启firewalld服务之后,就会失效。
"firewall-cmd --permanent --change-interface=eth0 --zone=trusted"。注意:需要重新加载firewalld(或者重启firewalld服务),才能生效。
17、
block域(限制)和drop域(丢弃)的区别:
- block有回应;
- 而drop没有回应。
- "firewall-cmd --zone=block --add-source=172.25.254.7 "。将172.25.254.7这个IP加入block域。此操作在IP为172.25.254.1的主机上操作。此时在IP为172.25.254.7的主机上ping172.25.254.1,是ping不通的,但是有回应。
- "firewall-cmd --zone=drop --add-source=172.25.254.7 "。将172.25.254.7这个IP加入drop域。此操作在IP为172.25.254.1的主机上操作。此时在IP为172.25.254.7的主机上ping172.25.254.1,是ping不通的,但是有没有回应的。
常见服务的端口介绍:
- httpd服务/nginx服务:80端口
- ssh服务:22端口
- https服务:443端口
- mariadb/mysql服务:3306端口
- php:9000端口
- squid服务:3128端口
- iscsi服务:3306端口
- memcache服务:11211端口
注意:不能将此IP加入trusted域,因为这样的话,IP为172.25.254.7可以访问任何东西。
此时需要做两件事:1、firewalld允许通过的服务中不能有http服务;2、设置Direct Rules只允许172.25.254.7可以访问。
第一步:
fireward允许通过的服务中默认没有httpsd服务,所以不用做修改
第二步:
- "firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 172.25.254.7 -j ACCEPT" #这条命令是临时的,在重启firewalld服务(重载firewalld服务之后,不会失效)之后,就会失效。
解释:
- filter:表示三张表中的filter表
- INPUT:表示五条链中的INPUT链
- 1:表示第一行
- -p:表示正在使用的协议
- tcp:表示tcp协议
- --dport:表示目的地端口
- 80:表示apache的端口
- -s:表示数据来源
- 172.25.254.7:表示数据来源是172.25.254.7
- -j:表示动作(该动作有三种状态:(1)REJECT——拒绝;(2)ACCEPT——接受;(3)DROP——丢弃。)
- ACCEPT:表示状态是ACCEPT
**注意**:对于动作DROP和REJECT两者的区别要明确;
REJECT动作相当于是客户端对服务器发送访问请求,服务端产生回应,并拒绝当前的客户端进行访问;而,DROP动作是客户端对服务器发送请求,但是服务器是不会给予回应的,相当于丢弃;
第三步:
- "firewall-cmd --direct --get-all-rules"。查看Direct Rules中的规则
第四步:
测试:
1、首先在172.25.254.7这台主机的浏览器进行测试(成功说明不了问题,还需要在其他主机进行测试)
2、在172.25.254.2这台主机的浏览器进行测试
第五步:(可做可不做)
- "firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 172.25.254.83 -j ACCEPT"。删除Direct Rules域中的此规则
此时需要做两件事:1、firewalld允许通过的服务中必须有ssh服务;2、设置Direct Rules不允许172.25.254.7可以访问。此时有两种状态可以设置:一种是REJECT;另外一种是DROP。
第一步:
- "firewall-cmd --permanent --add-service=ssh"
- "firewall-cmd --reload"
- "firewall-cmd --list-all"
第二步:
- "firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.7 -j REJECT" #这条命令是临时的,在重启firewalld服务(重载firewalld服务之后,不会失效)之后,就会失效。
第三步:
- "firewall-cmd --direct --get-all-rules"。查看Direct Rules中的规则
第四步:
测试:
1、首先对172.25.254.7这台主机进行测试:此时被拒绝有回应(成功说明不了问题,还需要在其他主机进行测试)
2、对172.25.254.2这台主机的浏览器进行测试
第五步:(可做可不做)
- "firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.7 -j REJECT"。删除Direct Rules中的规则
第一步:
- "firewall-cmd --permanent --add-service=ssh"
- "firewall-cmd --reload"
- "firewall-cmd --list-all"
第二步:
- "firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.7 -j DROP" #这条命令是临时的,在重启firewalld服务(重载firewalld服务之后,不会失效)之后,就会失效。
第三步:
- "firewall-cmd --direct --get-all-rules"。查看Direct Rules中的规则
第四步:
测试:
1、首先对172.25.254.7这台主机进行测试:此时被拒绝没有回应(成功说明不了问题,还需要在其他主机进行测试)
2、对172.25.254.2这台主机进行测试
第五步:(可做可不做)
- "firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.7 -j DROP"。删除Direct Rules中的规则
要实现调转端口必须打开firewalld的地址伪装功能!!!!!!!!!!
调转的目的端口必须使得firewalld可以通过ssh服务!!!!!!!!!
第一步:
- "firewall-cmd --permanent --add-masquerade"。打开firewalld的地址伪装功能,重新加载firewalld(或者重启firewalld服务)生效
第二步:
- "firewall-cmd --add-forward-port=port=22:proto=tcp:toport=22:toaddr=172.25.254.2"。设置通过ssh连接172.25.254.1时,自动调转到172.25.254.2。 #这条命令是临时的,在重启firewalld服务(或重载firewalld服务)之后,就会失效。
第三步:
- 需要注意的是:172.25.254.2这台主机的firewalld必须允许ssh服务通过
第四步:
- 测试:通过ssh远程连接172.25.254.1这台主机时,自动调转到172.25.254.2(此时输入的密码是:IP为172.25.254.2主机的密码)
- 注意:此时通过"w -i"命令看到的IP不是真正连接的IP(172.25.254.7),而是要实现调转端口的IP(172.25.254.1)
- 注意:出现下面的错误时的解决方法
第五步:(可做可不做)
- "firewall-cmd --remove-forward-port=port=22:proto=tcp:toport=22:toaddr=172.25.254.2"。删除上面实现自动调转的设置。
要实现地址伪装,有两个网卡的虚拟机必须打开firewalld的地址伪装功能!!!!!!!!!!
有两个网卡的虚拟机必须打开地址转发功能!!!!!!!!!!
要通过ssh远程连接的目的主机必须使得firewalld能够通过ssh服务!!!!!!!!!
第一步:在这台虚拟机(server)添加第二块网卡eth1;
第二步:在含有两块网卡的主机(server虚拟机)上做如下设置;
- "cd /etc/sysconfig/network-scripts"
- "cp ifcfg-eth0 ifcfg-eth1"
- "vim ifcfg-eth1"。编辑如下的内容
- "systemctl restart network"
- "ifconfig"
第三步:在含有两块网卡的主机(server虚拟机)上打开地址伪装功能;
第四步:在含有两块网卡的主机(server虚拟机)上打开地址转发功能
第五步:在含有一块网卡(desktop虚拟机)的主机上做如下设置;
- "cd /etc/sysconfig/network-scripts"
- "vim ifcfg-eth0"。编辑如下的内容
- "systemctl restart network"
- "ifconfig"
- "route -n"。查看网关
第六步:在要远程连接的目的主机上使得firewalld能够通过ssh服务
第七步:在单网卡虚拟机(desktop虚拟机)上测试
1.1.1.2和172.25.254.7因为不在一个网段里,网络是不能连通,这里为什么可以利用ssh服务可以连接呢?实际上是172.25.254.1登陆172.25.254.7,而不是1.1.1.2登陆172.25.254.7;这里也就完成了地址伪装。
当然,我们可以利用"w -i"查询看到的是真正登陆的ip(172.25.254.1)。1.1.1.1是可以和172.25.254.1通信的。(这是因为1.1.1.1和172.25.254.1这两个IP是同一台主机的两个网卡的IP)。1.1.1.2是可以和1.1.1.1通信的。(这是因为1.1.1.1和1.1.1.2处于同一个网络段)
那么要使得1.1.1.2和172.25.254.1通信,就需要1.1.1.1作为中间人,也就是我们所说的网关。
网关设定好之后,1.1.1.2是可以和172.25.254.1通信的。但是不可以和172.25.254.7通信。(这是因为1.1.1.1不可以和172.25.254.7通信)。那么要使1.1.1.2可以和172.25.254.7通信,就需要在172.25.254.1的主机上打开地址伪装功能(即添加masquerade),并打开地址转发功能。