1.
环境与目标确认
说明VPS操作系统(Debian/Ubuntu/CentOS)、是否有控制面板、是否在云平台(如台灣机房)以及“动态IP”的具体表现(IP频繁变更或DHCP分配)。
目标示例:把公网某端口转发到本机不同服务端口或容器,DDNS保持域名解析,且防火墙只放行必要端口并防止暴力攻击。
2.
获取当前公网IP并检测变化
执行:curl -s https://ifconfig.co 或 curl -s https://ip.sb 获取当前公网IP;定时检测可用crontab:*/5 * * * * curl -s https://ifconfig.co > /root/current_ip.txt 并比对上次结果以判断是否变更。
3.
为动态IP配置DDNS(Cloudflare示例)
方法一:使用cloudflare-ddns或ddclient。安装 ddclient:apt update && apt install -y ddclient。
编辑 /etc/ddclient.conf 示例(Cloudflare):protocol=cloudflare
zone=yourdomain.com
ttl=1
login=api_token
password='YOUR_API_TOKEN'
server=www.cloudflare.com
使用 systemctl enable --now ddclient ,并验证 dig +short yourdomain.com 是否跟公网IP一致。
4.
启用内核转发与持久化
执行:sysctl -w net.ipv4.ip_forward=1 临时生效。持久化:在 /etc/sysctl.conf 中添加 net.ipv4.ip_forward=1,然后 sysctl -p。
5.
使用iptables做端口转发(NAT)
场景:把公网端口 8080 转发到内网容器 172.17.0.2:80。命令:iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
允许转发:iptables -A FORWARD -p tcp -d 172.17.0.2 --dport 80 -j ACCEPT。完成后查看:iptables -t nat -L -n && iptables -L FORWARD -n。
6.
使用iptables将80/443重定向到容器(REDIRECT)
若目标在本机端口:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
注意:REDIRECT用于本机目标,DNAT用于其他地址(容器/VM)。
7.
持久化iptables规则
Debian/Ubuntu:apt install -y iptables-persistent 然后 iptables-save > /etc/iptables/rules.v4。CentOS 可用 service iptables save 或使用 nftables 替代。
8.
使用nftables的现代写法(示例)
安装并启用 nftables:apt install -y nftables && systemctl enable --now nftables。示例规则:nft add table nat; nft 'add chain nat PREROUTING { type nat hook prerouting priority 0; }'; nft add rule nat PREROUTING tcp dport 8080 dnat to 172.17.0.2:80。
9.
UFW 简化防火墙管理(适合Ubuntu)
安装并启用:apt install -y ufw && ufw default deny incoming && ufw default allow outgoing。允许端口:ufw allow 22/tcp; ufw allow 80/tcp; ufw allow 443/tcp; 如果有自定义端口8080:ufw allow 8080/tcp。注意:若同时使用iptables规则,请确保无冲突。
10.
限定访问与防护(rate-limit 与 connlimit)
iptables 常用规则:限制SSH失败尝试:iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 6 -j REJECT;或使用 limit 模块:iptables -A INPUT -p tcp --dport 22 -m recent --set; iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 -j DROP。建议结合 fail2ban 提供动态封禁。
11.
部署反向代理(nginx)做虚拟主机及端口映射
安装 nginx:apt install -y nginx。示例 server 块:server { listen 80; server_name app.example.com; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }。如果动态IP且用域名,nginx 无需关心IP变化。
12.
HTTPS 与 Let’s Encrypt 在动态IP下的注意点
使用 Certbot 自动申请:apt install -y certbot python3-certbot-nginx && certbot --nginx -d app.example.com。若IP变动导致ACME验证失败,优先使用 DNS 验证(Cloudflare API)以避免HTTP验证被阻断。
13.
持久化服务与自动修复脚本
建议编写脚本在IP变更时自动更新DDNS并重载防火墙/反向代理:示例 /usr/local/bin/ddns-update.sh 检查 IP 变更并调用 ddclient 或 Cloudflare API,再 systemctl reload nginx && iptables-restore /etc/iptables/rules.v4。把脚本加入 crontab 定时运行。
14.
测试与排查要点
本地测试:ss -tulnp 或 netstat -tulnp 查看端口;外部测试:从外网使用 curl -v http://yourdomain:8080 或 nc -vz yourdomain 8080。排错顺序:1)确认DNS解析IP与VPS公网IP相符;2)确认内核转发开启;3)查看 nat 和 FORWARD 规则;4)检查UFW/iptables是否阻断。
15.
日志与监控建议
开启防火墙日志:iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "FW-IN " --log-level 4。使用 fail2ban 监控 auth.log 与 nginx 日志以自动封禁暴力行为。长期建议用 Prometheus + Grafana 监控连接数与带宽。
16.
安全最佳实践速览
仅开放必要端口(最小权限)、使用密钥登录替代密码、定期更新系统包、启用Fail2ban与rate-limit、为管理接口使用VPN或修改默认端口、备份iptables/nftables配置。
17.
问:若VPS公网IP频繁变更,会导致服务中断,如何最小化影响?
答:使用DDNS(如Cloudflare+API或ddclient)把域名自动更新为新IP;将外网入口交由Cloudflare等CDN做反向代理(隐藏真实IP),并使用DNS验证申请证书;编写IP监测脚本在IP变动时自动刷新配置并重载nginx/防火墙。
18.
问:如果想把单一公网端口映射到多个内部虚拟主机怎么办?
答:通常通过反向代理(nginx/traefik)按Host头或SNI做路由,将80/443交给反向代理,代理再把不同域名的请求转发到不同容器端口;若是TCP多服务,可用HAProxy或nginx stream模块按SNI或端口范围转发。
19.
问:更推荐使用iptables还是nftables?如何选择?
答:nftables为现代推荐方案,语法集中且性能更好;若系统默认支持nftables且你熟悉其语法,可直接使用并将规则保存为 /etc/nftables.conf;若依赖旧工具或第三方脚本(iptables-persistent、fail2ban旧版),短期内可继续使用iptables并计划迁移。
来源:vps 台湾动态ip 虚拟主机端口转发与防火墙设置最佳实践