Tự tạo firewall để chống DDOS cho máy chủ game private

Hi các bạn,

Ông anh mình đang mở server game private và bị DDOS khá mạnh, trong khi đó bên cung cấp lại không có tường lửa để chặn. Hỏi bên cung cấp thì họ bảo nên đi thuê bên khác =)) Nghe hơi buồn với thanh niên sale này.

Ở các bên khác xưa mình có thuê thì giá VPS + Firewall rất cao, trong khi server game thì mở vì đam mê, chả được mấy đồng nên mình đã nghĩ cách tự tạo Firewall để ẩn IP chính của server game là lọc được các request giả mạo.

Mình có tìm hiểu thì ko có tool nào free trên Windows Server 2012 chặn được điều đó, nên mình đã có ý tưởng là cần 1 con VPS đứng đằng trước chạy Ubuntu rồi forward toàn bộ TCP / UDP request sang con VPS chạy game.

Lên hỏi ChatGPT thì được giới thiệu 1 package là socat

Package này sẽ hỗ trợ forward toàn bộ request nhận được từ VPS Ubuntu với VPS Game với các dòng lệnh dưới đây

sudo apt-get update
sudo apt-get install socat

Dòng này để forward request từ port nào tới IP + port nào của VPS Game

socat TCP-LISTEN:8080,fork TCP:example.com:80

Và tất nhiên server game thì không chỉ có 1 port mà có rất nhiều port cho Login, Map, Account, Log, Trade, … mình cần chạy nhiều câu lệnh socat bên trên cùng 1 lúc nên mình đã tạo 1 file .sh để xử lý

#!/bin/bash

# Define the local IP address
local_ip="zzz.zzz.zzz.zzz"

# Define port mappings (local_port:remote_ip:remote_port)
port_mappings=(

"11122:xxx.xxx.xx.xx:11122"
"31011:xxx.xxx.xx.xx:31011"
"31012:xxx.xxx.xx.xx:31012"
"31013:xxx.xxx.xx.xx:31013"
"31014:xxx.xxx.xx.xx:31014"
"31015:xxx.xxx.xx.xx:31015"
"31016:xxx.xxx.xx.xx:31016"
"31017:xxx.xxx.xx.xx:31017"
"31018:xxx.xxx.xx.xx:31018"
"31019:xxx.xxx.xx.xx:31019"
"31020:xxx.xxx.xx.xx:31020"
"31021:xxx.xxx.xx.xx:31021"
"31022:xxx.xxx.xx.xx:31022"
"31023:xxx.xxx.xx.xx:31023"

)


# Loop through each port mapping and start socat instances
for mapping in "${port_mappings[@]}"; do
  IFS=':' read -r local_port remote_ip remote_port <<< "$mapping"
  socat TCP-LISTEN:$local_port,bind=$local_ip,fork TCP:$remote_ip:$remote_port &
done

# Wait for background processes to finish
wait
~    

local_ip là địa chỉ IP của VPS Ubuntu dùng làm Firewall

Chuỗi xxx.xxx.xx.xx là địa chỉ IP của VPS Game

Và các ports tương ứng của nhận vào gửi, mình setup giống nhau luôn cho dễ, các bạn có thể thay đổi tuỳ theo nhu cầu.

Khi chạy file proxy.sh trên thì các bạn có thể forward toàn bộ request sang VPS Game, nhưng để test trên terminal thôi, muốn nó được chạy kể cả khi tắt remote thì các bạn cần cài thêm supervisor

[program:3k_proxy]
process_name=%(program_name)s_%(process_num)02d
command=/var/www/html/proxy/3k.sh
user=root
autostart=true
autorestart=true
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/html/proxy/supervisor.log

Câu lệnh để kiểm tra socat có đang chạy hay ko netstat -tulpn | grep socat

socat đã giải quyết được vấn đề ẩn IP của VPS Game và forward toàn bộ request từ VPS Ubuntu, bước tiếp theo là cần giới hạn connection tới VPS Ubuntu là xong 🙂

Lại hỏi ChatGPT tiếp thì nó giới thiệu 1 package khá quen thuộc: iptables

sudo apt-get update
sudo apt-get install iptables

Và các commands để giới hạn connection cho từng port

sudo iptables -A INPUT -p tcp --dport 11122 -m connlimit --connlimit-above 10 -j REJECT
sudo iptables -A INPUT -p tcp --dport 31011 -m connlimit --connlimit-above 15 -j REJECT
sudo iptables -A INPUT -p tcp --dport 31012 -m connlimit --connlimit-above 15 -j REJECT
sudo iptables -A INPUT -p tcp --dport 31013 -m connlimit --connlimit-above 15 -j REJECT
sudo iptables -A INPUT -p tcp --dport 31014 -m connlimit --connlimit-above 15 -j REJECT
sudo iptables -A INPUT -p tcp --dport 31015 -m connlimit --connlimit-above 15 -j REJECT
sudo iptables -A INPUT -p tcp --dport 31016 -m connlimit --connlimit-above 15 -j REJECT
sudo iptables -A INPUT -p tcp --dport 31017 -m connlimit --connlimit-above 15 -j REJECT
sudo iptables -A INPUT -p tcp --dport 31018 -m connlimit --connlimit-above 15 -j REJECT
sudo iptables -A INPUT -p tcp --dport 31019 -m connlimit --connlimit-above 15 -j REJECT
sudo iptables -A INPUT -p tcp --dport 31020 -m connlimit --connlimit-above 15 -j REJECT
sudo iptables -A INPUT -p tcp --dport 31021 -m connlimit --connlimit-above 15 -j REJECT
sudo iptables -A INPUT -p tcp --dport 31022 -m connlimit --connlimit-above 15 -j REJECT
sudo iptables -A INPUT -p tcp --dport 31023 -m connlimit --connlimit-above 15 -j REJECT

Mình đang cấu hình nếu 1 IP có lớn hơn 15 connections trong cùng 1 thời gian ngắn thì sẽ bị block (REJECT)

Câu lệnh để kiểm tra cấu hình của iptables là iptables -L

Khi muốn thay đổi giới hạn connections tới VPS Ubuntu thì các bạn cần phải xoá rules cũ đi nhé, bằng câu lệnh: iptables -F

Ở client của Game cần đổi IP sang IP của Ubuntu nhé

Xong rồi đấy 😀 Hiện tại 2 VPS mình thuê ở 2 nhà cung cấp khác nhau, lúc chơi Game có chút delay, sắp tới đổi về 1 nhà chung cấp chắc sẽ ổn áp hơn.

Leave a comment