前情提要
前陣子朋友工作室的 Minecraft 伺服器被 DDoS
他家裡的線路因為承受不住,問我有沒有好的解決方案
我想到之前架站時有用 Nginx 做過 HTTP 反向代理,就想說來找找有沒有可能做 TCP 的反向代理
注意事項
值得注意的是,上一代的 Nginx stable(1.10)對於 TCP/UDP 反向代理的支援並不夠完善(尤其是 log 的部份),Log 問題在 mainline 的 1.11 版有所改善。
不過前天發表了 Nginx 1.12,詳細我還沒試用過,打算等等去為伺服器升級。
不過如果真的要在 production 環境弄 TCP 反向代理的話,還是建議用 HA-Proxy,畢竟人家經驗老♂道
事前準備
- 抗 DDoS 伺服器一臺(CentOS 7)
我們用 Google Cloud Platform,主要是因為臺灣有機房,連線速度較快
安裝與設定
安裝 Nginx 1.12
設定官方套件源
建立 /etc/yum.repos.d/nginx.repo
檔案
檔案內容如下:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgkey=http://nginx.org/keys/nginx_signing.key
gpgcheck=1
enabled=1
還是要宣導一下,雖然官方的檔案寫著 gpgcheck=0
,不過當情況允許的話,還是建議要去檢查 gpg key,避免安裝到被人加料過的版本
安裝並啟動
sudo yum install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx
設定 Nginx
設定 /etc/nginx/nginx.conf
:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
stream {
log_format basic '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time';
access_log /var/log/nginx/proxy.access.log basic;
server {
listen 25565;
proxy_pass {your-ip-address}:25565;
}
}
在上面的範例中,我開啟的是 Minecraft 的 Port 25565
,你可以依據需求自行改變這個值。
記得改變 proxy_pass
的 {your-ip-address}
值
設定防火牆
sudo firewall-cmd --zone=public --add-port=25565/tcp --permanent
設定 SELinux
一如往常,這種奇葩服務總是會被 SELinux 這多管閒事的傢伙給擋下來。
你可以選擇直接關掉 SELinux,不過這會為伺服器帶來一定程度的風險(雖然很多人覺得沒差)
這邊我們用比較安全的做法:為 SELinux 加入允許條件
- 安裝
audit2allow
sudo yum provides \*/audit2allow
sudo yum install -y policycoreutils-python
- 生成並加入 SELinux Module
# 執行下列指令時,要先啟動設定好的 Nginx Reverse Proxy Server,因為要先有被拒絕的記錄才能讓 audit2allow 去分析
sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M reverse_proxy
sudo semodule -i revers_proxy.pp
本作品採用《CC 協議》,轉載必須註明作者和本文連結