Linux中的火墙策略优化
1 实验环境搭建
1)一台双网卡的虚拟机,一个172.25.254.网段,一个192.168.4.网段。
首先添加网卡:
查看有两个网卡:
两块网卡,只有一个网卡上有ip:
添加一个192.168.4.网段的ip:
注意:这里添加ip的时候,忘记在ip后面添加网关,所以导致两台192网段主机之间ping不通,后面修改了网关。
2)一台192.168.4网段的虚拟机:
3)一台172.25.254.网段的真机:
2 火墙介绍
- netfilter:它是内核上的一个插件,是一套防火墙系统,用户可以通过运行在用户空间的工具把相关配置下发给netfilter,它使得数据包过滤、网络地址转换和基于协议类型的连接跟踪成为了可能
- iptables:可以用来管理netfilter,给netfilter里的表格里写火墙策略
- iptables/firewalld:linux系统中,可以用这两种命令对火墙进行操作。iptables的特点是,直接操作三个表五条链,而firewalld的使用更为简单
3 火墙管理工具的切换
在企业八版本中,默认使用的是firewalld,但是也可以切换为iptables
- firewalld 切换到 iptables
- dnf install iptables-services -y
- systemctl stop firewalld
- systemctl disable firewalld
- systemctl mask firewalld
- systemctl enable --now iptables
- iptables 切换到 firewalld
- dnf install firewalld -y
- systemctl stop iptables
- systemctl disable iptables
- systemctl mask iptables
- systemctl enable --now firewalld
4 火墙默认策略
火墙中的三张表和五条链:
- filter表:经过本机内核的数据;input链—>从单网卡主机访问双网卡主机输入时;;output链—>内核给该访问的主机一个输出回应;forward链—>转发,单网卡主机通过双网卡主机方位另一台不同网段的单网卡主机时
- nat表:不经过内核的数据;input、output、postrouting—>陆游后、prerouting—>路由器前
- mangle表:附加表,当前面两张表不够用时会使用该表; input、forward、output、postrouting、prerouting(所有的五条链)
5 firewalld
5.1 firewalld的开启
systemctl stop iptables
systemctl disable --now iptables
systemctl mask iptables
systemctl unmask firewalld
systemctl enable --now firewalld
5.2 firewalld的域
域 | 含义 |
---|---|
trusted | 接受所有的网络连接 |
home | 用于家庭网络,允许接受ssh、mdns、ipp-client、samba-client、dhcp-client |
work | 工作网络,允许接受ssh、ipp-client、dhcp-client |
public | 公共网络,允许接受ssh、dhcp-client |
dmz | 军级网络,允许接受ssh |
block | 拒绝所有 |
drop | 丢弃,所有数据全部丢弃无任何回复 |
internal | 内部网络 ,允许接受ssh、mdns、ipp-client、samba-client、dhcp-client |
external | ipv4网络地址伪装转发,允许接受sshd |
使用firewall-cmd --list-all --zone=域,可以查看指定域的火墙策略,默认的域是public:
5.3 firewalld的设定原理及数据存储
目录 | 含义 |
---|---|
/etc/firewalld | 火墙配置目录 |
/lib/firewalld | 火墙模块目录 |
5.4 firewalld的管理命令
命令 | 含义 |
---|---|
firewall-cmd --state | 查看火墙状态 |
firewall-cmd --get-active-zones | 查看当前火墙中生效的域 |
firewall-cmd --get-default-zone | 查看默认域 |
firewall-cmd --list-all | 查看默认域中的火墙策略 |
firewall-cmd --list-all --zone=work | 查看指定域的火墙策略 |
firewall-cmd --set-default-zone=trusted | 设定默认域 |
firewall-cmd --get-services | 查看所有可以设定的服务 |
firewall-cmd --permanent --remove-service=cockpit | 移除服务 |
firewall-cmd --reload | 重新加载 |
firewall-cmd --permanent --add-source=172.25.254.0/24 --zone=block | 指定数据来源访问指定域 |
firewall-cmd --permanent --remove-source=172.25.254.0/24 --zone=block | 删除指定域中的数据来源 |
firewall-cmd --permanent --remove-interface=ens224 --zone=public | 删除指定域的网络接口 |
firewall-cmd --permanent --add-interface=ens224 --zone=block | 添加指定域的网络接口 |
firewall-cmd --permanent --change-interface=ens224 --zone=public | 更改网络接口到指定域 |
注意:每次修改了火墙策略等,都需要重新加载服务,否则不生效
1)查看火墙状态;查看当前火墙中生效的域,可以看到当前生效的域是public:
2)查看默认域;将默认域修改为trusted,然后查看默认域中的火墙策略:
3)查看指定域的火墙策略:
4)查看所有可以设定的服务:
5)添加http服务,当不加–permanent参数时,是临时设定,火墙重新加载后,该服务就不在火墙策略中了:
加上–permanent参数表示永久设定,重新加载火墙后,该服务还在:
移除服务:
6)安装htppd服务,修改该服务的端口:
在该服务配置文件中,将端口改为8008,重启服务,然后查看端口:
此时虽然添加该服务,但分别去两台单网卡的主机中访问该主机的apache是无法访问的,因为修改后的端口没有生效:
去172网段的主机上访问该双网卡172网段的ip,同理也在192网段的主机上,访问该双网卡192网段的ip,都是不成功的:
此时可以在火墙策略中添加一个8008端口,然后再去另外两台主机中网页访问该主机的apache,就可以访问到:
成功访问:
做完实验后,移除端口:
将配置文件中的8080端口,修改回原来的80端口,然后重启服务:
7)将172网段设置为全黑,此时172网段的主机输入该双网卡主机的172网段是无法访问apache的:
查看block域中的火墙策略:
此时在172网段的主机上访问apache不成功:
将172网段从全黑域中移除:
8)查看默认public域中的火墙策略,可以看到接口处有两个设备,然后从火墙策略中移除http服务:
将enp1s0设备从public域中移除,然后将它添加到trusted域中:
分别查看默认public域和trusted域中的火墙策略,可以看到enp1s0设备在trusted域中:
trusted域代表接受所有的网络连接,所以此时,该网卡,也就是172网段的主机即使在火墙策略中没有http服务的情况下,也可以访问到apache;此时192网段主机会因为火墙策略中没有http服务而无法访问apache:
9)改变enp1s0设备的域为public,查看默认域中的火墙策略:
将该设备恢复为public域后,再访问apache是无法访问的:
5.5 firewalld的高级规则
命令 | 含义 |
---|---|
firewalld-cmd --dtrect --get-all-rules | 查看高级规则 |
firewalld-cmd --direct --add-rule +其他 | 添加高级规则 |
1)首先在火墙策略中添加http服务,使两个网段的主机都可以访问到:
2)查看火墙的高级规则,因为之前没有设定过高级规则,所以没有高级规则,会显示空:
3)添加高级规则,使用该命令去拒绝172.25.254.36这台主机访问双网卡主机的http服务,但该主机依旧可以使用其他服务;然后查看高级规则:
4)删除高级规则,删除完成后,重新加载火墙策略即可:
5.6 firewalld中的NAT
5.6.1 源地址转换(SNAT)
源地址转换是内网地址访问外网时,发起访问的内网ip地址转化为指定的ip地址,并用该ip去访问和该ip在同一个网段的主机。
1)查看默认域的火墙策略,可以看到masquerade后面是no,这表示双网卡主机没有开启地址伪装功能:
2)开启双网卡主机的地址伪装功能:
3)开启内核陆游,若输入sysctl -a | grep ip_forward,查看到net.ipv4.ip_forward = 1,表示内核陆游开启:
若net.ipv4.ip_forward = 0,则需要编辑/etc/sysctl.conf 文件,将它设置成1。注意:编辑该文件时,=号前后不能有空格,sysctl -p 表示使该文件内容生效:
4)进入192网段的主机,要想不同网段的主机可以互相链接,可以将单网卡主机的网关设置成与双网卡在统一网段的双网卡的ip,注意下面的设置网关的方式是临时的,永久设置可以编辑/etc/sysconfig/network文件。设置完成后去ping172网段的主机成功:
5)可以ping通后,使用192网段的主机去链接172网段的主机:
6)在172网段的主机上输入 w -i查看,发现显示的链接ip是双网卡主机的172网段的ip:
5.6.2 目的地址转换(DNAT)
目的地址转换是指数据包从网卡发送出去的时候,修改数据包中的目的ip,表现为如果想访问A,但是网关做了DNAT,把所有访问A的数据包的目的ip全部修改为B,那么实际上访问的是B。
1)下面的命令表示,若172网段的主机访问,就把他链接到192网段的主机上去,让他直接访问192网段的主机,而不是通过链接双网卡的172网段达到访问的目的:
2)在172网段的主机上链接双网卡主机的172网段,链接上后查看ip,发现实际上链接到了192网段的主机上,所以此时输入密码时,要输入192网段主机的密码,而不是双网卡主机密码,否则无法链接:
注意:因为陆游是按照目的地址来选择的,因此,DNAT是在prerouting链上进行的,而 SDNT是在数据包发送出去的时后才进行,因此是在postrouting链上进行的。
6 iptables的使用
关闭和锁定firewalld防火墙,安装iptables,开启服务;若之前安装过并锁定了iptables,可以将iptables解锁:
查看iptables状态为开启:
6.1 iptables命令及火墙策略的永久保存
参数 | 含义 |
---|---|
-t | 指定表名称 |
-n | 不做解析 |
-L | 查看 |
-A | 添加策略 |
-p | 协议 |
- -dport | 目的地端口 |
-s | 来源 |
-j | 动作 |
-j ACCEPT | 允许 |
-j DROP | 丢弃 |
-j REJECT | 拒绝 |
-j SNAT | 源地址转换 |
-j DNAT | 目的地地址转换 |
-N | 新建链 |
-E | 更改链名称 |
-X | 删除链 |
-D | 删除规则 |
-I | 插入规则 |
-R | 更改规则 |
-P | 更改默认规则 |
1)不做解析查看:
作出解析并查看:
2)-F表示刷新后查看:
刷新是暂时的,重启服务后,就会恢复之前的状态:
iptables的策略记录文件:
想要永久保存,可以使用下面两条命令,其效果和作用是一样的,只是两种不同的保存方式:
3)iptables -nL 命令默认显示的是filter表,下面可见INPUT、FORWARD、OUTPUT三条链;第二条命令iptables -t filter -nL,同第一条命令作用与效果相同,-t表示指定要查看的表:
指定其他两张表查看:
4)在INPUT链下添加策略,协议为tcp、目的地端口为22(即ssh协议)的主机,允许访问:
在INPUT链下添加策略,协议为tcp、目的地端口为22(即ssh协议)的主机,拒绝访问:
在INPUT链下的第二条策略中插入规则,协议为tcp、目的地端口为22(即ssh协议)、ip为172.25.254.36的主机,拒绝访问,此时该主机将无法链接该沙双网卡主机:
5)创建一个名为LHY的新链,然后查看:
修改链LHY的名称为QJW:
删除该链:
6)删除INPUT下的第一条规则:
7)更改之前设定过的规则,将INPUT下的第二条规则,来源ip改为172.25.254.136:
8)更改默认规则为drop丢弃:
更改默认规则为accept:
6.2 数据包状态
火墙的策略是从上到下依次匹配,匹配到后,就不再向下匹配。现在的需求是某个服务要去找最后一个火墙策略,前面有匹配成功的掠过,也就是火墙的优化。
状态 | 含义 |
---|---|
RELATED | 已经建立过连接的 |
ESTABLISHED | 正在连接的 |
NEW | 新的 |
1)刷新:
2)第一条命令表示,添加策略,状态为ESTABLISHED和RELATED的,作允许动作;第二条命令表示,添加策略,状态为新的,回环接口作允许动作;第三到五条命令表示,添加策略,状态为新的数据,协议为tcp,目的地端口为860(iscsi)/5445(smb)/22(ssh)服务可以进入;第六条命令表示,除了上面的服务外,其他服务的数据会被拒绝:
4)iptables -A INPUT -m state --state NEW !-s 172.25.254.36 -p tcp --dport 22 -j ACCEPT,表示允许除172.25.254.36以外的主机通过22端口,也就是ssh服务进入此主机:
在172.25.254.36主机上访问236主机,不成功:
5)在linux中查找某个服务的端口号:
- grep 服务名 /etc/services --> 会查出带有该服务的所有信息
- getent services 服务名/端口号 --> 该命令既可以知道端口号查服务,也可以知道服务名查端口号,比较精准
6.3 iptables中的NAT
6.3.1 源地址转换(SNAT)
1)在双网卡主机中输入该命令,-o参数后面的设备写自己双网卡主机上网卡的名字;然后查看,该命令在postrouting链上生效:
2)在192网段的主机上,查看网关,ping172网段的主机成功:
链接到172网段的主机:
3)在172网段的主机上,查看访问信息,发现虽然是192网段的主机在链接,但是最终显示的是双网卡的172网段在链接:
6.3.2 目的地址转换(DNAT)
1)将172网段主机的访问直接链接到192网段的主机上,该命令作用在PREROUTING链上:
2)用172网段的主机去链接双网卡主机的172网段,登陆后,查看ip,实际上链接的是192网段的主机: