Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

遊戲伺服器 iptables 防火牆策略最佳實踐與防禦調優

編輯:Linux 教學

遊戲伺服器面臨高並發連接、DDoS 攻擊、外掛封鎖等複雜威脅。本文提供經過生產環境驗證的 iptables 策略模板,詳細解析每條規則的防禦邏輯、參數調優依據與擴展方向,助您構建高可用、抗攻擊的遊戲伺服器防火牆體系。

策略設計原則

  • 預設拒絕:預設 DROP,僅放行必要埠口
  • 狀態檢測:利用連接追蹤模組,僅允許合法狀態流量
  • 速率限制:連接數、新連接速率、封包速率多層限制
  • 分層防禦:鏈分層(INPUT/FORWARD → 自訂鏈),邏輯清晰
  • 白名單機制:管理網段、合作夥伴 IP 優先放行

完整規則集解析

基礎鏈結構

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:MYNET - [0:0]          # 自訂主防禦鏈

# 所有入站/轉發流量導向 MYNET 鏈
-A INPUT -j MYNET
-A FORWARD -j MYNET

基礎放行規則

# 回環介面完全放行
-A MYNET -i lo -j ACCEPT

# ICMP 必要類型放行(Ping、MTU 發現等)
-A MYNET -p icmp --icmp-type any -j ACCEPT

# 內網管理網段全通(根據實際調整)
-A MYNET -s 192.168.0.0/16 -j ACCEPT

# 已建立/相關連接直接放行(狀態機制核心)
-A MYNET -m state --state ESTABLISHED,RELATED -j ACCEPT

遊戲業務埠口保護

# 遊戲核心埠口(根據實際業務調整)
-A MYNET -m state --state NEW -m tcp -p tcp --dport 8989 -j ACCEPT   # 管理/登入
-A MYNET -m state --state NEW -m tcp -p tcp --dport 30101 -j ACCEPT  # 遊戲主埠
-A MYNET -m state --state NEW -m tcp -p tcp --dport 30102 -j ACCEPT  # 遊戲備用埠

# 監控/管理埠
-A MYNET -p udp --dport 161 -j ACCEPT   # SNMP
-A MYNET -p tcp --dport 191 -j ACCEPT   # 自定義管理

連接數限制(防連接耗盡)

# 單 IP 最大並發連接數限制(防連接耗盡攻擊)
-A MYNET -p tcp --dport 30101 -m connlimit --connlimit-above 50 -j REJECT
-A MYNET -p tcp --dport 30102 -m connlimit --connlimit-above 50 -j REJECT

SYN Flood 防禦(核心防禦層)

# 新 TCP 連接速率限制(limit 模組)
-A MYNET -p tcp --syn -m limit --limit 15/s --limit-burst 30 -j ACCEPT

# 顯式 SYN 標記封包限制(雙重保險)
-A MYNET -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 15/sec --limit-burst 30 -j ACCEPT

# RST 封包速率限制(防 RST Flood)
-A MYNET -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 15/s --limit-burst 30 -j ACCEPT

參數調優依據:
--limit 15/s:每秒允許 15 個新連接/封包
--limit-burst 30:突發允許 30 個(吸收合法突發流量)
根據實際業務峰值調整:峰值 QPS × 1.5 設為 limit,limit × 2 設為 burst

ICMP 速率限制

# Ping 洪水防護
-A MYNET -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

預設拒絕策略

# 所有未匹配規則的流量拒絕(發送 icmp-host-prohibited)
-A MYNET -j REJECT --reject-with icmp-host-prohibited

COMMIT

進階防禦擴展

GeoIP 國家級封鎖

# 安裝 xtables-addons + GeoIP 資料庫
# 封鎖特定國家(如 CN、RU、KP)
-A MYNET -m geoip --src-cc CN,RU,KP -j DROP

# 僅允許特定國家(白名單模式)
-A MYNET -m geoip --src-cc TW,US,JP -j ACCEPT

最近連接限制

# 最近 60 秒內超過 20 次新連接則封鎖 300 秒
-A MYNET -m recent --name ATTACKER --rcheck --seconds 300 --hitcount 20 -j DROP
-A MYNET -m recent --name ATTACKER --set -j ACCEPT

字串匹配過濾(應用層特徵)

# 過濾特定惡意字串(需 xt_string 模組)
-A MYNET -m string --string "malicious_payload" --algo bm -j DROP

端口敲門

# 先敲 1234、5678、9012 三個埠,才開放 SSH (22)
-A MYNET -m recent --name KNOCK1 --rcheck --seconds 10 -j ACCEPT
-A MYNET -p tcp --dport 9012 -m recent --name KNOCK2 --rcheck --seconds 10 -j ACCEPT
-A MYNET -p tcp --dport 5678 -m recent --name KNOCK1 --set -j DROP
-A MYNET -p tcp --dport 1234 -m recent --name KNOCK1 --set -j DROP
-A MYNET -p tcp --dport 22 -m recent --name KNOCK3 --rcheck --seconds 10 -j ACCEPT

參數調優建議

核心參數調優 /etc/sysctl.d/99-gameserver.conf

# 連接追蹤表擴大
net.netfilter.nf_conntrack_max = 1000000
net.netfilter.nf_conntrack_tcp_timeout_established = 1800
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 30

# TCP 協議棧優化
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 200000

# 緩衝區優化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 10000
net.ipv4.tcp_max_syn_backlog = 16384

# 檔案描述符限制
fs.file-max = 2000000

應用層參數

  • 遊戲伺服器 ulimit -n 1000000
  • Nginx/代理層 worker_rlimit_nofile 1000000
  • 啟用 SO_REUSEPORT(內核 3.9+)分發連接

監控與告警

關鍵指標監控

# 當前連接追蹤表使用率
cat /proc/sys/net/netfilter/nf_conntrack_count
# 告警閾值:> 80% nf_conntrack_max

# 當前連接狀態分佈
conntrack -L | awk '{print $4}' | sort | uniq -c

# 當前 iptables 規則計數器
iptables -nvL MYNET --line-numbers

# 連接追蹤表使用率監控腳本
#!/bin/bash
usage=$(cat /proc/sys/net/netfilter/nf_conntrack_count)
max=$(cat /proc/sys/net/netfilter/nf_conntrack_max)
pct=$((usage * 100 / max))
if [ $pct -gt 80 ]; then
    echo "ALERT: conntrack usage ${pct}%" | mail -s "ALERT" admin@example.com
fi

日誌審計

# 為關鍵規則添加日誌(限制頻率避免日誌洪水)
-A MYNET -p tcp --dport 30101 -m limit --limit 1/min -j LOG --log-prefix "GAME_NEW_CONN: "

# 使用 ulogd2 將日誌寫入資料庫/檔案
# 配合 ELK/EFK 進行可視化分析

部署與驗證流程

  1. 測試環境驗證:在預發環境完整回歸業務流程
  2. 壓力測試:使用 wrk、locust 模擬峰值流量,觀察丟包率、延遲
  3. 滾動發布:單節點灰度 → 小流量分組 → 全量發布
  4. 回滾預案:保留前版規則,iptables-restore < rules.bak 秒級回滾

總結

遊戲伺服器防火牆策略的核心在於:狀態檢測為基、速率限制為盾、連接限制為矛、分層鏈路為骨。本文提供的策略模板經過生產環境驗證,可直接適配大多數 MMORPG、MOBA、FPS 類遊戲伺服器。生產部署請根據實際業務峰值調整 limit/burst 參數,配合核心參數調優、GeoIP 封鎖、最近連接限制等進階模組,構建多層次立體防禦體系。建議建立 GitOps 流程,所有規則變更經代碼審查、測試環境驗證、滾動發布,確保防火牆策略與業務迭代同步演進。

Copyright © Windows教程網 All Rights Reserved