防火墙--学习笔记
防火墙分类:
硬件:华为 思科 深信服
软件:
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