Фильтрация DDoS атак через GRE туннель с использованием фильтрующих сервисов

Фильтрация DDoS атак через GRE туннель с использованием фильтрующих сервисов

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

Как и прокси, GRE позволяет пропускать трафик с одной хост машины на любой другой удаленный пункт назначения. Попробуем использовать это для фильтрации наших ресурсов через удаленный фильтрующий сервер.

В нашем случае мы будем использовать 2 виртуальных сервера на базе KVM с разными локациями.

VM_GreFR - KVM сервер с DDoS фильтрацией в Европейском дата-центре.
VM_GreRU - KVM сервер без фильтрации в Российском дата-центре.

GRE туннели позволяют пропускать не только HTTP трафик. С помощью GRE моно доставить любой тип контента с любого сервера (аудио, видео, FTP, SSH, SCP и другое).

GRE туннелирование удобно когда мы хотим использовать защиту своих ресурсов от атак средствами стороннего фильтрующего сервиса.

Требования к системе

  • iptables
  • iproute2
  • Ядро с поддержкой GRE (по умолчанию все linux дистрибутивы поддерживают ip_gre)

Данное руководство не подходит для серверов компании OVH, для настройки используйте IPIP туннель.

Настройка

Проверяем включен ли модуль ip_gre и если нет включаем его.

1
2
3
4
5
# modprobe ip_gre
# lsmod | grep gre
ip_gre 18245 0
ip_tunnel 25216 1 ip_gre
gre 13796 1 ip_gre

На сервере VM_GreFR разрешаем пересылку пакетов:

1
2
# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
# sysctl -p
1
2
3
# iptunnel add gre1 mode gre local YOUR_UNFILTERED_IP remote DESTINATION_SERVER_IP ttl 255
# ip addr add 192.168.168.1/30 dev gre1
# ip link set gre1 up

На сервере VM_GreRU выполняем следующие настройки:

Проверяем включен ли модуль ip_gre и если нет включаем его.

1
2
3
4
5
# modprobe ip_gre
# lsmod | grep gre
ip_gre 18245 0
ip_tunnel 25216 1 ip_gre
gre 13796 1 ip_gre

На сервере VM_GreFR разрешаем пересылку пакетов:

1
2
# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
# sysctl -p
1
2
3
# iptunnel add gre1 mode gre local DESTINATION_SERVER_IP remote YOUR_UNFILTERED_IP ttl 255
# ip addr add 192.168.168.2/30 dev gre1
# ip link set gre1 up

Обратите внимание, что в первых строчках на каждом сервере указаны какие адреса являются отправкой и какие назначением. Вторые строчки содержат в себе локальные адреса, которые не должны быть заняты в вашей внутренней сети.

Удостоверьтесь, что не столкнулись ни с каким видом проблем связанных MTU.

Роутинг

Исходные записи маршрута требуются, чтобы удостовериться в данных, которые прибыли и которые туннель GRE передает обратно.

Выполним следующие команды на сервере VM_GreRU

1
2
3
# echo '100 GreFilter' >> /etc/iproute2/rt_tables
# ip rule add from 192.168.168.0/30 table GreFilter
# ip route add default via 192.168.168.1 table GreFilter

Обратите внимание, что данные команды должны быть выполнены только один раз. В противном случае придется вручную исправлять это в файле /etc/iproute2/rt_tables

Настраиваем NAT

Для того чтобы направить трафик в наш туннель необходимо завернуть трафик через NAT:

На фильтрующем сервере VM_GreFR выполняем:

1
# iptables -t nat -A POSTROUTING -s 192.168.168.0/30 ! -o gre+ -j SNAT --to-source YOUR_FILTERED_IP

Перенаправление портов через GRE туннель

Чтобы сделать все проще, мы передадим все порты бэкэнд серверу.

На фильтрующем сервере VM_GreFR выполняем:

1
2
# iptables -t nat -A PREROUTING -d YOUR_FILTERED_IP -j DNAT --to-destination 192.168.168.2
# iptables -A FORWARD -d 192.168.168.2 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Первое правило настраивает фактическое перенаправление портов, и второе правило удостоверяется, что соединения получают NAT’d и возвращаются назад должным образом.