Мне нужна помощь с настройкой nftables. Возможно ли добиться значительных улучшений в борьбе с DDoS-атаками на сервер, особенно в случае SYN-флуда? Ситуация такова: в течение длительного времени мой сервер подвергается атакам. Я частично решил проблему, установив в sysctl.conf параметр <code>net.ipv4.tcp_syncookies = 1</code>, что немного помогло, но в моменты атаки сервер все еще долго отвечает на запросы. Поскольку большинство атакующих IP-адресов из Китая, я решил заблокировать всю страну. Также заблокировал Сингапур, но это привело к появлению новых проблем. Я использую следующий метод для блокировки стран: <a href="https://gist.github.com/bocan/ff82cbcbdc848aa34ff015e23ed866bf" rel="nofollow">https://gist.github.com/bocan/ff82cbcbdc848aa34ff015e23ed866bf</a>. Во время атак сервер зависает, хотя нагрузка на него, по моим наблюдениям, не высокая. Могу ли я что-то сделать с настройками, чтобы улучшить ситуацию? Ранее, до блокировки, в логах было много обращений к серверу, но после блокировки стран их число резко упало, однако проблема все равно осталась.
Для защиты вашего сервера от атак SYN flood с помощью `nftables`, вы можете настроить правила, которые будут ограничивать количество входящих SYN-пакетов и использовать механизмы для защиты от DDoS-атак. Ниже приведены несколько шагов и рекомендаций, которые помогут вам улучшить защиту вашего сервера:
### 1. Настройка `nftables`
Во-первых, вам нужно создать таблицу и цепочки для управления входящими соединениями. Примерный набор правил может выглядеть так:
```bash
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0; }
nft add chain inet filter forward { type filter hook forward priority 0; }
nft add chain inet filter output { type filter hook output priority 0; }
# Разрешить локальный трафик
nft add rule inet filter input ip saddr 127.0.0.0/8 accept
nft add rule inet filter input ip saddr 192.168.0.0/16 accept
# Настройка лимита для SYN пакетов
nft add rule inet filter input tcp flags syn limit rate 1/minute burst 5 accept
nft add rule inet filter input tcp flags syn reject with tcp reset
# Прочие правила для нового подключения
nft add rule inet filter input accept
```
### 2. Активировать `tcp_syncookies`
Как вы уже упомянули, параметр `tcp_syncookies` действительно стоит включить:
```bash
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
```
Эта настройка позволит вашему серверу справляться с SYN flood-атаками.
### 3. Ограничение количества соединений
Вы также можете ограничить количество соединений к вашему серверу с одного IP-адреса:
```bash
nft add rule inet filter input ip saddr 192.168.0.0/16 tcp dport 80 ct state new limit rate 10/minute accept
```
Здесь установлено ограничение на количество новых соединений к порту 80 из одного IP.
### 4. Блокировка подозреваемых IP
Если вы видите, что определенные IP-адреса часто инициируют атаки, вы можете временно блокировать их. Это можно сделать путем добавления правила для блокировки этих IP:
```bash
nft add rule inet filter input ip saddr <attack_ip> drop
```
### 5. Использование GeoIP
Если вы хотите заблокировать трафик из определенных стран, вам понадобится использовать GeoIP с `nftables`. Это может быть сложнее, но существует множество ресурсов и модулей, которые могут помочь в этом.
### 6. Дополнительные меры
- **Мониторинг сетевого трафика**: Убедитесь, что вы ведете мониторинг сетевого трафика, чтобы быстро реагировать на возможные атаки.
- **Использование сетевых фильтров или прокси-серверов**: Такие как Cloudflare или другие DDoS-защитные сервисы.
- **Регулярные обновления системы**: Убедитесь, что ваше программное обеспечение и операционная система всегда обновлены для устранения уязвимостей.
Эти меры в сочетании с `tcp_syncookies` и настройкой `nftables` должны помочь в борьбе с SYN flood и улучшить общую безопасность вашего сервера.
Я бы отправил через транслятор iptables->nftables что-то вроде
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 3 --connlimit-mask 24 -j DROP
либо с матчем на limit,
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT
connlimit ограничивает одновременное количество соединений, connlimit-mask говорит подключения из какого CIDR считать в один каунтер, /24 в примере выше,
а limit ограничивает количество открывающехся соединений в единицу времени