Введение
В этом руководстве объясняется, как защитить игровой сервер от DDoS-атак, настроив простейший брандмауэр и ограничив скорость. Обратите внимание, что даже с этими настройками ваш сервер не будет застрахован от DDoS-атак. Однако надёжный брандмауэр может минимизировать поверхность атаки, а правила ограничения скорости помогут предотвратить перегрузку сервера.
Предпосылки:
- Сервер с Ubuntu (Это руководство было протестировано на Ubuntu 22.04, но должно работать и на других версиях.)
Шаг 1 – Брандмауэр
В целях безопасности вам следует настроить брандмауэр, который по умолчанию блокирует весь входящий трафик. Вы можете добавить исключения, чтобы разрешить доступ к протоколам/портам, необходимым для входа на сервер (SSH) и подключения к игре (TCP/UDP). Для ещё большей надёжности брандмауэра можно также указать IP-адреса, которым будет разрешён доступ. Запросы с любых других IP-адресов будут автоматически отклоняться. В этом руководстве объясняется, как заблокировать весь входящий трафик, а также:
- Разрешить всем доступ к игровому порту.
- Доступ к игровому порту имеют только избранные IP-адреса.
В Ubuntu брандмауэр по умолчанию — UFW. В этом руководстве используются iptables. Убедитесь, что вы используете только один брандмауэр. Использование нескольких разных брандмауэров не рекомендуется, так как их правила могут конфликтовать друг с другом и приводить к путанице.
Чтобы проверить, есть ли у вас уже какие-либо правила, вы можете использовать следующее:
sudo iptables -Lاگر فایروال هنوز قوانینی ندارد، اکنون میتوانید آنها را اضافه کنید. وقتی خط مشی پیشفرض برای ترافیک ورودی را روی «DROP» تنظیم میکنید، بلافاصله تمام اتصالات پایان مییابد. به همین دلیل، ابتدا باید مطمئن شوید که اتصالات SSH را مجاز کرده اید تا همچنان بتوانید به سرور خود دسترسی داشته باشید.
اگر از پورت پیشفرض SSH استفاده نمیکنید، حتماً در دستورات زیر 22 را جایگزین کنید.
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
اکنون که فایروال راه اندازی شده است، می توانید پورت بازی خود را باز کنید.فقط IP های انتخاب شده به پورت بازی دسترسی داشته باشند.اگر آیپی بازیکنانی که به بازی ملحق میشوند را میدانید و آیپیها تغییر نمیکنند، میتوانید فقط به آن IPها دسترسی داشته باشید:
sudo iptables -A INPUT -s <203.0.113.1>,<198.51.100.1> -p tcp --dport <your_game_port> -j ACCEPT
sudo iptables -A INPUT -s <203.0.113.1>,<198.51.100.1> -p udp --dport <your_game_port> -j ACCEPT Разрешите всем доступ к игровому порту. С помощью этого правила каждый сможет получить доступ к вашей игре:
sudo iptables -A INPUT -p tcp --dport <your_game_port> -j ACCEPT sudo iptables -A INPUT -p udp --dport <your_game_port> -j ACCEPT
Теперь новые правила должны быть добавлены. Вы можете просмотреть их с помощью команды sudo iptables -L. По умолчанию правила не сохраняются и исчезнут после следующей перезагрузки. Чтобы сделать их постоянными, установите:
sudo apt update && sudo apt install iptables-persistentحالا قوانین خود را ذخیره کنید:
sudo iptables-save | sudo tee /etc/iptables/rules.v4
sudo ip6tables-save | sudo tee /etc/iptables/rules.v6دفعه بعد که سرور خود را راه اندازی مجدد می کنید، قوانین ذخیره شده در فایل دوباره اعمال خواهند شد. هنگامی که قوانین جدید iptables را اضافه می کنید، باید دوباره دستور iptables-save را برای به روز رسانی فایل ها اجرا کنید.
sudo iptables -L --line-numbers # Вывести список всех правил с номерами sudo iptables -D INPUT # Удалить правило INPUT, указав номерمرحله 2 – محدود کردن نرخ
Настройка брандмауэра, описанная в шаге 1, уже способствует повышению безопасности. Однако предоставление доступа к игровому порту для всех пользователей открывает потенциальную поверхность для атаки. Iptables и Fail2Ban позволяют ограничить количество разрешённых запросов. Вот как это сделать:
- Ограничьте количество запросов на один IP-адрес.
- Ограничьте количество запросов со всех IP-адресов одновременно.
Шаг 2.1 — Ограничьте количество запросов на один IP-адрес.
На этом этапе используется Fail2Ban для ограничения запросов и iptables для регистрации запросов.
Прежде чем начать, убедитесь, что доступны iptables и Fail2Ban. Вы можете использовать команду systemctl status fail2ban, чтобы проверить, запущен ли Fail2Ban. Установка в Ubuntu:
apt install fail2ban
systemctl enable --now fail2banبه iptables بگویید تلاش های دسترسی را ثبت کنند
sudo iptables -I INPUT -p tcp --dport <your_game_port> -m conntrack --ctstate NEW -j LOG --log-level 6 --log-prefix "GameServerAccess: "اکنون Iptables تمام تلاشها برای دسترسی به پورت TCP <your_game_port> را در فایل /var/log/syslog ثبت میکند. وقتی فایل را مشاهده می کنید، خواهید دید که تمام تلاش ها برای دسترسی به پورت بازی پیشوند GameServerAccess داده می شود. قاعده را پایدار کنید:
sudo iptables-save | sudo tee /etc/iptables/rules.v4یک فیلتر اضافه کنید در فایل /var/log/syslog، فقط ورودیهای با پیشوند GameServerAccess: مرتبط هستند. فایل زیر را ایجاد کنید تا به Fail2Ban بگویید آن ورودی ها را فیلتر کند:
sudo nano /etc/fail2ban/filter.d/gameserveraccess.confاضافه کردن محتوا:
[Definition]
failregex = GameServerAccess: .* SRC=<HOST>
ignoreregex =به Fail2Ban بگویید تعداد درخواستهای هر IP را محدود کند و برای IPهایی که از حد مجاز فراتر میروند، زمان ممنوعیت تعیین کنید. logpath به Fail2Ban می گوید که IP ها را از کجا دریافت کنید. فیلتری که ما ایجاد کردیم به Fail2Ban میگوید فقط IPهایی را که با پیشوند GameServerAccess ثبت شدهاند نظارت کند.
sudo nano /etc/fail2ban/jail.localДобавить контент:
[game-server]
enabled = true
filter = gameserveraccess
logpath = /var/log/syslog
maxretry = 7
findtime = 30
bantime = 120Приведённые выше настройки позволяют каждому IP-адресу отправлять 7 запросов за 30 секунд. Если IP-адрес превысит этот лимит, он будет заблокирован на 120 секунд. Если вы хотите установить другой лимит, замените значения 7, 30 и 120 соответственно.
После того, как все настроено, перезапустите Fail2Ban:
sudo systemctl restart fail2banШаг 2.2 — Ограничьте количество запросов со всех IP-адресов одновременно
В iptables вы можете использовать модуль limit для ограничения общего количества новых подключений за определённый период времени. При использовании модуля limit параметры –limit и –limit-burst задают временной период и параметр limit.
Удалите старое правило брандмауэра. Если вы уже открыли игровой порт для всех на шаге 1, вы можете удалить это правило сейчас. С учётом правил ограничения скорости, описанных ниже, это правило вам больше не понадобится.
sudo iptables -L --line-numbers # Get the line number of "ACCEPT anywhere tcp dpt:<your_game_port>"
sudo iptables -D INPUT <line-number> # Delete the rule that accepts all incoming requests to your game portВыполните следующие команды, чтобы добавить новые правила, установив параметр ограничения 100 и время цикла полминуты (30 секунд). Если вы хотите установить другие ограничения, вы можете заменить значения 100 и 2/мин соответственно.
sudo iptables -A INPUT -p tcp --dport <your_game_port> -m conntrack --ctstate NEW -m limit --limit 2/min --limit-burst 100 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport <your_game_port> -m conntrack --ctstate NEW -j DROPsudo iptables-save | sudo tee /etc/iptables/rules.v4При следующем перезапуске сервера правила, сохраненные в файле, будут применены повторно.
Шаг 3 – Правила блокировки
После достижения ограничения скорости, указанного на шаге 2, доступ к TCP-порту your_game_port будет закрыт для всех запросов. Однако, пока количество запросов не превышает лимита, доступ предоставляется всем. Это касается как легитимных, так и нелегитимных запросов. Следующее правило отбрасывает новые соединения без флага SYN:
sudo iptables -I INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j DROPКогда все будет сделано, вам нужно снова сохранить ваши правила:
sudo iptables-save | sudo tee /etc/iptables/rules.v4Результат
Обратите внимание, что этих настроек недостаточно для полного предотвращения DDoS-атак, и всегда есть возможность повысить безопасность, используя дополнительные настройки для предотвращения DDoS-атак. Однако, благодаря настройкам, представленным в этом руководстве, у вас теперь есть первая линия защиты от DDoS-атак и основа для дальнейшей работы.









