防火墙--学习笔记

防火墙分类:

硬件:华为 思科 深信服

软件:

Windows: 360 电脑管家

linux :firewalld iptables

防火墙的作用:

隔离 严格过滤出站 入站

firewalld 设计流程

定义不同区域 每个区域制定自己配置通过的或者拦截--数据包

firewalld 默认九大区域
常用4个区域

public 默认区域 只能访问本机 ssh dhcp ping

trusted 允许任何访问

block 阻塞任何请求 直接拒绝 给客户端回应

drop 丢弃任何来访的数据包 直接丢弃 不会给客户端回应

防火墙的匹配原则

一个数据包分为三个部分:源ip地址 目的ip地址 数据

查看数据包源ip 查询所有区域规则 在哪一个区域 有源ip规则 就会进那个区域

第一个不符合 就进入默认public

查看默认区域

firewall-cmd --get-default

[root@master ~]# firewall-cmd --get-default
public

常用的命令参数

firewall-cmd --get-default
firewall-cmd --set-default-zone=work
firewall-cmd --get-zones   显示可用的区域
firewall-cmd --get-service  预定义服务
--add -source  将源ip指向区域
--remove-port 
--remove-source
--add -port=80/tcp
--add-service=http
--remove-service=http

firewalld 工作常用的命令

启动防火墙  systemctl start firewalld
重启防火墙   systemctl restart firewalld
停止防火墙  systemctl stop firewalld
查看版本  firewall-cmd --version
查看帮助 firewall-cmd --help

查看打开的端口 firewall-cmd --list-ports
更新防火墙规则  firewall-cmd --reload
添加端口 firewall-cmd --add-port=80/tcp
删除端口 firewall-cmd --remove-port=80/tcp


禁用外部链接 firewall-cmd --zone=block --change-source=0.0.0.0/0
检查当前配置  firewall-cmd --list-all-zones
批量添加端口 firewall-cmd --add-port=80-89/tcp
伪装ip

实战

案例一

firewalld 查看默认空间

firewall 查看默认zone

firewall-cmd --get-default



firewall-cmd --set-default-zone=work






[root@master ~]# firewall-cmd --get-default
public


修改默认zone

[root@master ~]# firewall-cmd --set-default-zone=work
success


[root@master ~]# firewall-cmd --get-default
work
案例二

把apache服务 加到work zone

firewall-cmd --add-service=http --zone=work


[root@master ~]# firewall-cmd --add-service=http --zone=work
success

把apache服务加到work zone 永久生效

firewall-cmd --add-service=http --zone=work --permanent


firewall-cmd: error: unrecognized arguments: permanent
[root@master ~]# firewall-cmd --add-service=http --zone=work --permanent
success


[root@master ~]# firewall-cmd --remove-service=http --zone=work --permanent 
success

删除防火墙添加的服务规则

firewall-cmd --remove-service=http --zone=work --permanent 




[root@master ~]# firewall-cmd --remove-service=http --zone=work --permanent 
success
案例三

添加端口 放行端口

firewall-cmd --add-port=80/tcp



[root@master ~]# firewall-cmd --add-port=80/tcp
success

永久生效

firewall-cmd --add-port=80/tcp --permanent

查看放行端口列表

firewall-cmd --list-ports
firewall-cmd --zone=public --list-ports



[root@master ~]# firewall-cmd --list-ports
80/tcp

删除端口

firewall-cmd --remove-port=80/tcp --permanent

刷新配置
firewall-cmd --reload

批量添加端口--端口放行

firewall-cmd --add-port=80-89/tcp --permanent


[root@master ~]# firewall-cmd --add-port=80-89/tcp --permanent
success

重载配置

firewall-cmd --reload
案例四

拉黑异常ip

firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.0.100 reject" --permanent


[root@master ~]# firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.0.100 reject" --permanent
success

删除异常ip

firewall-cmd --remove-rich-rule="rule family=ipv4 source address=192.168.0.100 reject" --permanent

查看拉黑里的ip名单

[root@master ~]# firewall-cmd --list-rich-rules
rule family="ipv4" source address="192.168.0.100" reject
案例五

shell自动化完成 拉黑ip

第一步截取异常ip

#!/bin/bash
est=$(netstat -an|grep  EST|awk '{print $5}'|awk -F ":" '{print $1}'|sort|uniq -c| sort -nr|awk '{if($1>80) print $2}')
for i in $est
do
firewall-cmd --add-rich-rule="rule family=ipv4 source address=$i reject" --permanent
echo "********************************拉黑异常ip:$i*********************"
done









脚本注释

这段脚本的主要功能是在Linux环境中检测网络连接,并基于连接数量对IP地址进行筛选,当某个IP地址的连接数超过80时,将其永久性地添加到防火墙规则中拒绝其访问。

以下是脚本逐行解释:

1. `#!/bin/bash` —— 这是Shebang行,指定了脚本使用的解释器是Bash。

2. `est=$(...)` —— 定义了一个变量 `est`,存储了执行括号内命令的结果:
   - `netstat -an` —— 输出所有网络连接(包括监听和已建立的)的详细信息。
   - `grep EST` —— 从网络连接信息中筛选出状态为"ESTABLISHED"的连接。
   - `awk '{print $5}'` —— 提取出每一行的第五列,即源IP地址和端口号。
   - `awk -F ":" '{print $1}'` —— 使用冒号作为字段分隔符,提取出源IP地址部分。
   - `sort` —— 对IP地址进行排序。
   - `uniq -c` —— 统计相同IP地址的数量并显示。
   - `sort -nr` —— 按照连接数量降序排列。
   - `awk '{if($1>80) print $2}'` —— 如果一个IP地址对应的连接数大于80,则打印出该IP地址。

3. `for i in $est` —— 遍历存储高连接数IP地址的变量`est`中的每个值。

4. `firewall-cmd ...` —— 对于每一个遍历到的IP地址,调用firewalld的命令行工具添加一条拒绝规则,阻止该IP地址的所有IPv4流量进入服务器。
   - `--add-rich-rule="rule family=ipv4 source address=$i reject"` —— 添加一个丰富规则,拒绝指定IPv4地址的流量。
   - `--permanent` —— 指定这条规则是永久性的,即使防火墙重启也会保留。

5. `echo "********************************拉黑异常ip:$i*********************"` —— 在每次添加拒绝规则后,输出一条消息告知用户已将IP地址 `$i` 加入黑名单。

总之,该脚本监测并封锁那些与服务器保持了过多ESTABLISHED连接状态的IP地址,若某IP的连接数超过80,则永久性地拒绝其后续的任何连接请求。
案例六

端口转发

比如 用户访问3000 端口 转发 nginx 85端口

查看伪装ip是否开启
 firewall-cmd --query-masquerade




开启伪装ip

firewall-cmd --add-masquerade

开启伪装ip永久
firewall-cmd --add-masquerade  --permanent



[root@master ~]# firewall-cmd --add-masquerade
success
[root@master ~]# firewall-cmd --query-masquerade
yes




[root@master ~]# firewall-cmd --query-masquerade
no

伪装ip

firewall-cmd --permanent --zone=public --add-forward-port=port=对外端口:proto=tcp:toaddr=数据层内网ip:toport=数据




永久保存

firewall-cmd --zone=public --add-forward-port=port=3000:proto=tcp:toport=80:toaddr=10.0.0.130 --permanent





如果还不显示的话,可以重启http服务

systemctl restart httpd





查看列表

firewall-cmd --list-all





firewall-cmd --zone=public --add-forward-port=port=3000:proto=tcp:toport=80:toaddr=10.0.0.130 --permanent

[root@rock8 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 80-89/tcp 95/tcp 3000/tcp
  protocols: 
  masquerade: yes
  forward-ports: 
	port=3000:proto=tcp:toport=80:toaddr=10.0.0.130
  source-ports: 
  icmp-blocks: 
  rich rules:

案例六具体实现方法

在Rocky Linux 8.4系统上实现端口转发,

通常有两种方法:使用 `iptables` 或者配置网络层面的端口转发(如在路由器或负载均衡器上)。下面主要介绍如何使用 `iptables` 进行端口转发。



查看伪装ip是否开启
 firewall-cmd --query-masquerade




开启伪装ip

firewall-cmd --add-masquerade

开启伪装ip永久
firewall-cmd --add-masquerade  --permanent




### 使用 `iptables` 实现端口转发(DNAT)

假设您想将所有指向服务器公网IP的3000端口的流量转发到内部网络中10.0.0.130主机的80端口,可以使用以下命令:

# 允许内核进行IP伪装(如果还未开启)
sudo sysctl net.ipv4.ip_forward=1

# 添加永久规则,将外网3000端口映射到内网10.0.0.130的80端口
sudo iptables -t nat -A PREROUTING -p tcp --dport 3000 -j DNAT --to-destination 10.0.0.130:80

# 添加POSTROUTING规则,允许转发出去的包返回(SNAT,如果需要)
sudo iptables -t nat -A POSTROUTING -d 10.0.0.130 -p tcp --dport 80 -j SNAT --to-source your_public_ip

# 保存规则以防止重启后失效
sudo iptables-save > /etc/sysconfig/iptables

# 重新加载防火墙规则(对于Rocky Linux 8.4,使用firewalld的话,需要重启firewalld)
 systemctl restart firewalld


**注意**:
- 上述命令中,“your_public_ip”应替换为您服务器的公网IP地址。
- 如果您的环境使用的是firewalld防火墙管理工具,`iptables` 规则可能会在firewalld重启后丢失,因此需要确保规则能通过firewalld的机制得到持久化,或者考虑在firewalld之外单独管理iptables规则。













### 使用 firewalld(仅限端口开放,不直接支持端口转发)



查看伪装ip是否开启
 firewall-cmd --query-masquerade




开启伪装ip

firewall-cmd --add-masquerade

开启伪装ip永久
firewall-cmd --add-masquerade  --permanent




# 临时开放端口


firewall-cmd --zone=public --add-forward-port=port=3000:proto=tcp:toport=80:toaddr=10.0.0.130 

# 永久开放端口


firewall-cmd --zone=public --add-forward-port=port=3000:proto=tcp:toport=80:toaddr=10.0.0.130 --permanent

# 重新加载防火墙规则
sudo firewall-cmd --reload
```



如果还不显示的话,可以重启http服务

systemctl restart httpd




http://10.0.0.130:3000/

效果如下图


恢复上海时间

sudo timedatectl set-timezone Asia/Shanghai

iptables相关设置

#查看已有的防火墙规则链
iptables -L
#清空已有的防火墙规则链
iptables -F
#把 INPUT 规则链的默认策略设置为拒绝
iptables -P INPUT DROP
#向 INPUT 链中添加允许 ICMP 流量进入的策略规则
iptables -I INPUT -p icmp -j ACCEPT
#删除 INPUT 规则链中刚刚加入的那条策略
iptables -D INPUT 1
#把默认策略设置为允许
iptables -P INPUT ACCEPT
#将 INPUT 规则链设置为只允许指定网段的主机访问本机的 22 端口,拒绝来自其他所有主机的流量
iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j REJECT
#向 INPUT 规则链中添加拒绝所有人访问本机 12345 端口的策略规则
iptables -I INPUT -p tcp --dport 12345 -j REJECT
iptables -I INPUT -p udp --dport 12345 -j REJECT
#向 INPUT 规则链中添加拒绝 192.168.10.5 主机访问本机 80 端口(Web 服务)的策略规则
iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT
#向 INPUT 规则链中添加拒绝所有主机访问本机 1000~1024 端口的策略规则
iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT
iptables -A INPUT -p udp --dport 1000:1024 -j REJECT
#使得命令再服务器重启后还能生效
service iptables save