Проксирование трафика игрового сервера

Есть выделенный сервер с защитой от DDOS в первом дата центре. (сервер #1)
Есть ещё один выделенный сервер без защиты от DDOS в втором дата центре. (сервер #2)
На сервере #2 стоит игровой сервер. Нужно, что бы трафик до сервера #2 шел через сервер #1, тем самым фильтруя трафик. Также чтоб пользователи не могли подключиться к серверу #2 напрямую, а только через сервер #1. На обоих серверах стоит CentOS, есть возможность поставить Debian.
  • Вопрос задан
  • 4957 просмотров
Пригласить эксперта
Ответы на вопрос 3
merryjane
@merryjane
Системный администратор
1. Что за трафик? http\https?
2. Cервер #1 выполняет только функцию защиты от ddos и сам не является игровым сервером?
Ответ написан
@throughtheether
human after all
Вы упомянули что некую "защиту от DDoS" вам предоставляет хостер (можете кстати уточнить модель аппаратного решения?). Если предположить, что ваши сервисы используют UDP (что, думаю, корректно для случая с CS-подобными игровыми серверами без дополнительных оберток трафика), то мысли такие.

Я полагаю, что максимум, что хостер может сделать - это ограничить трафик до сервера при DDoS-атаках (policing, причем хорошо, если политики учитывают порты назначения, а не только IP-адреса) или полностью заблокировать трафик до одного сервера, спасая инфраструктуру от чрезмерного трафика (bgp blackhole к аплинкам, эффективно атакуемый сервер все равно будет недоступен).

При использовании UDP возникает проблема аутентификации трафика. При использовании TCP есть возможность отделить тех, кто действительно устанавливает соединение, от тех, кто шлет SYN-сегменты с подставными адресами - вторые не смогут ответить ACK-сегментом с правильным значением acknowledgement на наш SYN-ACK-сегмент (ну или есть варианты с специально сформированным кривым SYN-ACK ответом, легитимный хост ответит RST c правильным acknowledgment и перепошлет SYN через примерно 3 секунды). В случае с UDP мы такой роскоши лишены. Мы не можем средствами самого UDP определить, кто подделывает адреса, а кто является легитимным хостом. Полагаю, неплохим решением было бы вести на сервере список IP-адресов клиентов и каким-либо образом передавать его хостеру, чтобы он в случае атаки блокировал весь трафик, не удовлетворяющий списку. Но хостер не внедрит новомодныя SDN-технологии (программно-определяемые сети) и не даст вам доступ к соответствующему API, это будет довольно затруднительно организовать.

Далее, что касается проксирования трафика. Самый наивный вариант - udp-прокси, т.е. сокет на сервере 1 принимает данные и копирует их в сокет, отправляющий данные на сервер 2. На сервер 2 пакеты, вмещающие соотвествующие датаграммы, придут с полем адреса источника, равном адресу сервера 1. Со стороны сервера 2 будет казаться, что все игроки имеют один и тот же адрес (если не предпринять никаких мер на уровне приложения, например добавлять в датаграммы дополнительный заголовок с адресом). Иногда это недопустимо.

Более внятный вариант - натирование. Примерная схема на иллюстрации.
game-proxy.png
Подобная схема часто реализуется при балансировке нагрузки при помощи решений вроде F5. Здесь используется Destination NAT пакетов от клиента к серверу и Source NAT пакетов от сервера к клиенту. Весь трафик от S2 надо будет направить через S1, это может потребовать поднятия какого-либо (например, GRE) туннеля. Также необходимо учесть, что IP-адреса могут использоваться внутри L7-протокола (наиболее известный случай - FTP), это может поднять новые вопросы.

Вообще говоря, ваша задача - широкое минное поле для экспериментов.
Ответ написан
Комментировать
@Snow-m
Так а тунель запустить можно между серверами или проксировать через скрипт .sh
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы