[Nginx] TCP 反向代理

前情提要

前陣子朋友工作室的 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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!