iptables与firewalld防火墙

Firewalld防火墙

什么是防火墙

防火墙:防范一些网络攻击。有软件防火墙、硬件防火墙之分。

硬件防火墙和软件防火墙的主要区别在于它们的工作原理和应用场景。

工作原理

硬件防火墙是一种独立的网络设备,通常由专门的硬件和软件组成。它工作在网络层或传输层,通过过滤和分析网络流量来保护网络安全。硬件防火墙通常具有更高的处理能力和速度,可以处理大量的网络流量,同时也可以提供更强的安全性能和可靠性。

软件防火墙则是一种基于软件的安全解决方案,通过在主机上运行防火墙软件来保护网络安全。软件防火墙通常工作在操作系统内核层,通过监测网络流量和应用程序行为来实现防护。软件防火墙的处理能力和速度通常较低,但它可以提供更灵活、更细致的安全控制和配置,同时也可以在多种操作系统平台上运行。

应用场景

硬件防火墙通常应用于企业级网络或大型数据中心等场景,可以提供全面的安全防护和管理。硬件防火墙可以对入侵尝试、恶意攻击、病毒和蠕虫等进行检测和防护,同时也可以支持多种安全协议和 VPN 连接。硬件防火墙通常需要专业人员进行配置和管理,成本较高。

软件防火墙则适用于小型企业或个人用户的网络安全保护。软件防火墙可以在个人计算机或服务器上运行,提供基本的网络安全防护和管理。软件防火墙可以对网络连接和应用程序进行检测和防护,同时也可以进行更灵活的安全控制和配置。软件防火墙通常易于安装和配置,成本较低。

Linux 防火墙_加载

防火墙有很好的保护作用,入侵者首先必须穿越防火墙的安全防线,才能接触目标计算机。

Firewalld防火墙的概念

firewalld是Linux系统上的一种动态防火墙管理工具。它是Red Hat公司开发的,现在已经被很多Linux发行版广泛采用。相比于传统的iptables防火墙,firewalld具有更加灵活和易用的特点,可以实现更加细粒度的网络访问控制。

firewalld防火墙主要包括如下几个方面:

  • 区域(zone)

firewalld将网络的不同部分分为若干个区域,每个区域都有一组预定义的规则集合。例如,public区域适用于公共互联网环境下的主机,internal区域适用于内部网络环境下的主机。

区域默认策略
trusted允许所有数据包
home拒绝流入的流量,除非与流出的流量相关,允许ssh、mdns、ippclient、amba-client、dhcpv6-client服务通过
internal等同于home
work拒绝流入的流量,除非与流出的流量相关,允许ssh、ipp-client、dhcpv6-client服务通过
public拒绝流入的流量,除非与流出的流量相关,允许ssh、dhcpv6-client服务通过
external拒绝流入的流量,除非与流出的流量相关,允许ssh服务通过
dmz拒绝流入的流量,除非与流出的流量相关,允许ssh服务通过
block拒绝流入的流量,除非与流出的流量相关,非法流量采取拒绝操作
drop拒绝流入的流量,除非与流出的流量相关,废了流量采取丢弃操作
  • 服务(Service)

在firewalld中,防火墙服务是一组预定义的规则,用于允许或拒绝对特定端口的访问。每个服务都有一个名称,并与一个或多个端口相关联。例如,HTTP服务通常使用端口80,可以定义一个HTTP服务规则来允许对该端口的访问

  • 端口(Port)

firewalld防火墙的端口规则是一种基于端口号的规则,用于控制特定端口的访问。它可以允许或拒绝特定端口的进出流量。firewalld中的端口规则可以应用于指定的区域或服务,也可以直接应用于所有区域。

Firewalld防火墙运行模式

firewalld防火墙有两种运行模式:(运行时模式)runtime模式(永久模式)permanent模式

runtime模式runtime模式是指firewalld防火墙在内存中的运行模式。在这种模式下,所有的防火墙规则都是临时的,它们只会在系统重新启动前保持有效。可以使用firewall-cmd命令在runtime模式下添加、删除、修改防火墙规则,但是这些更改在系统重新启动后会被清除。

permanent模式permanent模式是指firewalld防火墙在硬盘上的运行模式。在这种模式下,所有的防火墙规则都是永久的,它们会被保存在硬盘上,并在系统重新启动后仍然有效。可以使用firewall-cmd命令的--permanent选项将防火墙规则添加、删除、修改到permanent模式中。

Firewalld防火墙的命令

查看,开启和停止firewalld服务

语法:
systemctl [选项] firewalld
status:检查指定服务的运行状况
start:启动指定服务
stop:停止指定服务
restart:重启指定服务
reload:重新加载指定服务的配置文件

管理firewall配置

firewall-cmd [参数选项1] ... [参数选项n]

常用选项

  • 查看防火墙规则:firewall-cmd --list-all
[root@localhost ~]# firewall-cmd --list-all
public (active)           # 防火墙区域名称
  target: default         # 是防火墙的默认策略
  icmp-block-inversion: no # 如果启用,则允许所有 ICMP 流量
  interfaces: ens34        # 列出了防火墙所绑定的网络接口
  sources:                 # 列出了允许连接到防火墙的源 IP 地址或地址段
  services: dhcpv6-client  ssh  # 列出了允许通过防火墙的服务
  ports:                   # 列出了防火墙开放的端口
  protocols:               # 列出了防火墙允许的协议
  masquerade: no           # 表示未启用地址伪装
  forward-ports:           # 列出了防火墙上设置的端口转发规则
  source-ports:            # 列出了允许从防火墙发起的源端口。
  icmp-blocks:             # 列出了防火墙阻塞的 ICMP 类型
  rich rules:              # 列出了其他自定义的复杂规则
  • 查看可用的zone:firewall-cmd --get-zones
[root@localhost ~]# firewall-cmd --get-zones
block dmz docker drop external home internal public trusted work
  • 查看当前zone:firewall-cmd --get-default-zone
[root@localhost ~]# firewall-cmd  --get-default-zone
public
  • 设置默认的zone:firewall-cmd --set-default-zone=public
[root@localhost ~]# firewall-cmd --set-default-zone=public
Warning: ZONE_ALREADY_SET: public   # 默认就是public,所以再次设置会告诉当前状态已经是public
success  # 执行成功
[root@localhost ~]# firewall-cmd --reload   # 设置完成后一定要重新加载防火墙规则才会生效
success
  • 查看zone的详细信息:firewall-cmd --zone=public --list-all
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens34
  sources: 
  services: dhcpv6-client  ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
  • 开放端口:firewall-cmd --zone=public --add-port=80/tcp --permanent
[root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success          # 设置成功会显示 success
[root@localhost ~]# firewall-cmd --reload   # 设置完成后一定要重新加载防火墙规则才会生效
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens34
  sources: 
  services: dhcpv6-client  ssh
  ports: 80/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:   
# 设置成功
  • 关闭端口:firewall-cmd --zone=public --remove-port=80/tcp --permanent
[root@localhost ~]# firewall-cmd --zone=public --remove-port=80/tcp --permanent
success   # 设置成功会显示 success
[root@localhost ~]# firewall-cmd --reload   # 设置完成后一定要重新加载防火墙规则才会生效
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens34
  sources: 
  services: dhcpv6-client  ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
  • 开放服务:firewall-cmd --zone=public --add-service=http --permanent
[root@localhost ~]# firewall-cmd --zone=public --add-service=http --permanent
success
[root@localhost ~]# firewall-cmd  --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens34
  sources: 
  services: dhcpv6-client http ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
  • 关闭服务:firewall-cmd --zone=public --remove-service=http --permanent
[root@localhost ~]# firewall-cmd --zone=public --remove-service=http --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens34
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:
  • 允许源IP访问:firewall-cmd --zone=public --add-source=192.168.200.0/24 --permanent
[root@localhost ~]# firewall-cmd --zone=public --add-source=192.168.200.0/24 --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens34
  sources: 192.168.200.0/24
  services: dhcpv6-client  ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:
  • 拒绝源IP访问:firewall-cmd --zone=public --remove-source=192.168.200.0/24 --permanent
[root@localhost ~]# firewall-cmd --zone=public --remove-source=192.168.200.0/24 --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens34
  sources: 
  services: dhcpv6-client  ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
  • 重新加载防火墙规则:firewall-cmd --reload

Firewalld防火墙的高级规则

在使用防火墙时,基础规则通常可以满足大多数情况下的需求,例如简单的端口和服务控制等。但是在一些更加复杂的场景下,基础规则的灵活性和细粒度控制就显得有限,这时需要使用高级规则来实现更加精细的流量控制,而 rich rule 就是 firewalld 防火墙中的一种高级规则。

在使用 firewall-cmd 命令设置 rich rule 高级规则时,可以参考以下常用参数:

  1. family:指定网络协议族,可选值为 ipv4ipv6inetinet6arp。例如:family="ipv4"
  2. source address:指定源 IP 地址,可以为单个 IP、IP 段或 CIDR 网段,例如 source address="192.168.1.1"source address="192.168.1.1-192.168.1.10"source address="192.168.1.0/24"
  3. port port:指定端口号,可以为单个端口、端口段或者逗号分隔的多个端口,例如 port port="8080"
  4. protocol:指定协议,可以为 tcpudpicmp 等协议。
  5. service name:指定服务名,可以为 /etc/services 中定义的服务名称,如 httpftp 等。
  6. action:指定动作,可以为 acceptdroprejectmasqueraderedirect 等动作。

要注意的是,在使用 rich-rules 规则时,必须使用双引号将参数值括起来,例如:source address="192.168.1.0/24"。还有就是,不能同时设置portservice name

测试案例

  1. 启动一个简单的HTTP服务器,可以通过浏览器访问到主机上的文件
[root@localhost ~]# nohup python -m SimpleHTTPServer 8080 > ceshil.log 2>&1 &
# python -m SimpleHTTPServer 8080
# 这行命令的意思是在本地主机上启动一个简单的HTTP服务器
# 监听8080端口,可以通过浏览器访问本地主机上的文件。
  1. 设置规则
[root@localhost ~]# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.200.0/24" port port="8080" protocol="tcp"  accept' --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens34
  sources: 
  services: dhcpv6-client  ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
        rule family="ipv4" source address="192.168.200.0/24" port port="8080" protocol="tcp" accept
# 我这里仅是展示了高级规则的使用方法,也可以使用基础规则设置。
  1. 访问浏览器

已经访问到了当前目录下的文件

[root@localhost ~]# ls -al
总用量 522640
dr-xr-x---.  6 root root      4096 66 14:42 .
dr-xr-xr-x. 17 root root       239 528 21:21 ..
-rw-r--r--.  1 root root       254 529 12:17 0520source
drwx------.  4 root root        27 526 13:11 .ansible
-rw-r--r--.  1 root root       113 61 21:15 ansible.yaml
-rwxr-xr-x.  1 root root      8472 529 10:19 a.out
-rw-------.  1 root root      5792 66 13:47 .bash_history
-rw-r--r--.  1 root root        18 1229 2013 .bash_logout
-rw-r--r--.  1 root root       176 1229 2013 .bash_profile
-rw-r--r--.  1 root root       176 1229 2013 .bashrc
drwxr-xr-x.  4 root root        55 62 12:53 ceshi
-rw-r--r--.  1 root root       233 66 14:57 ceshil.log
-rw-r--r--.  1 root root       254 529 10:19 cos_value.c
-rw-r--r--.  1 root root       100 1229 2013 .cshrc
-rw-r--r--.  1 root root 535099919 530 12:21 DjangoBlog.tar.gz
-rw-r--r--.  1 root root        86 529 09:23 haha.c
-rw-r--r--.  1 root root       319 529 09:31 main.c
-rw-r--r--.  1 root root       160 529 11:43 makefile
-rw-r--r--.  1 root root       273 529 12:18 ntp-4.2.8p3.tar.gz
drwxr-----.  3 root root        19 526 12:00 .pki
-rw-r--r--.  1 root root       237 529 10:16 sin_value.c
drwx------.  2 root root        57 527 08:50 .ssh
-rw-r--r--.  1 root root       129 1229 2013 .tcshrc
-rw-------.  1 root root         0 64 15:08 .viminfo

在一个局域网的小伙伴们就可以使用这个命令一起共享文件,下载到本地上

image-20230606145850328

更多的firewall-cmd命令请查看

[root@localhost ~]# firewall-cmd  --help

iptables

iptables是一个在Linux系统上进行网络包过滤和防火墙配置的工具。它允许系统管理员定义不同规则和策略来控制网络流量的传输。

iptables执行过程

要使用iptables前,先关闭firewalld防火墙

1. 关闭firewalld防火墙
systemctl stop firewalld && systemctl disable firewalld 
2. 安装iptables
yum install -y iptables-nft-services.noarch  # 我使用的rhel 9 Linux
3. 启动iptables
systemctl enable iptalbes.service --now

规则是防火墙用于筛选和处理网络数据包的定义或条件

防火墙使用规则来决定是否允许或阻止数据包通过。在使用iptables进行数据包过滤时,防火墙会分析数据包的报头信息,并根据预先定义的规则进行比对,以确定数据包的处理方式。比对的顺序很重要,防火墙会按照规则列表的顺序逐条比对,一旦找到匹配的规则,就会执行相应的动作,如果没有匹配项,则会继续进行下一条规则的比对。

例如:定义了10条防火墙规则,那么internet来了一个数据包想要进入主机时,防火墙如何分析数据包的

image-20240329085350993

当一个网络数据包要进入主机之前,会先经过防火墙的检查,检查通过则接受(ACCEPT)进入本机取得资源,如果检查不通过,则可能予以丢弃(DROP)。规则是从上到下的顺序,当网络数据包开始Rule1的比对时,如果比对结果符合Rule1,此时这个网络数据包就会进行Action 1的动作,而不会理会后续的Rule2、Rule3等规则了

如果这个数据包并不符合Rule1的比对,那就会进入Rule2的比对,如此一个一个规则比对下去。当所有规则都不符合,此时就会通过默认操作(数据包策略)来决定这个数据包的去向。当规则排列错误时,就会发生很严重的错误

例如:假如你的Linux提供了WWW的服务,那么自然要针对80端口来启用通过的数据包规则,但是发现IP来源为192.168.100.10的主机总数恶意尝试入侵系统,所以就想要将该IP拒绝往来,最后,所有的非WWW的数据包都要被丢弃,这三条规则的排列顺序

(1)Rule 1 先阻挡 192.168.100.10

(2)Rule 2 再让请求WWW服务的数据通过

(3)Rule 3 将所有的数据包丢弃

这样的顺序符合要求,如果排列错误,如下

(1)Rule 1 先让请求WWW服务的数据通过

(2)Rule 2 阻挡 192.168.100.10

(3)Rule 3 将所有的数据包丢弃

此时,192.168.100.10就可以使用WWW服务。只要它对主机送出WWW请求数据包,就可以使用WWW功能了,因为规则的顺序定义第一条就会让它通过,此时,数据包因为符合第一条规则,而不会匹配到第二条规则,第二条规则也失去了意义。

总结

  • 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的

  • 如果匹配成功规则,即明确表示拒绝(DROP)还是接受(ACCEPT)数据包就不再向下匹配新的规则

  • 如果规则中没有明确表面是阻止还是通过,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过

  • 防火墙的默认规则所有规则都匹配完才会匹配的

iptables的表格(table)与链(chain)

为什么称为iptables呢?因为这个防火墙里面有很多个表格(table),每个表格都定义出自己的默认策略与规则,且每个表格的用途都不相同

常用的四表五链

四表:Filter表、Nat表、Raw表、Mangle表

五链:INPUT链、OUTPUT链、FORWARD链、PREROUTING链、POSTROUTING链

image-20240329190351721

Filter表

用于数据包过滤和防火墙规则的配置

Filter表常用的三个链:

  • INPUT链:负责过滤所有目标地址是本机地址的数据包 通俗来说:就是过滤进入主机的数据包(能否让数据包进入服务器)

  • OUTPUT链:处理所有源地址是本机地址的数据包 通俗的讲:就是处理从主机发出去的数据包

  • FORWARD链用于处理转发的数据包,即目标地址不是本地主机的数据包。在该链上定义的规则将影响到通过本机的转发数据包。例如,可以通过在FORWARD链上定义规则来限制特定网络之间的数据包转发。

nat表

主要用于网络地址转换,即将数据包中的源地址或目标地址从一个IP地址转换为另一个IP地址。

NAT表常用的四个链:

  • OUTPUT链:和主机放出去的数据包有关,改变主机发出数据包的目的地址
  • PREROUTING链:在进行路由判断之前所要进行的规则(DNAT/REDIRECT),作用是改变数据包的目的地址、目的端口等
  • POSTROUTING链:在进行路由判断之前所要进行的规则(SNAT/MASQUERADE),作用是改变数据包的源地址、源端口等

mangle表

Mangle表用于对数据包进行标记和修改操作,它包含了PREROUTING链、INPUT链、FORWARD链、OUTPUT链和POSTROUTING链。

raw表

Raw表用于数据包的预处理,它包含了PREROUTING链和OUTPUT链

Raw、Mangle等其他表较少使用,如果使用到可以查看【man iptables】

如下图iptables内建各表格与链的相关性简图,拿掉了Mangle

image-20240329210737566

  • 数据包进入Linux主机使用资源(路径A):在路由判断后确定是项Linux主机请求数据的数据包,主机就会通过Filter的INPUT链来进行控制
  • 数据包通过Linux主机的转递,没有使用主机资源,而是向后端主机流动(路径B):在路由判断之前进行数据包报头的修订后,发现数据包主要是要通过防火墙而去后端,此时数据包就会通过路径B来移动。也就是说,该数据包的目标并非Linux本机主要经过的链是Filter的FORWARD以及NAT的POSTROUTING、PREROUTING
  • 数据包由Linux本机发送出去(路径C):例如响应客户端的要求,或者是Linux 本机主动送出的数据包,都是通过路径C来进行的。先是通过路由判断,决定了输出的路径后,再通过Filter的OUTPUT链来传送。当然,最终还是会经过NAT的POSTROUTING 链。

iptables-filter表

规则的查看与清除

[root@chenshiren ~]# iptables [-t tables] [-L] [-nv]
选项作用
-t后面接table,例如nat或filter,若省略此项目,则默认使用的filter
-L列出目前的table的规则
-n不进行IP与HOSTNAME的反查,显示信息的速度会快很多
-v列出更多的信息,包括通过该规则的数据包总位数、相关的网络接口等
# 示例1 列出 filter table 3条链的规则
[root@chenshiren ~]# iptables -L -n  # 没有加上-t选项,默认就是Filter表
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
# 第一条规则允许所有与已建立的和相关的连接通过
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
# 第二条规则允许TCP协议的源端口为22的数据包通过(用于SSH连接)
ACCEPT     all  --  192.168.0.0/24       0.0.0.0/0         
# 第三条规则允许来自192.168.0.0/24网络的所有数据包通过

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
# 第一条规则允许所有与已建立的和相关的连接通过

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
# 第一条规则允许所有与已建立的和相关的连接通过
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
# 第二条规则允许TCP协议的目标端口为80的数据包通过(用于HTTP连接)



# 示例2 列出nat table 3条链的规则
[root@chenshiren ~]# iptables -t nat -L -n
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     

上面的输出中每个Chain代表一个链,Chain那一行括号里面的policy就是默认策略

  • target:代表进行的操作,ACCEPT是放行,而REJECT则是拒绝,此外,还有DROP(丢弃)
  • port:代表使用的数据包协议,主要有TCP、UDP及ICMP3种数据包格式
  • opt:额外的选项说明
  • source:代表此规则是针对哪个来源IP进行限制
  • destination:代表此规则是针对哪个目标IP进行限制

iptables-save

iptables-save命令是用于将当前的iptables规则保存到文件或列出防火墙规则的命令

[root@chenshiren ~]# iptables-save [-t table]
选项:
-t:可以针对某些表格来输出,例如仅对NAT或Filter等

# 保存到文件并列出防火墙规则
[root@chenshiren ~]# iptables-save 
# Generated by iptables-save v1.8.8 (nf_tables) on Fri Mar 29 23:43:16 2024
....
....
*filter     # 星号开头的指的是表格,这里为Filter
:INPUT ACCEPT [0:0] # 冒号开头指的是链,3条内建的链
:FORWARD ACCEPT [0:0] # 3条内建链都是ACCEPT
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  # 针对INPUT规则
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT              # 针对INPUT规则
-A INPUT -s 192.168.0.0/24 -j ACCEPT                     # 针对INPUT规则
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT  # 针对FORWARD规则
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT   # 针对OUTPUT规则
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT               # 针对OUTPUT规则
COMMIT
# Completed on Fri Mar 29 23:43:16 2024
# Generated by iptables-save v1.8.8 (nf_tables) on Fri Mar 29 23:43:16 2024
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Fri Mar 29 23:43:16 2024

清除规则

[root@chenshiren ~]# iptables [-t talbes] [-FXZ]
选项:
-F:清楚所有的已制订的规则
-X:除掉所有用户"自定义"的chain(tables)
-Z:将所有的chain的计数与流量统计都归零
-D <CHAIN> <规则规则>:清除某一条规则(和-t搭配使用,不指定-t默认是filter表)

# 示例1 清除本机防火墙(filter)的所有规则
[root@chenshiren ~]# iptables -F
[root@chenshiren ~]# iptables -X
[root@chenshiren ~]# iptables -Z
[root@chenshiren ~]# iptables-save 

定义默认策略

数据包不在我们设置的规则之内,则该数据包的通过与否,是以Policy的设置为准

[root@chenshiren ~]# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
选项:
-P(大写):定义策略
ACCEPT:该数据包可接受
DROP:该数据包直接丢弃,不会让Client端知道为何丢弃

# 示例1 将本机的INPUT设置为DROP,其他设置为ACCEPT
[root@chenshiren ~]# iptables -P INPUT DROP
[root@chenshiren ~]# iptables -P OUTPUT ACCEPT
[root@chenshiren ~]# iptables -P FORWARD ACCEPT
[root@chenshiren ~]# iptables-save 

数据包的基础比对:IP、网络及接口设备

[root@chenshiren ~]# iptables [-AI 链名] [-io 网络接口] [-p 协议] [-s 来源IP/网络] [-d 目标IP/网络] [ACCEPT|DROP|REJECT|LOG]
选项:
-AI 链名:针对某条链进行规则的“插入”或“累加”
       -A:新增一条规则,该规则增加在原规则的最后面,例如原来已经有四条规则
           使用-A就可以加上第五条规则
       -I:插入一条规则,如果没有指定此规则的顺序,默认是插入变成第一条规则。
           例如原本有四条规则,使用-I则该规则变成第一条,而原本4条变成第2~5条
       链:有INPUT、OUTPUT、FORWARD等,此链名称又与-io有关
-io 网络接口:设置数据包进出的接口规范
       -i:数据包所进入的哪个网络接口,例如 eth0、lo等接口。需与INPUT链配合
       -o:数据包所传出的那个网络接口,需与OUTPUT链配合
-p 协议:设置此规则适用于哪种数据包格式
   主要的数据包格式又:tcp、udp、icmp及all
-a 来源IP/网络:设置此规则之数据包的来源地,可指定单纯的 IP 或网络,例如:
       IP  :192.168.0.100
       网络:192.168.0.0/24、192.168.0.0/255.255.255.0 均可
       若规范为“不许”时,则加上“!”即可,例如:
       -s!192.168.100.0/24表示不接受 192.168.100.0/24 发来的数据包
-d 目标IP/网络:同s,只不过这里指的是目标的IP或网络。
-j:后面接操作,主要的操作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)

# 示例1 开放ens160这个主机的接口以及某个IP来源
[root@chenshiren ~]# iptables -A INPUT -i lo -j ACCEPT     
# 不论数据包来自何处或去到哪里,只要是来自lo这个接口,就予以接受

# 示例2  只要来自内网的(192.168.200.0/24)的数据包就通通接受
[root@chenshiren ~]# iptables -A INPUT -i ens160 -s 192.168.200.0/24 -j ACCEPT

# 示例3 只要来自(192.168.200.20)就接受,来自(192.168.200.10)就丢弃
[root@chenshiren ~]# iptables -A INPUT -i ens160 -s 192.168.200.10 -j DROP
[root@chenshiren ~]# iptables -A INPUT -i ens160 -s 192.168.200.20 -j ACCEPT

# 示例4 如果想要记录某个规则的记录
[root@chenshiren ~]# iptables -A INPUT -s 192.168.1.5  -j LOG
# 只要有数据包来自192.168.1.5这个IP时,那么该数据包的相关信息就会被写入到内核日志文件
# /var/log/messages这个文件中,然后该数据包会进行后续的规则比对

TCP、UDP的规则比对:针对端口设置

[root@chenshiren ~]# iptables [-AI 链名] [-io 网络接口] [-p 协议] [-s 来源IP/网络]  [--sport 端口范围] [-d 目标IP/网络] [--dport 端口范围]  [ACCEPT|DROP|REJECT]
选项:
--sport 端口范围:限制来源的端口号码,端口号码可以是连续的,例如 1024:65535
--dport 端口范围:限制目标的端口号码
# 事实上就是多了--sport和--dport两个选项,重点在port,不过需要特别注意的是
# 因为仅有TCP与UDP数据包具有端口,因此要想使用--dport、--sport时,需要加上-p tcp或-p udp
# 的参数才会成功

# 示例1 想要连接进入本机port 21 的数据包都要阻挡掉
[root@chenshiren ~]# iptables -A INPUT -i ens160 -p tcp --dport 21 -j DROP

# 示例2 想要连接本台主机的网上邻居(udp port 137,138 tcp port 139,445)就放行
[root@chenshiren ~]# iptables -A INPUT -i ens160 -p udp --dport 137:138 -j ACCEPT
[root@chenshiren ~]# iptables -A INPUT -i ens160 -p tcp --dport 139 -j ACCEPT
[root@chenshiren ~]# iptables -A INPUT -i ens160 -p tcp --dport 445 -j ACCEPT

# 示例3 只要来自192.168.1.0/24的 1024:65535端口的数据包,且想要连接到本机的ssh port 就阻挡
[root@chenshiren ~]# iptables -A INPUT -i ens160 -p tcp -s 192.168.1.0/24 --sport 1024:65535 --dport ssh -j DROP

# 示例4 将来自任何地方来源 port 1:1023 的主动连接到本机端的 1:1023连接丢弃
[root@chenshiren ~]# iptables -A INPUT -i ens160 -p tcp --sport 1:1023 --dport 1:1023 --syn -j DROP
# --syn:参数表示匹配TCP连接的SYN标志。TCP协议在建立连接时
#      双方会进行三次握手,发送SYN和ACK标志来确认和同步连接

iptables外挂模块:mac与state

iptables允许加载外部的扩展模块,以提供额外的功能和匹配条件。

iptables可以通过一个状态模块来分析这个想要进入的数据包是否为刚刚发出去的响应,如果是刚刚发出去的响应,那么久予以接受放行。

[root@chenshiren ~]# iptables -A INPUT [-m state] [--state 状态]
选项:
-m :一些iptables的外挂模块,主要常见的有
    state:状态模块
    mac:网卡硬件地址
--state:一些数据包的状态,主要有:
    INVALID  :无效的数据包,例如数据破损的数据包状态
    ESTABELISHED:已经连接成功的连接状态
    NEW:想要新建立连接的数据包状态
    RELATED:表示这个数据包是与主机发送出去的数据包有关
    
# 示例1 只要已建立或已发出请求相关的数据包就予以通过,不合法数据包就丢弃
[root@chenshiren ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 示例2 针对局域网内的 aa:bb:cc:dd:ee:ff 主机开放其连接
[root@chenshiren ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd::ee:ff -j ACCEPT 

ICMP数据包规则的比对:针对是否响应ping来设计

[root@chenshiren ~]# iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT
选项:
--icmp-type :后面必须要接ICMP的数据包类型,也可以使用代号
              例如 8 代表 echo request 的意思

# 示例1 禁止其他主机ping本机IP
[root@chenshiren ~]# iptables -A INPUT -i ens160 -p icmp --icmp-type 8 -j DROP

IPV4的内核管理功能:/proc/sys/net/ipv4/*

/proc/sys/net/ipv4/tcp_syncookies

/proc/sys/net/ipv4/tcp_syncookies 是一个系统文件,用于控制 Linux 内核是否启用 TCP SYN Cookie 机制。

TCP SYN Cookie 是一种防范 SYN Flood 攻击的机制。在正常的 TCP 握手过程中,客户端发送 SYN 数据包,服务器接收到 SYN 数据包后发送 SYN-ACK 数据包回复客户端,最后客户端发送 ACK 数据包,完成连接建立。但是 SYN Flood 攻击者可以发送大量的伪造的 SYN 数据包,让服务器无法及时处理这些伪造的连接请求,耗尽系统资源导致服务不可用。

当启动 SYN Cookie 时,主机在发送 SYN/ACK 确认数据包前,会要求 Client 端在短时间内回复一个序号,这个序号包含许多原 SYN 数据包内的信息,包括IP、port等,若 Client端可以回复正确的序号,那么主机就确定该数据包为可信的,因此会发送 SYN/ACK 数据包,否则就不理会此数据包

  • 当值为 0 时,表示禁用 TCP SYN Cookie 机制。

  • 当值为 1 时,表示启用 TCP SYN Cookie 机制。

要修改该值,可以使用以下命令

echo 1 > /proc/sys/net/ipv4/tcp_syncookies

不适合用在负载已经很高的服务器内,因为负载太高的主机有时会让内核误判遭受SYN Flooding的攻击

如果为了系统的TCP数据包连接优化可以参考:tcp_max_syn_backlog、tcp_synack_retries、tcp_abort_on_overflow设置值的意义

/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

阴断式服务常见的是 SYN Flooding,不过,我们知道系统其实可以接受使用 ping 的响应,而 ping 的数据包数据量可以很大。想象一个状兄,如果有个搞破坏的人使用 1000 台主机传送 ping 给你的主机,而且每个 ping 都高达数百 Kbytes 时,你的网络带宽会怎样?要么就是带宽被吃光,要么系统可能会宕机。这种方式分别被称为 ping flooding

那如何避免呢?取消 ICMP 类型8的ICMP 数据包回应就是了。我们可以通过防火墙来阻挡,这也是建议的方式。当然也可以让内核自动取消 ping 的响应。不过,某些局域网络内常见的服务(例如动态 IP 分配 DHCP 协议)会使用 ping 的方式来侦测是否有重复的IP,所以最好不要取消所有的 ping 响应。
内核取消 ping 回应的设置值有两个,分别是/proc/sys/netipv4 内的 icmp_echo_ignore_broadcasts(仅有 ping broadcast 地址时才取消 ping 的回应)及icmp_echo_ignore_all(全部ping都不回应)

当该值为 0 时,表示内核会处理来自任何源 IP 的 ICMP Echo 请求广播。 当该值为 1 时,表示内核会忽略来自广播地址的 ICMP Echo 请求。

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

/proc/sys/net/ipv4/conf/网络接口/*

  • rp_filter:称为逆向路径过滤(Reverse Path Filtering),可以通过分析网络接口的路由信息,配合数据包的来源地址,来分析该数据包是否为合理。举例来说,你有两张网卡,eth0为 192.168.1.10/24,eth1为public IP。那么当有一个数据包自称来自 eth1但是其 IP 来源为 192.168.1.200,那这个数据包就不合理,应予以丢弃。这个设置值建议启动。
  • log_martians:这个设置数据可以用来启动记录不合法的IP来源的功能,举例来说,包括来源为 0.0.0.0、127.x.x.x,及 ClassE的IP都是不合法的,因为这些来源的P不应该应用于 Intermet。记录的数据默认放置到内核放置的日志文件 /var/log/messages
  • accept_source_route:或许某些路由器会启动这个设置值,不过目前的设备很少使用到这种来源路由,可以取消这个设置值
  • accpet_redirects:当你在同一个实体网络内架设一台路由器,但这个实体网络有两个正网段,例如 192.168.0.0/24、192.168.1.0/24。此时 192.168.0.100 想要向192.168.1.100 传送信息时,路由器可能会传送一个ICMP redirect 数据包告知192.168.0.100 直接传送数据给192.168.1.100即可,而不需通过路由器。因为192.168.0.100与192.168.1.100确实是在同一个实体线路上(两者可以直接互通)所以路由器会告知来源IP 使用最短路径去传递数据。但由于那两台主机在不同的IP网段,所以还是无法实际传递信息。这个设置也可能会产生一些轻微的安全风险,所以建议关闭。
  • send_redirects:与上一个类似,只是此值为发送一个ICMP redirect 数据包。同样建议关闭

可以使用

echo 1 > /proc/sys/net/ipv4/conf/???/rp_filter 启动

也可以使用/etc/sysctl.conf文件设置

/etc/sysctl.conf 是一个配置文件,用于在 Linux 系统启动时加载内核参数设置。

[root@chenshiren ~]# vim /etc/sysctl.conf 
net.ipv4.tcp_syncookies = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.ens160.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
# 在每个键值对中,键名是要设置的内核参数,等号后面的值是要为该参数设置的值
[root@chenshiren ~]# sysctl -p
# 这将读取 /etc/sysctl.conf 文件中的配置,并将对应的内核参数设置为指定的值

iptables-nat表

NAT的全名是Network Address Translation,即网络地址的转换。

什么是NAT?SNAT?DNAT?

通过iptables内建各表格与链的相关性简图可以知道

image-20240329210737566

(1) 先经过NAT table 的 PREROUTING链

(2)再经路由器判断确定这个数据包是否要进入本机,若不进入本机,则下一步

(3) 再经Filter table 的FORWARD链

(4) 通过NAT table 的POSTROUTING 链,最后传送出去

NAT 服务器的重点就在于上面的第 1、4 步,也就是 NAT table 的两条重要的链:PREROUTING 与 POSTROUTING

重点在于修改IP,但是这两条链修改的 IP 是不一样的,POSTROUTING 修改的是来源 IP,PREROUTING 则修改的是目标 IP。由于修改的 IP 不一样,所以就称为来源 NAT(Source NAT,SNAT)目标NAT(Destination NAT,DNAT)

来源NAT(SNAT):修改数据包报头的来源项目

如图,在客户端192.168.1.100这台主机要连接到http://www.bilibili.com时,它的数据包报头如何变化

image-20240330181513745

(1) 客户端所发出的数据包报头中,来源会是192.168.1.100,然后传送到NAT这台主机

(2) NAT主机的内部接口(192.168.1.2)接收到这个数据包后,会主动分析报头数据,因为报头数据显示目的并非Linux本机,所以开始经过路由分析,将此数据包转到可以连接internet的Public IP处

(3)由于 private lP 与 public lP 不能互通,所以 Linux 主机通过 iptables 的 NAT table 内
的 POSTROUTING 链将数据包报头的来源伪装成为 Linux 的 publicIP,并且将两个不同来源(192.168.1.100及 publiclP)的数据包对应写入暂存内存当中,然后将此数据包传送出去

image-20240330181542775

(1) 在 Internet 上的主机接到这个数据包时,会将响应数据传送给 public IP 的主机

(2) 当 Linux NAT 服务器收到来自 Internet 的响应数据包后,会分析该数据包的序号并比对刚刚记录到内存当中的数据,由于发现该数据包为后端主机之前传送出去的因此在 NAT PREROUTING 链中,会将目标 IP 修改成为后端主机,亦即那台192.168.1.100,然后发现目标已经不是本机(publiclP),所以开始通过路由分析数据包流向。

(3) 数据包会传送到 192.168.1.2 这个内部接口,然后再传送到最终目标 192.168.1.100机器上去

目标NAT(DNAT):修改数据包报头的目标项目

SNAT主要是应付内部LAN连接到internet的使用方式,DNAT则主要用在为内部主机架设可以让internet访问的服务器,类似下图

image-20240330182324882

(1) 外部主机想要连接到目的端的 WWW 服务,则必须要连接到 NAT 服务器上

(2) NAT服务器已经设置好要分析出 port 80 的数据包,所以当 NAT 服务器接到这个数据包后,会将目标 IP 由 public IP 改成 192.168.1.210,且将该数据包相关信息记录下来,等待内部服务器的响应。

(3) 上述的数据包在经过路由分析后,来到 private 接口处,然后通过内部的 LAN 传送到192.168.1.210 上

(4) 192.186.1.210 会响应数据给 61.xx.xx.xx,这个回应当然会传送到 192.168.1.2 上去

(5) 经过路由判断后,来到 NAT POSTROUTING 的链,然后通过第二步骤的记录,将来源 IP由 192.168.1.210 改为 public IP 后,就可以传送出去了

最简单的NAT服务器:IP分享功能

IP分享器的动能其实就是SNAT,作用就只是iptables内的NAT表格中,那个路由判断后的POSTROUTING链所做的工作就是进行IP的伪装。NAT服务器必须要有一个Public IP接口,以及一个内部的LAN连接的privateIP接口才行。

主机网卡
主机Apublic ip:192.168.200.10 privatel ip:192.168.100.10
主机Bprivatel ip:192.168.100.20
# 1.将主机A privatel ip设置为主机B的网关(自行设置)
# 2.ping一下
ping www.baidu.com
# 应该是不通的
# 3. 主机A启用Linux的IP转发功能
[root@chenshiren ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
[root@chenshiren ~]# sysctl -p

# 4. 主机A设置iptables规则(两种)
# 方法1 伪装
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens224 -j MASQUERADE
# 参数说明:
# MASQUERADE :这个设置就是IP伪装成为数据包出去(-o)的那设备的IP
# 方法2
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens224 -j SNAT --to-source 192.168.200.10
# 方法2 变种如果想轮流使用不同的IP时
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens224 -j SNAT --to-source 192.168.200.10-192.168.200.20

iptables-save # 设置完保存 
# 5. 主机B 测试是否能ping通
可以ping通说明正常

在防火墙后端的网络服务器上做DNAT设置

假设内网有台主机IP为192.168.100.20,该主机是可对internet开放的WWW服务器。如何通过NAT机制,将WWW数据包传到该主机上

主机网卡
主机Apublic ip:192.168.200.10 privatel ip:192.168.100.10
主机Bprivatel ip:192.168.100.20(安装httpd)
# 1.将主机A privatel ip设置为主机B的网关(自行设置)
# 2.主机A启用Linux的IP转发功能
# 3.主机B安装httpd 并配置网页内容
yum install -y httpd           # 安装
systemctl enable httpd --now   # 启动并开机自启
echo "<h1>hello DNAT</h1>" > /usr/share/httpd/noindex/index.html   # 写入网站主页内容
iptables -I INPUT -p tcp --dport 80 -j ACCEPT       # 开放80端口(重点 关系到后面能不能访问)
# 4. 主机A设置iptables规则
iptables -t nat -A PREROUTING -i ens224 -p tcp --dport 8080 -j DNAT --to-destination 192.168.100.20:80
# 上面的-j DNAT --to-destination IP[:port]是关键所在
# 代表从ens224这个接口传入的,且想要使用port 80的服务时,将该数据包重新传递到192.168.100.20:80的IP及port上,同时修改IP与port

image-20240401124411204

使用DNAT实现远程连接内网服务器

还是使用上面所设置的环境,不过不用再开放端口了(因为默认已经开放了22端口)

# 1. 主机A设置iptables规则
iptables -t nat -A PREROUTING -i ens224 -p tcp --dport 9000 -j DNAT --to-destination 192.168.100.20:22
# 2. 使用shell终端连接
# 记得设置端口为9000IP为192.168.200.10

image-20240401125250735

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值