[Nginx] TCP 反向代理

ChiVincent發表於2017-04-14

前情提要

前陣子朋友工作室的 Minecraft 伺服器被 DDoS

他家裡的線路因為承受不住,問我有沒有好的解決方案

我想到之前架站時有用 Nginx 做過 HTTP 反向代理,就想說來找找有沒有可能做 TCP 的反向代理

注意事項

值得注意的是,上一代的 Nginx stable(1.10)對於 TCP/UDP 反向代理的支援並不夠完善(尤其是 log 的部份),Log 問題在 mainline 的 1.11 版有所改善。

不過前天發表了 Nginx 1.12,詳細我還沒試用過,打算等等去為伺服器升級。

不過如果真的要在 production 環境弄 TCP 反向代理的話,還是建議用 HA-Proxy,畢竟人家經驗老♂道

事前準備

  1. 抗 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 協議》,轉載必須註明作者和本文連結

相關文章