DigVPS

安全

网络/数据安全(如 DDoS、防火墙、TLS 等)主题

📘 UFW - 防火墙设置

基础使用

安装

terminal
apt install ufw

配置文件介绍(可选)

  • /etc/ufw/user.rules 这是存储用户自定义规则的主要文件,包含了所有手动添加的规则。它是 ufw 在启用时加载的主要文件。
  • /etc/ufw/user6.rules 这是存储针对 IPv6 网络的用户自定义规则的文件,类似于 user.rules,但是仅适用于 IPv6 地址。
  • /etc/ufw/applications.d/ 该目录用于存放应用程序的配置文件,每个文件通常对应一种应用服务的预定义规则。例如,OpenSSH、HTTP、HTTPS 等服务的规则可以在这里定义。
  • /var/log/ufw.log 如果启用了日志记录,ufw 会将日志写入这个文件,记录哪些连接被允许或拒绝。
  • /etc/ufw/after.rules 是 UFW (Uncomplicated Firewall) 的配置文件之一,用于定义在 UFW 启动时应用的规则,它在 before.rules 后面执行。具体来说,after.rules 用来设置一些防火墙规则,这些规则会在所有其他默认规则和自定义规则之后被应用。

规则写法示例

terminal
# 允许ssh
ufw allow ssh

# 允许iperf3
ufw allow iperf3

# 允许指定端口
ufw allow 1432

# 允许指定端口协议
ufw allow 80/tcp
ufw allow 5555/tcp

# 允许某个 IP 所有端口访问
ufw allow from 203.0.113.5

# 允许指定 IP、端口和协议
ufw allow from 192.168.1.100 to any port 80 proto tcp

删除规则

terminal
## 删除相关规则
ufw delete allow 80/tcp

## 显示现有规则
ufw status numbered

## 删除指定编号规则
ufw delete 2

启用防火墙

terminal
ufw enable

📘 使用 Fail2ban 防御 CC 攻击

结合视频食用:YouTube哔哩哔哩

安装 Fail2ban

terminal
# 更新软件包列表
sudo apt update

# 安装 fail2ban
sudo apt install fail2ban -y

# 检查安装状态
sudo systemctl status fail2ban

# 设置开机自启动
sudo systemctl enable fail2ban

创建自定义过滤器

创建用于解析 Nginx Proxy Manager 日志格式的过滤器:

terminal
vi /etc/fail2ban/filter.d/nginx-proxy-manager.conf

添加以下内容:

terminal
[Definition]
# Nginx Proxy Manager 日志过滤器
# 日志格式: [时间] - 状态码 状态码 - 方法 协议 域名 "路径" [Client IP] [其他信息]...

# 定义失败正则表达式(匹配所有请求)
failregex = \[Client <HOST>\]

# 忽略正则表达式(可选)
ignoreregex =

# 日期格式定义
datepattern = ^\[%%d/%%b/%%Y:%%H:%%M:%%S %%z\]

创建 Jail 配置

创建专门的 jail 配置文件:

terminal
vi /etc/fail2ban/jail.d/nginx-proxy-manager.conf

添加以下内容:

terminal
[nginx-proxy-manager]
# 启用此 jail
enabled = true

# 使用自定义过滤器
filter = nginx-proxy-manager

# 监控的日志文件路径
logpath = proxy-host-15_access.log

# 后端类型
backend = pyinotify

# 最大重试次数(1分钟内1000次)
maxretry = 1000

# 时间窗口(1分钟 = 60秒)
findtime = 60

# 封禁时长(72小时 = 259200秒)
bantime = 259200

# 自定义封禁动作
action = npm-iptables

# 忽略的 IP 地址(可选,添加信任的 IP)
ignoreip = 127.0.0.1/8 ::1
           # 192.168.0.0/16
           # 10.0.0.0/8

创建自定义动作

创建专门的 jail 配置文件:

terminal
vi /etc/fail2ban/action.d/npm-iptables.conf

添加以下内容:

terminal
[Definition]
# 动作定义
actionstart = 
actionstop = 
actioncheck = 

# 封禁动作
actionban = iptables -I INPUT 1 -s <ip> -j DROP
            iptables -I FORWARD 1 -s <ip> -j DROP

# 解封动作
actionunban = iptables -D INPUT -s <ip> -j DROP
              iptables -D FORWARD -s <ip> -j DROP

[Init]
# 初始化参数

测试配置

验证过滤器

terminal
# 测试过滤器是否能正确匹配日志
sudo fail2ban-regex proxy-host-15_access.log /etc/fail2ban/filter.d/nginx-proxy-manager.conf

检查 Jail 配置

terminal
# 检查配置语法
sudo fail2ban-client -d

# 查看所有 jail
sudo fail2ban-client status

启动和管理

terminal
# 重启服务以应用新配置
sudo systemctl restart fail2ban

# 检查服务状态
sudo systemctl status fail2ban

常用管理命令

terminal
# 手动封禁 IP
sudo fail2ban-client set nginx-proxy-manager banip 1.2.3.4

# 手动解封 IP
sudo fail2ban-client set nginx-proxy-manager unbanip 1.2.3.4

# 查看被封禁的 IP 列表
sudo fail2ban-client status nginx-proxy-manager | grep "Banned IP"

# 查看 jail 的详细信息
sudo fail2ban-client get nginx-proxy-manager actions

# 重新加载配置
sudo fail2ban-client reload

# 查看日志
sudo tail -f /var/log/fail2ban.log

监控和调试

查看 Fail2ban 日志

terminal
# 实时监控日志
sudo tail -f /var/log/fail2ban.log

# 查看最近的封禁记录
sudo grep "Ban" /var/log/fail2ban.log | tail -20

# 查看最近的解封记录
sudo grep "Unban" /var/log/fail2ban.log | tail -20

查看 iptables 规则

terminal
# 查看 INPUT 链规则
sudo iptables -L INPUT -n -v --line-numbers

# 查看 FORWARD 链规则
sudo iptables -L FORWARD -n -v --line-numbers

📘 日志查看

总访问量频繁的 IP

terminal
cat access.log | awk '{print $12}' |sort |uniq -c |sort -n -k 1 -r|more

查看某个 IP 访问量频繁的 URL

terminal
cat access.log | grep '75.221.79.53' |awk '{print $10}'|sort|uniq -c |sort -n -k 1 -r|more

敏感 SQL 语句

terminal
cat access.log | awk '/select/{print $1}'|sort -n |uniq -c |sort -nr
cat access.log | awk '/\/and\//||/\+and\+/||/%20and%20and/{print $1}'|sort -n|uniq -c|sort -nr
cat access.log | awk '/sleep/{print $1}'|sort -n|uniq -c|sort -nr

📘 端口扫描

简易 Python 扫描程序

python
import socket
import termcolor


def scan(target, ports):
    print('\n' + ' Starting Scan For ' + str(target))
    for port in range(1,ports):
        scan_port(target,port)


def scan_port(ipaddress, port):
    try:
        sock = socket.socket()
        sock.connect((ipaddress, port))
        print("[+] Port Opened " + str(port))
        sock.close()
    except:
        pass


targets = input("[*] Enter Targets To Scan(split them by ,): ")
ports = int(input("[*] Enter How Many Ports You Want To Scan: "))
if ',' in targets:
    print(termcolor.colored(("[*] Scanning Multiple Targets"), 'green'))
    for ip_addr in targets.split(','):
        scan(ip_addr.strip(' '), ports)
else:
    scan(targets,ports)