Bootstrap

linux防火墙

一.什么是防火墙 


        防火墙:防火墙是位于内部网和外部网之间的屏障,它按照系统管理员预先定义好的规则来控制数据包的进出。
        防火墙又可以分为硬件防火墙与软件防火墙。硬件防火墙是由厂商设计好的主机硬件,这台硬件防火墙的操作系统主要以提供数据包数据的过滤机制为主,并将其他不必要的功能拿掉。软件防火墙就是保护系统网络安全的一套软件(或称为机制),例如Netfilter与TCP Wrappers都可以称为软件防火墙。这儿主要介绍linux系统本身提供的软件防火墙的功能,那就是Netfilter,即数据包过滤机制。 

        数据包过滤,也就是分析进入主机的网络数据包,将数据包的头部数据提取出来进行分析,以决定该连接为放行或抵挡的机制。由于这种方式可以直接分析数据包头部数据,包括硬件地址,软件地址,TCP、UDP、ICMP等数据包的信息都可以进行过滤分析,因此用途非常广泛(主要分析OSI七层协议的2、3、4层)。

        由此可知,linux的Netfilter机制可以进行的分析工作有:
1.拒绝让Internet的数据包进入主机的某些端口;
2.拒绝让某些来源ip的数据包进入;
3.拒绝让带有某些特殊标志(flag)的数据包进入,最常拒绝的就是带有SYN的主动连接的标志了;
4.分析硬件地址(MAC)来决定连接与否。
        虽然Netfilter防火墙可以做到这么多事情,不过,某些情况下,它并不能保证我们的网络一定就很安全。

例如:
        防火墙并不能有效阻挡病毒或木马程序。(假设主机开放了www服务,防火墙的设置是一定要将www服务的port开放给client端的。假设www服务器软件有漏洞,或者请求www服务的数据包本身就是病毒的一部分时,防火墙是阻止不了的)  
        防火墙对于内部LAN的攻击无能为力(防火墙对于内部的规则设置通常比较少,所以就很容易造成内部员工对于网络无用或滥用的情况)
        netfilter这个数据包过滤机制是由linux内核内建的,不同的内核版本使用的设置防火墙策略的软件不一样,在红帽7系统中firewalld服务取代了iptables服务,但其实iptables服务与firewalld服务它们都只是用来定义防火墙策略的“防火墙管理工具”而已,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter

二.IPtables

2.1.iptables介绍 

防火墙会从以上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配 项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策 略。一般而言,防火墙策略规则的设置有两种:一种是“通”(即放行),一种是“堵”(即阻止)。当防火 墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;如果防火墙的默认策略为 允许时,就要设置拒绝规则,否则谁都能进来,防火墙也就失去了防范的作用。 iptables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链 则依据数据包处理位置的不同进行分类,

2.2.iptables的具体参数

安装服务

[root@double ~]# dnf install iptables-services -y

关闭firewalld服务并锁定关闭

[root@double ~]# systemctl disable --now firewalld
[root@double ~]# systemctl mask firewalld

开启iptables服务

systemctl enable --now iptables.service 

查看当前的iptables策略

[root@double ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

清空iptables策略

[root@double ~]# iptables-t filter -nl

允许本机的sshd的22端口使用

[root@double ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@double ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

使用仅主机模式网卡的客户端远程登录NAT模式网卡的客户端

2.3.snat的地址转换

snat的功能:将内部网络(私有网络)发起的连接中的源 IP地址转换 为一个在外部网络(公有网络)中可以 路由 的IP地址

开启内核转换

[root@double ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@double ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@double ~]# sysctl -a |grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0

编写nat的iptables策略

[root@double ~]# iptables -t nat -A POSTROUTING -o ens160 -j SNAT --to-source 192.168.94.125
[root@double ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  0.0.0.0/0            0.0.0.0/0            to:192.168.94.125

这是用192.168.170.20远程连接192.168.94.130发现可以连接成功

[root@pc ~]# ssh -l root 192.168.94.130
The authenticity of host '192.168.94.130 (192.168.94.130)' can't be established.
ED25519 key fingerprint is SHA256:t2ijSDgOajaUZqFN9sZDPfY0frF6lZ6xjJI2fptblas.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.94.130' (ED25519) to the list of known hosts.
[email protected]'s password: 
Activate the web console with: systemctl enable --now cockpit.socket

Register this system with Red Hat Insights: insights-client --register
Create an account or view all your systems at https://red.ht/insights-dashboard
Last login: Fri Nov 22 22:18:23 2024 from 192.168.94.1
[root@nat ~]# 

在192.168.94.130这台机子上输入w -a就可以看到远程访问它的是192.168.94.125这台机子

2.4.dnat的地址转换

dnat的功能:将外部请求的目标IP地址转换为内部网络中的特定IP地址

在服务端上输入下列代码是dnat生效

[root@double ~]# iptables -t nat -A PREROUTING -i ens160 -j DNAT --to-dest 192.168.179.20
[root@double ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       all  --  0.0.0.0/0            0.0.0.0/0            to:192.168.179.20

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  0.0.0.0/0            0.0.0.0/0            to:192.168.94.125

这时候用192.168.170.20远程连接192.168.94.130

[root@pc ~]# ssh -l root 192.168.94.130
[email protected]'s password: 
Activate the web console with: systemctl enable --now cockpit.socket

Register this system with Red Hat Insights: insights-client --register
Create an account or view all your systems at https://red.ht/insights-dashboard
Last login: Fri Nov 22 22:30:38 2024 from 192.168.94.125
[root@nat ~]# 

在192.168.94.130这台机子上输入w -a就可以看到远程访问它的是192.168.179.20这台机子

三.Firewalld

3.1.firewalld介绍

iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,而如果 配置了需要 reload 内核模块的话,过程背后还会包含卸载和重新加载内核模块的动作,而不幸的是,这 个动作很可能对运行中的系统产生额外的不良影响,特别是在网络非常繁忙的系统中。 如果我们把这种哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么 firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不 需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新即可,它具备对 IPv4 和 IPv6防 火墙设置的支持。 相比于传统的防火墙管理工具,firewalld支持动态更新技术并加入了区域的概念。区域就是firewalld预 先准备了几套防火墙策略集合(策略模板),用户可以选择不同的集合,从而实现防火墙策略之间的快速切换

3.2.firewalld中常见的区域名称以及相应的策略规则

3.3.firewall-cmd命令的参数

关闭iptables服务开启firewalld服务,并且更改firewalld的配置文件,将其改成iptables

[root@double ~]# systemctl  disable --now iptables.service 
Removed "/etc/systemd/system/multi-user.target.wants/iptables.service".
[root@double ~]# systemctl mask iptables.service 
Created symlink /etc/systemd/system/iptables.service → /dev/null.
[root@double ~]# systemctl unmask firewalld.service 
Removed "/etc/systemd/system/firewalld.service".
[root@double ~]# systemctl enable firewalld.service 
Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service.
Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service.
[root@double ~]# vim /etc/firewalld/firewalld.conf 

3.3.1火墙信息查看

[root@double ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160 ens224
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

3.3.2管理ip

[root@double ~]# firewall-cmd --add-source 192.168.94.130 --zone=trusted 
success
[root@double ~]# firewall-cmd --get-active-zones 
public
  interfaces: ens160 ens224
trusted
  sources: 192.168.94.130

此时192.168.94.130可以访问192.168.94.125这台主机

192.168.179.20访问不了

[root@nat ~]# curl  192.168.94.125
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
	<head>
		<title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<style type="text/css">
			/*<![CDATA[*/
			body {
				background-co
[root@pc ~]# curl 192.168.94.125:80
curl: (7) Failed to connect to 192.168.94.125 port 80: 拒绝连接

3.3.3管理服务

[root@double ~]# firewall-cmd --add-service=http
success
[root@double ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160 ens224
  sources: 
  services: cockpit dhcpv6-client http ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

3.3.4管理网卡

[root@double ~]# firewall-cmd --change-interface=ens160 --zone=trusted 
success
[root@double ~]# firewall-cmd --get-active-zones 
public
  interfaces: ens224
trusted
  interfaces: ens160

此时192.168.94.130可以访问192.168.94.125这台主机

192.168.179.20访问不了

[root@nat ~]# curl  192.168.94.125
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
	<head>
		<title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<style type="text/css">
			/*<![CDATA[*/
			body {
				background-co
[root@pc ~]# curl 192.168.94.125:80
curl: (7) Failed to connect to 192.168.94.125 port 80: 拒绝连接

3.4.firewalld高级规则

3.4.1地址伪装

130这台机子本来无法访问

经过地址伪装后就可以访问

[root@double ~]# firewall-cmd --add-masquerade
success
[root@double ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160 ens224
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
[root@nat ~]# curl  192.168.94.125
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
	<head>
		<title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<style type="text/css">

重启服务后就失效了

3.4.2端口转发

使用指令更改端口,然后重启服务

[root@double ~]# firewall-cmd --permanent --add-forward-port=port=22:proto=tcp:port=22:toaddr=192.168.179.20
success
[root@double ~]# firewall-cmd --reload
success
[root@double ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160 ens224
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
	port=22:proto=tcp:toport=:toaddr=192.168.179.20
  source-ports: 
  icmp-blocks: 
  rich rules: 

这是用192.168.94.130这台主机远程连接192.168.94.125这台主机后,查看ip可以发现是192.168.179.20这台主机的ip

[root@nat ~]# ssh -l root 192.168.94.125
[email protected]'s password: 
Activate the web console with: systemctl enable --now cockpit.socket

Register this system with Red Hat Insights: insights-client --register
Create an account or view all your systems at https://red.ht/insights-dashboard
Last login: Mon Nov 25 10:08:14 2024
[root@pc ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:da:24:5f brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.179.20/24 brd 192.168.179.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::83dc:17f9:489:4822/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

本次实验共三台主机一台为双网卡主机,有nat模式与仅主机模式的两块网卡

ip为:192.168.94.125与192.168.179.10

一台网卡为nat模式的主机

ip为:192.168.94.130

一台网卡为仅主机模式的主机

ip为:192.168.179.20

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;