Ubuntu香港服务器如何用iptables配置海外访问与暴力破解防护规则?
在 Ubuntu 香港服务器上,iptables 不会天然区分“海外”与其他来源地址。要让海外客户端正常访问网站,核心是确保云平台安全组和服务器本机防火墙放行对应的公网 IPv4、IPv6 流量;要降低 SSH 暴力破解风险,则应在放行 SSH 的同时,使用 recent 模块限制同一源 IP 在时间窗口内的新建连接次数。
下面以 Ubuntu 20.04、22.04、24.04 为例,配置一台不承担路由转发、主要提供 Web 服务和 SSH 管理的香港服务器。示例目标为:允许公网访问 TCP 80/443,允许 SSH TCP 22 但限制新建连接频率,保留出站访问,并支持 IPv4 与 IPv6。执行防火墙调整前,必须保留云平台控制台、VNC 或其他带外管理入口,避免规则错误导致远程锁定。
一、适用环境与上线目标
1. 环境假设
| 项目 | 示例值或要求 |
|---|---|
| 操作系统 | Ubuntu 20.04、22.04 或 24.04 |
| 防火墙工具 | iptables,Ubuntu 新版本通常通过 iptables-nft 提供兼容命令 |
| 持久化组件 | iptables-persistent、netfilter-persistent |
| 管理入口 | SSH TCP 22,若使用其他端口需统一替换 |
| 公网服务 | HTTP TCP 80、HTTPS TCP 443 |
| IPv4 | 使用服务器公网 IPv4 |
| IPv6 | 服务器具有公网 IPv6 且业务监听 IPv6 时启用 |
| 默认策略 | INPUT 和 FORWARD 丢弃,OUTPUT 放行 |
| 服务器角色 | 普通业务主机,不作为路由器或网关 |
本文示例允许所有公网源地址访问 80/443,因此海外客户端不会因为源地址不在香港而被本机 iptables 拦截。若云平台安全组、上游防火墙或业务程序本身拒绝访问,仍需要单独排查。
2. 目标规则
最终规则的逻辑如下:
- 已建立或关联连接优先放行,避免误伤正常会话。
- 放行回环接口。
- 放行必要的 ICMP/ICMPv6,便于路径探测、PMTU 和 IPv6 邻居发现正常工作。
- SSH 新连接按源 IP 记录,60 秒内达到约 6 次后丢弃后续新连接。
- 80/443 对公网开放,适配海外客户端访问。
- 未明确允许的入站流量默认丢弃。
- 出站流量默认放行,保证系统更新、DNS、时间同步和业务回源等功能不被阻断。
这里的 SSH 限速针对的是“新建 TCP 连接”,不是对密码错误次数进行精确统计。已经建立的 SSH 会话会先匹配 ESTABLISHED,RELATED,不会因为新规则被主动切断。
二、配置前检查与备份
1. 确认当前身份和系统版本
以下命令适用于 Ubuntu。先确认当前账号具有 sudo 权限,并记录系统、内核和 iptables 后端信息。
id
. /etc/os-release && echo "$PRETTY_NAME"
uname -r
sudo iptables --version
sudo ip6tables --version
重点查看 iptables 版本中是否包含 nf_tables,例如:
iptables v1.8.x (nf_tables)
Ubuntu 新版本常见的是 iptables-nft。如果显示 legacy,后续必须继续使用当前 legacy 命令,不要混用 iptables-nft、iptables-legacy 两套规则。
进一步查看命令链接:
sudo update-alternatives --display iptables 2>/dev/null || true
sudo update-alternatives --display ip6tables 2>/dev/null || true
2. 检查现有规则和防火墙管理器
不要在不了解现有规则的情况下直接清空防火墙。先执行:
sudo iptables -L -n -v --line-numbers
sudo ip6tables -L -n -v --line-numbers
sudo iptables -S
sudo ip6tables -S
sudo ufw status verbose 2>/dev/null || true
sudo ss -lntup
需要重点确认:
- 当前 SSH 是否确实监听 TCP 22。
- Web 服务是否监听
0.0.0.0:80、0.0.0.0:443或[::]:80、[::]:443。 - UFW 是否处于 active 状态。
- 是否存在已有的自定义链、容器转发、NAT 或其他业务规则。
- 当前默认策略是否已经是 DROP。
如果 UFW 已启用,或者服务器存在复杂的业务防火墙规则,不要直接使用本文完整规则覆盖现有规则。UFW、iptables 规则文件和其他防火墙管理器同时维护同一端口,可能导致重载后规则顺序变化。此时应选择一个管理入口,先备份并合并规则。
3. 确认云平台安全组
本机 iptables 只处理已经到达网卡的流量。至少需要在云平台安全组或上游访问控制中放行:
- TCP 22:仅供管理使用。如果有固定办公出口 IP,优先限制到该地址。
- TCP 80:HTTP 服务需要时开放。
- TCP 443:HTTPS 服务需要时开放。
- IPv6 规则:如果服务器绑定公网 IPv6,还需要确认 IPv6 安全组同步放行。
云平台安全组如果没有放行 TCP 80/443,即使本机 iptables 配置正确,海外客户端也可能表现为连接超时。
4. 备份当前 IPv4 和 IPv6 规则
先建立带时间标记的备份目录:
BACKUP_DIR="/root/iptables-backup-$(date +%Y%m%d-%H%M%S)"
sudo mkdir -p "$BACKUP_DIR"
sudo sh -c "iptables-save > '$BACKUP_DIR/rules.v4'"
sudo sh -c "ip6tables-save > '$BACKUP_DIR/rules.v6'"
echo "$BACKUP_DIR"
记下命令输出的目录路径。后续如果出现远程连接中断、业务端口不可访问或规则顺序错误,可通过云平台控制台执行回滚。
三、安装依赖并确认内核模块
1. 安装 iptables 持久化组件
如果系统已经安装 iptables,可直接安装持久化工具:
sudo apt-get update
sudo apt-get install -y iptables iptables-persistent
iptables-persistent 用于保存 /etc/iptables/rules.v4 和 /etc/iptables/rules.v6,系统启动时由 netfilter-persistent 重新加载。
安装结束后确认命令存在:
command -v iptables
command -v ip6tables
command -v iptables-restore
command -v ip6tables-restore
command -v netfilter-persistent
2. 加载连接跟踪和 recent 模块
本文使用 conntrack 匹配已建立连接,使用 recent 模块限制 SSH 新连接频率:
sudo modprobe xt_conntrack
sudo modprobe xt_recent
确认模块已加载:
lsmod | grep -E 'xt_conntrack|xt_recent'
如果 xt_recent 无法加载,先查看内核和模块错误:
sudo dmesg | tail -n 50
也可以确认 iptables 是否识别对应匹配模块:
sudo iptables -m conntrack -h >/dev/null && echo "conntrack available"
sudo iptables -m recent -h >/dev/null && echo "recent available"
在常规 Ubuntu 内核中,这些模块通常随系统提供。为了让模块在启动时提前加载,可以创建模块加载文件:
printf '%s\n' xt_conntrack xt_recent | sudo tee /etc/modules-load.d/iptables-guard.conf
如果服务器使用的是定制内核,模块名称或可用性可能不同,应以 modprobe 和 iptables -m 的实际结果为准。
四、编写 IPv4 防火墙规则
1. 规则文件内容
以下配置适用于普通 Web 服务器,假定 SSH 使用 TCP 22,Web 使用 TCP 80 和 443。配置会清理并重建 filter 表,因此只应在已经完成备份、确认服务器不是复杂转发节点后使用。
sudo tee /root/rules.v4.new >/dev/null <<'EOF'
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# 丢弃状态无效的数据包
-A INPUT -m conntrack --ctstate INVALID -j DROP
# 放行本机回环通信
-A INPUT -i lo -j ACCEPT
# 放行已建立和关联连接
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 放行 IPv4 ICMP,便于路径诊断和 PMTU
-A INPUT -p icmp -j ACCEPT
# 如果存在固定管理出口 IP,可将下面一行取消注释并替换为实际地址
# -A INPUT -p tcp --dport 22 -s 203.0.113.10/32 -m conntrack --ctstate NEW -j ACCEPT
# SSH 暴力破解防护:
# 同一源 IP 在 60 秒内达到约 6 个新连接后,丢弃后续新连接
-A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --name SSH --update --seconds 60 --hitcount 6 -j DROP
-A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --name SSH --set -j ACCEPT
# 对公网开放 Web 服务,允许海外公网客户端访问
-A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW -j ACCEPT
# 限速记录其他被拒绝的入站流量,避免日志过量
-A INPUT -m limit --limit 5/min --limit-burst 10 -j LOG --log-prefix "iptables-drop: " --log-level 4
# 其余入站流量默认丢弃
-A INPUT -j DROP
COMMIT
EOF
这里的 203.0.113.10/32 只是文档示例地址,不要直接用于生产。如果管理员拥有固定公网出口,建议取消注释对应规则,并把实际管理出口 IP 放在 SSH 限速规则之前。固定 IP 规则命中后会直接放行,不会受到 recent 计数影响。
如果 SSH 使用 2222 端口,需要把文件中的两处 --dport 22 都替换为 --dport 2222。只修改 SSH 服务实际监听的端口,不能仅修改防火墙规则而不修改 SSH 服务配置。
2. 检查 IPv4 规则语法
在正式加载前进行语法测试:
sudo iptables-restore --test < /root/rules.v4.new
命令没有错误输出,通常表示规则文件格式和模块参数可以被当前 iptables 接受。语法测试不会替换当前正在运行的规则。
查看文件内容确认端口和默认策略:
grep -E 'INPUT|FORWARD|OUTPUT|dport|multiport|recent' /root/rules.v4.new
如果出现 Couldn't load match 'recent'、No such file or directory 等错误,不要继续应用,先回到模块检查步骤。
五、编写 IPv6 防火墙规则
如果服务器具有公网 IPv6,建议同时配置 IPv6。否则可能出现 IPv4 已保护、IPv6 却完全暴露或 IPv6 访问不通的两种不一致情况。
sudo tee /root/rules.v6.new >/dev/null <<'EOF'
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# 丢弃状态无效的数据包
-A INPUT -m conntrack --ctstate INVALID -j DROP
# 放行本机回环通信
-A INPUT -i lo -j ACCEPT
# 放行已建立和关联连接
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# IPv6 控制报文对邻居发现、路径 MTU 等功能很重要
-A INPUT -p ipv6-icmp -j ACCEPT
# 如果存在固定管理出口 IPv6,可在这里增加白名单
# -A INPUT -p tcp --dport 22 -s 2001:db8:1234::10/128 -m conntrack --ctstate NEW -j ACCEPT
# IPv6 SSH 新连接限制
-A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --name SSH --update --seconds 60 --hitcount 6 -j DROP
-A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --name SSH --set -j ACCEPT
# 允许海外 IPv6 客户端访问 Web 服务
-A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW -j ACCEPT
# 受限记录未允许的 IPv6 入站流量
-A INPUT -m limit --limit 5/min --limit-burst 10 -j LOG --log-prefix "ip6tables-drop: " --log-level 4
# 其他入站流量默认丢弃
-A INPUT -j DROP
COMMIT
EOF
检查 IPv6 规则语法:
sudo ip6tables-restore --test < /root/rules.v6.new
如果服务器没有 IPv6 地址,也没有 AAAA 记录,可以暂时不加载 IPv6 规则。但应确认业务不会通过 IPv6 暴露服务:
ip -6 addr show scope global
sudo ss -lntup
六、应用规则并进行逐项验证
1. 先确认远程会话安全
应用 DROP 默认策略前,建议同时满足以下条件:

- 当前 SSH 会话保持连接。
- 已经打开第二个 SSH 会话,或能够通过云控制台登录。
- 备份文件已经生成。
- 云平台安全组已放行 SSH 和 Web 端口。
- SSH 端口、Web 端口与规则文件中的端口一致。
不要只依赖当前唯一 SSH 会话。虽然 ESTABLISHED,RELATED 通常会保留已建立的连接,但规则错误、连接跟踪异常或安全组配置问题都可能导致失联。
2. 加载 IPv4 和 IPv6 规则
先执行语法检查,再加载规则:
sudo iptables-restore --test < /root/rules.v4.new
sudo ip6tables-restore --test < /root/rules.v6.new
sudo iptables-restore < /root/rules.v4.new
sudo ip6tables-restore < /root/rules.v6.new
加载后立即检查规则顺序:
sudo iptables -L INPUT -n -v --line-numbers
sudo ip6tables -L INPUT -n -v --line-numbers
正常情况下,INPUT 链的前几项应包含:
INVALID丢弃。lo放行。ESTABLISHED,RELATED放行。- ICMP 或 ICMPv6 放行。
- SSH
recent限速规则。 - 80/443 放行。
- 受限日志。
- 最终 DROP。
如果 ESTABLISHED,RELATED 位于 SSH 或 Web 放行规则之后,已经建立的连接仍可能正常工作,但规则结构不够清晰,建议按示例顺序调整。
3. 检查监听服务
防火墙放行不代表程序一定在监听。执行:
sudo ss -lntp | grep -E ':(22|80|443)\b'
IPv4 Web 服务常见监听形式:
0.0.0.0:80
0.0.0.0:443
IPv6 Web 服务常见监听形式:
[::]:80
[::]:443
如果只看到 127.0.0.1:80,说明服务仅监听本机回环地址,外部客户端无法访问,需要调整 Web 服务监听地址,而不是继续增加 iptables 规则。

4. 从外部网络验证海外访问
应从服务器之外的网络进行测试,最好使用实际海外访问来源或与服务器不在同一内网的公网主机。以下命令中的 SERVER_IP、SERVER_IPV6 替换为实际地址:
curl -4 -I --connect-timeout 8 http://SERVER_IP/
curl -4 -k -I --connect-timeout 8 https://SERVER_IP/
nc -4 -vz -w 5 SERVER_IP 80
nc -4 -vz -w 5 SERVER_IP 443
nc -4 -vz -w 5 SERVER_IP 22
如果启用 IPv6:
curl -6 -I --connect-timeout 8 http://[SERVER_IPV6]/
curl -6 -k -I --connect-timeout 8 https://[SERVER_IPV6]/
nc -6 -vz -w 5 SERVER_IPV6 80
nc -6 -vz -w 5 SERVER_IPV6 443
nc -6 -vz -w 5 SERVER_IPV6 22
判断结果时注意:
HTTP/1.1 200、301、302、403都说明 TCP 已经到达 Web 服务,具体状态应由 Web 配置继续处理。Connection refused通常表示服务器到达了,但对应端口没有服务监听,或服务主动拒绝。Connection timed out更常见于安全组、上游防火墙、本机 DROP 或路由问题。- SSH 能进入密码或密钥认证阶段,说明 TCP 22 已经通过防火墙;不要为了测试暴力破解而连续输入错误密码。
5. 查看规则计数器和内核日志
在外部访问一次 80/443 后,观察计数器是否增长:
sudo iptables -L INPUT -n -v --line-numbers
sudo ip6tables -L INPUT -n -v --line-numbers
80/443 放行规则的 packet 和 byte 计数应增加。SSH 新连接测试后,SSH 相关规则的计数也应变化。
查看被限速或丢弃流量的内核日志:
sudo journalctl -k -n 100 --no-pager | grep -E 'iptables-drop|ip6tables-drop'
日志规则已经使用 --limit 限制频率,不建议去掉该限制。否则公网扫描会产生大量日志,增加磁盘和日志检索压力。
查看 recent 记录:
sudo ls -l /proc/net/xt_recent/
sudo cat /proc/net/xt_recent/SSH 2>/dev/null || true
如果系统创建了 SSH 文件,其中可能记录近期命中过规则的源地址和时间信息。不同内核版本的显示格式可能不同,以文件是否存在、规则计数器是否变化为主要判断依据。
七、保存规则并验证重载
1. 保存当前生效规则
确认外部访问和 SSH 均正常后,再把当前规则写入持久化文件:
sudo mkdir -p /etc/iptables
sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null
sudo ip6tables-save | sudo tee /etc/iptables/rules.v6 >/dev/null
检查文件是否存在:
sudo ls -lh /etc/iptables/rules.v4 /etc/iptables/rules.v6
也可以使用持久化工具保存:
sudo netfilter-persistent save
sudo systemctl status netfilter-persistent --no-pager
2. 测试持久化重载
重载前再次确保有云控制台或备用 SSH:
sudo iptables-restore --test < /etc/iptables/rules.v4
sudo ip6tables-restore --test < /etc/iptables/rules.v6
sudo netfilter-persistent reload
重载后再次检查:
sudo iptables -S
sudo ip6tables -S
sudo ss -lntup
如果重载前后规则数量、默认策略和关键端口规则一致,说明持久化配置基本正常。正式重启服务器前,最好先执行一次 netfilter-persistent reload 并从外部网络重新验证。
八、SSH 暴力破解规则的边界与参数调整
1. recent 规则实际限制什么
以下两行是核心限制:
-A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --name SSH --update --seconds 60 --hitcount 6 -j DROP
-A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --name SSH --set -j ACCEPT
它们的工作方式是:

- 新 SSH 连接先检查该源 IP 在最近 60 秒内的记录。
- 如果达到约 6 次新连接,则直接丢弃。
- 未达到阈值时记录源 IP,并允许该连接继续进入 SSH 认证流程。
- 已经建立的连接优先匹配
ESTABLISHED,RELATED,不会因为后续新连接计数而断开。
这是连接级保护,不是密码认证级保护。攻击者如果频繁更换源 IP,单一源 IP 的限速效果会下降;应用自身的登录接口也不能依赖这组 SSH 规则保护。
2. 共享出口地址的影响
同一办公网络、NAT 网关或运营商出口可能让多个合法管理员共用一个公网 IP。阈值设置过低时,多个管理员共同登录可能触发限制。可以将固定管理出口放到 SSH 限速规则之前:
-A INPUT -p tcp --dport 22 -s ADMIN_PUBLIC_IP/32 -m conntrack --ctstate NEW -j ACCEPT
如果管理出口地址经常变化,不建议随意扩大白名单范围。更稳妥的方式是保留云控制台,并将 SSH 使用密钥认证、限制管理来源和非必要账号。
3. recent 不可用时的替代规则
如果当前内核无法提供 xt_recent,可以先确认 hashlimit 是否可用:
sudo iptables -m hashlimit -h >/dev/null && echo "hashlimit available"
确认可用后,可以把 SSH 两条 recent 规则替换为:
-A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m hashlimit --hashlimit-above 6/min --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name ssh_rate -j DROP
-A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
这组规则同样按源 IP 进行新连接速率限制,但参数表现与 recent 不完全相同。替换时不要同时保留两种限制规则,否则实际阈值会叠加,可能误伤正常管理连接。
九、常见失败处理
1. 应用后 SSH 连接中断
先通过云平台控制台登录,而不是反复重试 SSH。检查当前规则:
sudo iptables -L INPUT -n -v --line-numbers
sudo ip6tables -L INPUT -n -v --line-numbers
重点检查:
- SSH 端口是否写成了实际监听端口。
- 是否只配置了 IPv4,而客户端优先使用 IPv6。
- 固定管理 IP 是否写错。
ESTABLISHED,RELATED是否位于前面。- 云安全组是否放行对应端口。
如果确认需要立即恢复原规则,使用前面保存的备份目录:
sudo iptables-restore < /root/iptables-backup-时间目录/rules.v4
sudo ip6tables-restore < /root/iptables-backup-时间目录/rules.v6
sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null
sudo ip6tables-save | sudo tee /etc/iptables/rules.v6 >/dev/null
将命令中的 /root/iptables-backup-时间目录/ 替换为实际备份路径。
2. Web 端口仍然超时
按照由外到内的顺序排查:
sudo ss -lntp | grep -E ':(80|443)\b'
sudo iptables -L INPUT -n -v --line-numbers
sudo ip6tables -L INPUT -n -v --line-numbers
sudo ufw status verbose 2>/dev/null || true
如果规则计数器没有增加,优先检查云安全组、上游防火墙和客户端使用的地址族。如果计数器增加但连接仍失败,检查 Web 服务是否只监听回环地址、TLS 配置是否异常或端口是否写错。
3. SSH 仍被频繁扫描
公网服务器的 22 端口被扫描属于常见现象。iptables 限制的是同一源 IP 的新连接频率,不会让端口从公网消失。可以进一步做以下调整:
- 使用 SSH 密钥登录。
- 确认不需要远程 root 登录。
- 对固定管理出口增加白名单。
- 将 SSH 端口改为实际业务允许的非默认端口,但不要把改端口当作唯一安全措施。
- 不要在日志中记录所有 SSH 丢弃包,避免扫描流量造成日志膨胀。
如果修改 SSH 服务配置,必须先验证:
sudo sshd -t
确认无语法错误后再重载服务,并保留当前已登录会话:
sudo systemctl reload ssh
修改认证策略前,先使用新的密钥在第二个会话中验证成功,不能在唯一 SSH 会话中直接关闭密码认证。
4. 重启后规则消失
检查持久化文件和服务:
sudo ls -l /etc/iptables/rules.v4 /etc/iptables/rules.v6
sudo systemctl status netfilter-persistent --no-pager
sudo netfilter-persistent reload
如果文件存在但重载报错,执行测试:
sudo iptables-restore --test < /etc/iptables/rules.v4
sudo ip6tables-restore --test < /etc/iptables/rules.v6
如果测试失败,说明保存文件中包含当前系统无法识别的模块或规则,应回到当前 Ubuntu 内核和 iptables 后端进行适配,不要直接删除规则文件。
5. UFW 或其他管理器覆盖规则
如果执行 ufw reload 后 iptables 规则发生变化,说明系统仍由 UFW 管理。此时不要反复手动执行 iptables-restore,否则重启或 UFW 重载后配置可能恢复原状。
先查看:
sudo ufw status verbose
sudo iptables -S
sudo nft list ruleset 2>/dev/null | head -n 100
选择继续使用 UFW,或者在维护窗口内完成迁移。迁移过程中必须保留原 UFW 配置备份,并通过云控制台验证新规则,不能直接执行清空操作。
十、上线验收与回滚检查项
1. 上线验收
完成配置后,逐项确认:
- Ubuntu 版本和 iptables 后端已经确认。
- 当前规则和云安全组已经备份。
- 云安全组允许需要的 TCP 22、80、443。
xt_conntrack和xt_recent可用。- IPv4 规则通过
iptables-restore --test。 - IPv6 规则通过
ip6tables-restore --test,或已确认服务器不使用 IPv6。 - INPUT 默认策略为 DROP,OUTPUT 默认策略为 ACCEPT。
ESTABLISHED,RELATED位于入站规则前部。- SSH 端口与实际监听端口一致。
- 80/443 规则允许公网源地址访问。
- Web 服务在正确的公网地址上监听。
- 外部网络可以建立 HTTP/HTTPS TCP 连接。
- 外部网络可以进入 SSH 认证阶段。
- SSH 限速规则计数器能够正常变化。
/etc/iptables/rules.v4和/etc/iptables/rules.v6已保存。netfilter-persistent reload后服务仍可访问。
2. 失败回滚
如果新规则造成业务中断,通过云控制台执行原规则恢复:
sudo iptables-restore < /root/iptables-backup-实际时间目录/rules.v4
sudo ip6tables-restore < /root/iptables-backup-实际时间目录/rules.v6
确认恢复成功:
sudo iptables -L INPUT -n -v --line-numbers
sudo ip6tables -L INPUT -n -v --line-numbers
如果原规则确认可用,再同步回持久化文件:
sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null
sudo ip6tables-save | sudo tee /etc/iptables/rules.v6 >/dev/null
sudo netfilter-persistent reload
这套配置的关键并不是为香港服务器单独创建一套“海外专用”语法,而是明确放行公网 Web 服务、同步处理 IPv4 与 IPv6、在 SSH 放行规则中加入源地址限速,并通过备份、外部测试和持久化重载完成上线闭环。