跳到主要内容

Firewall

一、UFW

安装与启用

sudo apt install -y ufw

sudo ufw enable # 启用防火墙
sudo ufw disable # 关闭防火墙
sudo ufw reload # 重载规则
sudo ufw reset # 重置所有规则
sudo ufw status # 查看状态
sudo ufw status verbose # 详细状态
sudo ufw status numbered # 带编号显示(方便删除)

默认策略

sudo ufw default deny incoming # 默认拒绝所有入站(推荐)
sudo ufw default allow outgoing # 默认允许所有出站(推荐)
sudo ufw default deny outgoing # 限制出站

允许 / 拒绝端口

# 按端口
sudo ufw allow 80 # 允许 80 端口(TCP+UDP)
sudo ufw allow 80/tcp # 仅 TCP
sudo ufw allow 443/tcp
sudo ufw deny 23/tcp # 拒绝 telnet

# 端口范围
sudo ufw allow 8000:9000/tcp

# 按服务名(读取 /etc/services)
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https

按 IP 控制

# 允许指定 IP 访问所有端口
sudo ufw allow from 192.168.1.100

# 允许指定 IP 段
sudo ufw allow from 192.168.1.0/24

# 允许指定 IP 访问指定端口
sudo ufw allow from 192.168.1.100 to any port 3306

# 拒绝指定 IP
sudo ufw deny from 10.0.0.5

删除规则

# 先查看编号
sudo ufw status numbered

# 按编号删除
sudo ufw delete 3

# 按规则删除
sudo ufw delete allow 80/tcp
sudo ufw delete allow ssh

应用程序配置

sudo ufw app list # 查看可用应用
sudo ufw app info Nginx\ Full # 查看应用详情
sudo ufw allow 'Nginx Full' # 允许 Nginx(80+443)
sudo ufw allow 'Nginx HTTP' # 仅 80
sudo ufw allow 'Nginx HTTPS' # 仅 443
sudo ufw allow 'OpenSSH'

日志

sudo ufw logging on # 开启日志
sudo ufw logging off # 关闭日志
sudo ufw logging low # 级别:low / medium / high / full

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

二、iptables

查看规则

sudo iptables -L # 查看所有规则
sudo iptables -L -n -v # 详细+数字格式
sudo iptables -L -n -v --line-numbers # 带行号
sudo iptables -L INPUT -n -v # 只看 INPUT 链
sudo iptables -t nat -L -n -v # 查看 NAT 表

基本放行规则

# 允许已建立的连接(必加,否则断连)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许本地回环
sudo iptables -A INPUT -i lo -j ACCEPT

# 允许 SSH(先加这条!)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许 HTTP / HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 允许 ping
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

拒绝规则

# 拒绝指定端口
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP

# 拒绝指定 IP
sudo iptables -I INPUT -s 10.0.0.5 -j DROP

# 设置默认策略(最后执行,否则会断连)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

按 IP 来源控制

# 允许指定 IP 访问 MySQL
sudo iptables -A INPUT -s 192.168.1.100 -p tcp --dport 3306 -j ACCEPT

# 允许 IP 段访问 Redis
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 6379 -j ACCEPT

# 拒绝某个 IP 段
sudo iptables -A INPUT -s 10.10.0.0/16 -j DROP

插入 / 删除规则

# 插入到第 1 行(-I 指定位置,-A 追加到末尾)
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT

# 按行号删除
sudo iptables -L INPUT --line-numbers # 先查行号
sudo iptables -D INPUT 3 # 删第 3 行

# 按规则删除
sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT

端口转发(NAT)

# 开启内核转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久生效
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p

# 本机端口转发 80 → 8080
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

# 转发到其他服务器
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
sudo iptables -t nat -A POSTROUTING -j MASQUERADE

限速防暴力破解

# SSH 每分钟最多 5 次连接
sudo iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/min --limit-burst 10 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP

# 防 SYN Flood
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 4 -j ACCEPT

持久化规则(重启不丢失)

# 或手动保存
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6

# 手动恢复
sudo iptables-restore < /etc/iptables/rules.v4

清空规则

sudo iptables -F # 清空所有规则
sudo iptables -F INPUT # 清空 INPUT 链
sudo iptables -X # 删除自定义链
sudo iptables -Z # 清空计数器
sudo iptables -t nat -F # 清空 NAT 表

三、nftables(Debian 11+)

# 查看规则
sudo nft list ruleset

# 查看状态
sudo systemctl status nftables

# 基础配置文件
sudo nano /etc/nftables.conf

基础配置模板:

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
chain input {
type filter hook input priority 0; policy drop;

iif lo accept # 允许本地回环
ct state established,related accept # 允许已建立连接
icmp type echo-request accept # 允许 ping
tcp dport 22 accept # SSH
tcp dport { 80, 443 } accept # HTTP/HTTPS
}

chain forward {
type filter hook forward priority 0; policy drop;
}

chain output {
type filter hook output priority 0; policy accept;
}
}
# 应用配置
sudo nft -f /etc/nftables.conf

# 开机启动
sudo systemctl enable nftables
sudo systemctl start nftables