Я стал жертвой атаки синхронного флуда через порт UDP. Это пришло с множества разных IP-адресов. Машина, выделенный сервер, является игровым сервером hlds, и злоумышленник перегружает порты UDP, что вызывает большие проблемы в игре с потерей пакетов и высоким пингом для каждого пользователя в игре.
Сервер находится под Linux, с активированным iptables, и на данный момент с некоторыми правилами, чтобы остановить эту атаку, но мне повезло, но ничего не случилось.
TCPDUMP LOG (не все)
No. Time Source Destination Protocol Length Info 1012 6.134039 111.90.151.22 MYIP UDP 60 Source port: ezmeeting-2 Destination port: 27024
Src: 111.90.151.22 (111.90.151.22), Dst: x.x.x.x (x.x.x.x)
Version: 4
Header length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))
Total Length: 33
Identification: 0x117f (4479)
Flags: 0x00
Fragment offset: 0
Time to live: 242
Protocol: UDP (17)
Header checksum: 0x4154 [correct]
Source: 111.90.151.22 (111.90.151.22)
Destination: x.x.x.x (x.x.x.x)
[Source GeoIP: Unknown]
[Destination GeoIP: Unknown] User Datagram Protocol, Src Port: ezmeeting-2 (10101), Dst Port: 27024 (27024) Data (5 bytes)
Data: ffffffff56
[Length: 5]
IPTABLES
iptables -A INPUT -p udp -d X.X.X.X --dport 27024 -m length --length 60 -m recent --set --name GameSynF
iptables -A INPUT -p udp -d X.X.X.X --dport 27024 -m string --algo kmp --hex-string "|ff ff ff ff 56|" -m recent --set --name GameSynF -j DROP
Как выполнить эту iptable, чтобы отбросить любой пакет с шестнадцатеричной строкой «ffffffff56» и длиной 60.
Если ваш брандмауэр еще не настроен таким образом, по умолчанию отказать это более безопасный способ работы. Это означает, что запрещается все, что явно не разрешено. Для iptables это означает:
iptables -P INPUT DROP
Вы можете сделать это также для цепочек OUTPUT и FORWARD, но OUTPUT, в частности, требует немного большей дисциплины в управлении тем, к чему вашему серверу разрешено подключаться.
Запретив все, вы разрешаете все, что хотите. Ваша игра прослушивает UDP-трафик на портах 27015 и 27018? Если да, добавьте правила, разрешающие входящий трафик. Всегда ли клиент использует небольшой диапазон исходных портов или даже один исходный порт? Если это так, ограничьте разрешенные пакеты только этими исходными портами. Первый приведенный вами пример с исходным портом 80 в этом случае будет автоматически заблокирован. Другой может зависеть от того, какие исходные порты использует ваш клиент.
Как вы определяете, что правила брандмауэра не работают? tcpdump
подключается за пределами брандмауэра и, следовательно, будет видеть пакеты, которые должны быть отброшены (или в исходящем направлении, которые уже прошли брандмауэр). Вы можете использовать -j LOG
правило для мониторинга определенных частей ваших цепочек или использования ведения журнала в приложении.
Я не совсем понимаю, что вы имеете в виду под «перегрузкой портов udp». Нужно ли вашему приложению использовать отдельный порт UDP для каждого подключаемого IP-адреса? Есть ли какой-то общий ресурс, который является узким местом? Весь этот UDP-трафик просто заполняет буферы сетевого оборудования, вызывая задержку, связанную с буферизацией? Если последнее верно, блокировка с помощью iptables даже не решит вашу проблему.
вам нужно выяснить, почему этот UDP-флуд тормозит вас.
Если атака вызывает более высокие пинги, я бы предположил, что наводнение не вызывает проблем на вашем сервере, но оно занимает всю полосу пропускания вашего интернет-соединения. в этом случае правило брандмауэра на сервере не решит эту проблему. вам нужно будет поговорить со своим вышестоящим интернет-провайдером, чтобы заставить их заблокировать этот трафик.