Linux 中的火墙策略优化

实验环境的搭建
需要三台主机处于两个网段,其中一台主机需要两个网卡,其中一个网卡是内网 ip 信息,另外一个是外网 ip 信息。其中内网 ip 为 172.25.254.100,外网 ip 为 192.168.122.100。一台外网主机的 ip 为 192.168.122.1 ;另外一台内网主机 ip 为 172.15.254.200。

设置完成之后,同网段的两台主机之间可以通信,不同网段的主机之间不可以通信。

1. 火墙介绍

  1. netfilter 是火墙的策略文件,当策略中开启某个服务时,才允许访问;
  2. iptables 是管理火墙策略的软件;
  3. iptables 和 firewalld 是 iptables 的上层软件,通过这两个软件来管理火墙策略软件。

2. 火墙管理工具切换

在 rhel 8 中默认使用的是 firewalld

  1. firewalld 切换到 iptables

dnf install iptables-service -y
systemctl stop firewalld
systemctl disable firewalld
systemctl mask firewalld
systemctl enable --now iptables


输入命令 dnf search iptables ,查找 iptables 的相关软件包;
输入命令 dnf install iptables-services.x86_64 -y ,安装 iptables 软件;

在这里插入图片描述

输入命令 systemctl disable firewalld ,停止 firewalld 的管理;
输入命令 systemctl mask firewalld ,将 firewalld 软件锁起来;
输入命令 systemctl enable --now iptables,开启 iptables 软件;

在这里插入图片描述
在开启 iptables 之后,输入命令 systemctl status iptables 便可查看其当前的状态;
输入命令 iptables -nL ,用 iptables 软件查看火墙策略;

在这里插入图片描述
:火墙策略是从上到下依次读取, 直到和对应的匹配。

  1. iptables 切换到 firewalld

dnf install firewalld -y
systemctl stop iptables
systemctl disable iptables
systemctl mask iptables
systemctl enbale --now firewalld


输入命令 systemctl disable --now iptables ,来停止 iptables 的运行;
输入命令 systemctl mask iptables,来锁定 iptables ;
输入命令 systemctl unmask firewalld 来解锁 firewalld ;
输入命令 systemctl enbale --now firewalld ,来开启firewalld 软件;

在这里插入图片描述
在开启之后,输入命令 firewall-cmd --list-all --zone=public 查看 public 域中的火墙策略。

在这里插入图片描述

3. 火墙默认策略

  1. 默认策略中的 5 条链
字符含义
input输入
output输出
forward转发
postrouting路由之前
prerouting路由之后
  1. 默认的 3 张表
表格名称含义
filter经过本机内核的数据 (input output forward)
nat不经过内核的数据 (postrouting prerouting input output)
mangle当filter和nat 表不够用时使用 (input output forward postrouting prerouting )

4. iptables

  1. iptables 的使用
  • 火墙策略的永久保存在 /etc/sysconfig/iptables ,该文件是 iptables 策略记录文件;
  • 永久保存策略
    iptables-save > /etc/sysconfig/iptables
    service iptables save
  1. iptales 命令
命令参数含义
iptables
-t指定表名称
-n不做解析
-L查看
-A添加网络
-p协议
–dport目的地端口
-s来源
-j动作
ACCEPT #允许,DROP #丢弃, REJECT #拒绝, SNAT #源地址转换, DNAT #目的地地址解析
-N新建链
-E更改链名称
-X删除链
-D删除规则
-I插入规则
-R更改规则
-P更改默认规则

输入命令 iptables -nL 表示不做解析查看火墙策略;

在这里插入图片描述
在 iptables 的火墙策略就是记录在策略文件文件中的内容;

在这里插入图片描述
输入命令 iptables -F ,表示对其策略进行刷刷新,刷新之后会将策略中的内容清空,但是并没有清空配置文件中的内容;此时重启服务,策略便会恢复;

在这里插入图片描述
在用命令对其刷新之后,可以用命令 service iptables save 将其策略保存,此时在重启服务时,便会看到保存的策略;

在这里插入图片描述
iptables -t filter -nL,表示对 filter 表的策略不做解析的查看,-t 表示查看指定表名称;不加 -t 就是查看的 filter 表的策略;

在这里插入图片描述
如分别对 nat 和 mangle 表信息的查看;

在这里插入图片描述
对于策略的添加:添加只能一个接一个添加;
输入命令 iptables -A INPUT -p tcp --dport 22 -j ACCEPT ,表示在默认的 filter 表中的 input 中添加策略,当访问 22 端口时都接受;
输入命令 iptables -A INPUT -p tcp --dport 22 -j REJECT, 表示在默认的 filter 表中的 input 中添加策略,当访问 22 端口时都拒绝;

虽然写了两条策略,但是默认是从上向下依次匹配来读取信息,所以在访问 22 端口时都接受。

在这里插入图片描述
如果要有顺序的写入,就需要用到插入的方式写入;
输入命令 iptables -I INPUT 2 -s 172.25.254.200 -p tcp --dport 22 -j REJECT ,表示插入策略到第二条;插入的策略为 来源于 172.25.254.200 的访问 22 端口的信息都拒绝;
如果插入时不加序号,默认会加在第一个。

在这里插入图片描述
此时 172.25.254.200 这台主机在访问该主机时,会被拒绝;

在这里插入图片描述
对于 filter 表中的几个链接之外,还可以创建新的链接;
如输入 iptables -N ZXK ,便会添加一个名称为 ZXK 的链接;

在这里插入图片描述
输入命令 iptables -E ZXK zxk123 ,便会将已有的链接名称 ZXK 更改为 zxxk123;

在这里插入图片描述
对于不需要的链接的删除,可以用命令 iptables -X zxk123 ,便会将 zxk123 这个链接删除;

在这里插入图片描述
对于策略的管理中,删除策略用 iptables -D INPUT 1,表示删除默认 filter 表 INPUT 中的第一条规则;如图所示便可依次删除不需要的规则;

在这里插入图片描述
对于规则的删除增加之外还有修改,如输入命令 iptables -R INPUT 1 -s 172.25.254.11 -p tcp --dport 22 -j ACCEPT ,表示将默认 filter 表 INPUT 中信息的第一条做修改,修改为当 172.25.254.11 来访问 22 端口时接受;

在这里插入图片描述
除了对于以上规则的管理之外,还有对于默认规则的更改;
如输入 iptables -P INPUT DROP 表示将 filter 表 INPUT 改为 DROP ;此处的更改默认没有 REJECT 这个规则。

在这里插入图片描述

  1. 数据包状态
字符含义
RELATED建立过连接的
ESTABLISHED正在连接的
NEW新的

火墙的策略是从上到下依次匹配,当匹配到适合自己的状态时,便不会向下匹配。通过对策略数据包状态的编写来优化火墙。


输入命令 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT,表示添加一个规则,状态为 ESTABLISHED 和 RELATED 的允许访问;
输入命令 iptables -A INPUT -m state --state NEW -i lo -j ACCEPT,表示添加一个规则,状态为新的访问回环接口的允许访问;
输入命令 iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT ,表示添加一个规则,状态为新的数据,端口为 22 的协议为 tcp,允许其访问;
输入命令 iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT ,表示添加一个规则,状态为新的数据,端口为 53 的协议为 tcp,允许其访问;
输入命令 iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT ,表示添加一个规则,状态为新的数据,端口为 80 的协议为 tcp,允许其访问;
输入命令 iptables -A INPUT -m state --state NEW -j REJECT ,表示添加一个规则,状态为新的访问都会被拒绝。

在这里插入图片描述

  1. SNAT 和 DNAT

SNAT
1)在客户机端(内网主机)
在客户端输入命令 ip addr default via 172.25.254.100 ,此方法是临时设定网关;
172.25.254.100 是与该主机的同网段的双网卡主机的 ip ;
然后就可以访问远程不在一个网段的外网主机 ip ;
当前主机 ip 虽然为 172.25.254.200,但是其可以与外网主机 192.168.122.1 通信。

2)在双网卡主机中 :
输入命令 iptables -t nat -A POSTROUTING -o enp1s0 -j SNAT --to-source 192.168.122.100 ,在 nat 表的 POSTROUTING 中添加策略,输出的数据从 enp1s0 网卡出去,执行 SNAT 动作,将数据包装成来源于 192.168.122.100 的访问。

在这里插入图片描述
做好以上设置之后,在内网 172.25.254.200 主机中,连接 192.168.122.1 时会连接成功;

在 192.168.122.1 主机中,查看是谁连接的自己时,会显示被伪装的地址 192.168.122.100。

在这里插入图片描述

DNAT
如果此时外网主机访问内网主机时,可以通过访问双网卡主机,然后双网卡主机将请求转给内网主机;想要其连接的时候自动更改,就要做指向更改。

输入命令 iptables -t nat -A PREROUTING -i enp1s0 -j SNAT --to-dest 172.25.254.200,在 nat 表的 PREROUTING 中添加策略,输入的数据从 enp1s0 网卡进来,执行 DNAT 动作,将数据投递给 172.24.254.200 。

在这里插入图片描述
当在外网 192.168.122.1 主机中连接 192.168.122.100 时,会看到其连接的是 172.25.254.200 的主机。

在这里插入图片描述

5. firewalld

firewalld 是基于文件的方式来对其管理的;文件在 /etc/firewalld/ 中。

在这里插入图片描述

  1. firewalld 的开启
    systemctl disable --now iptables
    systemctl mask iptables
    systemctl unmask firewalld
    systemctl enbale --now fieewalld

在这里插入图片描述

  1. 关于 firewalld 的域
字符含义
trusted接收所有的网络连接
home用于家庭网络;允许接受 ssh
work工作网络; ssh ipp-client dhcp-client
public公共网络 ssh dhcp-client
dmz军级网络 ssh
block拒绝所有
drop丢弃;所有数据全部丢弃无任何回复
internal内部网络 ssh mdns ipp-client samba-client dhcp-client
externalipv4 网络地址伪装转发sshd
  1. 关于 firwalld 的设定原理及数据存储
  • /etc/firewalld ##火墙配置目录
  • /lib/firewalld ##火墙模块目录

如在 /lib/firewalld 中看到的域信息中,其中 libvirt.xml 为开启虚拟机时才有的,默认真实主机中没有这个域;
在这里插入图片描述

如火墙配置目录 /etc/firewalld 中的文件中的内容被删除时,默认会读取的是模板中的文件;
当修改火墙策略时,会默认将其修改的内容放在 /etc/firewall/ 中;如都域的修改,会看到 public.xml 是一个新文件的生成。

在这里插入图片描述

  1. firewalld 的管理命令
命令含义
firewall-cmd --state查看火墙状态
firewall-cmd --get-active-zones查看当前火墙中生效的域
firewall-cmd --get-default-zone查看默认域
firewall-cmd --list-all查看默认域中的火墙策略
firewall-cmd --list-all --zone=work查看指定域中的火墙策略,不加 zone 默认查看的时当前域
firewall-cmd --set-default-zone=trusted设定默认域为 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=public添加指定域的网络接口

输入命令 firewall-cmd --state ,查看当前火墙状态;
输入命令 firewall-cmd --get-active-zones ,查看当前活跃域;
输入命令 firewall-cmd --get-default-zone ,查看当前默认域;
输入命令 firewall-cmd --get-zones ,查看所有的域名称;此处的 libvirt 为虚拟机开启时的域,在真实主机中并不存在;
输入命令 firewall-cmd --get-services ,查看所有可以设定的服务;

在这里插入图片描述
输入命令 firewall-cmd --set-default-zone=public ,设定默认域为 public;
输入命令 firewall-cmd --list-all --zone=trusted ,查看指定域中的火墙策略,什么都不加默认查看的时当前所在域的火墙策略;

在这里插入图片描述

上述中的 permanent ,表示永久设定。如果不加 permanent 即改即生效,但是 reload 之后就没有失效,如果加了 permanent ,则需要 reload 才能生效;

如输入命令 firewall-cmd --add-service=http ,可以看到即改即生效,但是在重新加载之后就失效了;

在这里插入图片描述
如输入 firewall-cmd --permanent --add-service=http ,改了之后没有立即生效,但是在重新加载之后,便生效了。永久设定,其实更改的是 /etc/firewalld/zones/ 中的文件内容。

在这里插入图片描述

如在使用 httpd 服务时,默认端口信息是 80 ,但是如果更改了配置文件中的端口号,此时虽然火墙策略中写入了 http ,但是此时并不能在对其访问,即使加上端口号也不能访问。这是因为火墙中默认对于 http 的端口还是 80 ,所以就要在火墙策略中添加端口号。

如输入命令 firewall-cmd --permanent --add-port=8080/tcp ,在添加端口之后,此时再访问时加上端口号就可以访问;
此时对火墙策略的查看便可看到其添加之后的信息;

如果配置文件中的内容已经更改会之前的,就需要将添加的端口信息从火墙策略中删除,可以输入命令 firewall-cmd --permanent --remove-port=8080/tcp 来移除;也可以在配置文件中直接将其添加的信息删除;删除之后重新加载,便可看到火墙策略被删除。

在这里插入图片描述

此前的设置都是对于所有用户来进行限制的,那么对于单个网段的用户的限制可以输入命令 firewall-cmd --permanent --add-source=172.25.254.0/24 --zone=block ,表示将172 网段添加到 block 域中,该网段的主机便不可以访问该主机;但是 192 网段的可以访问;

在这里插入图片描述
如果要将其移除可以输入 firewall-cmd --permanent --remove-source=172.25.254.0/24 --zone=block ,将此网段从 block 域中移除;当然也可以在配置文件中删除,然后重新加载火墙策略便可以了。

在这里插入图片描述

刚才的设置是基于用户 ip 的设置,那么接下来的设置便是对于不同网段的主机分别进行管理。将网卡分别加载在不同的域中,便可以完成此设置。

输入命令 firewall-cmd --permanent --remove-interface=enp7s0 --zone=public,将 enp7s0 网卡从当前域移除; 当前域为 public,–zone=public 可以不写;
输入命令 firewall-cmd --permanent --add-interface=enp7s0 --zone=trusted ,将 enp7s0 网卡添加在 trusted 域中,和此网卡在一个网段的主机,默认接受所有访问;

在这里插入图片描述
此时查看是可以看到 enp1s0 网卡依然在之前所在的 public 域中,而 enp7s0 已经在 trusted 域中。

在这里插入图片描述

对于网卡所在域,除了删除再添加之外,还可以通过更改的方式,更改网卡所在域。
输入命令 firewall-cmd --permanent --change-interface=enp7s0 --zone=public ,更改 enp7s0 网卡所在的域为public。

在这里插入图片描述

  1. firewalld 的高级规则
    firewall-cmd --direct --get-all-rules ##查看高级规则

以上的设置是对于某一网段信息的设置,对于某一个用户的某一项权限的设置,就要用到高级规则。

如输入命令 firewall-cmd --direct --get-all-rules ,查看高级规则;
输入命令 firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 172.25.254.200 -j REJECT ,表示在 filter 表的 INPUT 端设定规则为 1, -p表示的是用什么协议, --dport 80 表示的端口, -s 表示的是谁, -j 表示执行什么动作;编写高级规则,其实编辑的是 direct 的文件。
输入命令 firewall-cmd --reload,重新加载火墙策略;
输入命令 firewall-cmd --direct --get-all-rules,再次查看高级规则;

此时,在访问时只有 200 主机在访问时端口为 80 的服务时被拒绝,但是其他端口的服务还是接受的。

在这里插入图片描述

  1. SNAT 和 DNAT
    以上的设置都是对于一个网段之间的设置,那么不同网段之间要通信就需要以下的设置。
  • 打开地址伪装功能(在双网卡主机)
    输入命令 firewall-cmd --permanent --add-masquerade;打开地址伪装功能;开启地址伪装,源目的地伪装。伪装不管是进出都依赖地址伪装。

在这里插入图片描述

  • 打开内核路由
    输入命令 sysctl -a | grep ip_forward,过滤出 sysctl 中的 ip_forward 信息;
    如果 net.ipv4.ip_forward = 1,表示内核功能打开;
    如果为 0 ,则需要编辑 /etc/sysctl.conf 文件,在文件中写入 net.ipv4.ip_forward = 1 即可。
    编写完成之后需要执行 sysctl -p ,让其生效。
  • SNAT
    在客户机端(内网主机)
    在客户端输入命令 ip addr default via 172.25.254.100 ,此方法是临时设定网关;
    172.25.254.100 是与该主机的同网段的双网卡主机的 ip ;
    然后就可以访问远程不在一个网段的外网主机 ip ;
    当前主机 ip 虽然为 172.25.254.200,但是其可以与外网主机 192.168.122.1 通信。

在这里插入图片描述

而外网主机中,会看到被伪装过的地址。

在这里插入图片描述

  • DNAT
    如果此时外网主机访问内网主机时,可以通过访问双网卡主机,然后双网卡主机将请求转给内网主机;想要其连接的时候自动更改,就要做指向更改。

输入命令 firewall-cmd --permanent --add-forward-port=port=22:proto=tcp:toport=22:toaddr=172.25.254.200 ;表示添加 forward 信息,当访问当前主机的 tcp 协议的 22 端口时,将其全部转到 172.25.254.200 中的 22 端口上去。

在这里插入图片描述

做完目的地指向更改之后,此时虽然外网主机 192.168.122.1 连接是 192.168.122.100,但是实际上已经连接成 172.25.254.200。

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值