使用iptables开放端口失败,求助Debian服务器端口切换脚本实现
嘿,别担心Linux经验不足的问题!我帮你整理了一个实用的bash脚本,用iptables快速切换游戏服务器的「维护模式」和「运行模式」,完全适配你的三个游戏服务器端口需求。
核心思路
- 维护模式:仅开放必要的管理端口(比如SSH的22端口),拒绝其他所有外部连接,方便你进行服务器维护
- 游戏运行模式:在保留管理端口的基础上,开放所有游戏服务器需要的TCP/UDP端口,让玩家正常连接
准备工作
- 先安装iptables(Debian默认可能已安装,保险起见执行):
sudo apt update && sudo apt install iptables - 保存当前iptables规则,避免操作失误导致连接异常:
sudo iptables-save > /etc/iptables/rules.v4
脚本实现
创建一个名为game-server-switch.sh的脚本,内容如下:
#!/bin/bash # -------------------------- 配置区 -------------------------- # 维护模式下允许的核心管理端口(比如SSH) MAINTENANCE_PORTS="22/tcp" # 游戏服务器端口配置 SERVER_A_PORTS="32000/tcp 32000/udp 32005/tcp" SERVER_B_PORTS="" # 示例:"33000/tcp 33000/udp",按需补充 SERVER_C_PORTS="" # 示例:"34000/tcp 34000/udp",按需补充 # ----------------------------------------------------------- # 合并所有游戏端口 GAME_PORTS="$SERVER_A_PORTS $SERVER_B_PORTS $SERVER_C_PORTS" # 检查是否以root权限运行 if [ "$(id -u)" -ne 0 ]; then echo "⚠️ 请以root权限运行此脚本(sudo ./game-server-switch.sh)" exit 1 fi case "$1" in start) echo "🔄 正在切换到游戏运行模式..." # 重置现有iptables规则 iptables -F iptables -X iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 允许本地回环连接 iptables -A INPUT -i lo -j ACCEPT # 允许已建立/相关的连接(比如服务器主动发起的请求回应) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 开放维护模式核心端口 for port in $MAINTENANCE_PORTS; do proto=${port%/*} dport=${port#*/} iptables -A INPUT -p $proto --dport $dport -j ACCEPT done # 开放所有游戏服务器端口 for port in $GAME_PORTS; do proto=${port%/*} dport=${port#*/} iptables -A INPUT -p $proto --dport $dport -j ACCEPT done echo "✅ 游戏运行模式已启用!所有游戏端口已开放。" ;; stop) echo "🔄 正在切换到维护模式..." # 重置现有iptables规则 iptables -F iptables -X iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 允许本地回环连接 iptables -A INPUT -i lo -j ACCEPT # 允许已建立/相关的连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 仅开放维护模式核心端口 for port in $MAINTENANCE_PORTS; do proto=${port%/*} dport=${port#*/} iptables -A INPUT -p $proto --dport $dport -j ACCEPT done echo "✅ 维护模式已启用!仅保留管理端口开放。" ;; status) echo "📋 当前iptables INPUT规则详情:" iptables -L INPUT -v -n ;; *) echo "❌ 用法错误!正确用法:" echo "$0 {start|stop|status}" echo " start: 切换到游戏运行模式(开放所有游戏端口)" echo " stop: 切换到维护模式(仅开放管理端口)" echo " status: 查看当前iptables规则状态" exit 1 ;; esac # 可选:保存规则到文件,重启服务器后自动生效 # sudo iptables-save > /etc/iptables/rules.v4
使用说明
- 给脚本添加执行权限:
chmod +x game-server-switch.sh - 切换到游戏运行模式:
sudo ./game-server-switch.sh start - 切换到维护模式:
sudo ./game-server-switch.sh stop - 查看当前规则状态:
sudo ./game-server-switch.sh status
额外提示
- 如果希望重启服务器后规则自动生效,可以安装
iptables-persistent包:
安装过程中会提示保存当前规则,之后重启服务器会自动加载。sudo apt install iptables-persistent - 后续新增服务器B/C的端口时,直接修改脚本配置区的
SERVER_B_PORTS和SERVER_C_PORTS即可,格式和服务器A保持一致。 - 第一次切换维护模式前,务必确认SSH端口能正常连接,避免误操作导致无法远程登录服务器!
内容的提问来源于stack exchange,提问作者Selim Balci
相关产品推荐
相关产品推荐

