@C_hard

Как пустить PREROUTING iptables через фильтр?

Всем привет.
Появилась необходимость дропать пакеты на этапе PREROUTING. Вот исходный скрипт с правилами (на примере 80 порта, на самом деле там много разных портов).
# SSH на машине
iptables -A INPUT -i ${WAN} -d ${WAN_IP} -p tcp --dport 22 -j ACCEPT
# Порты для двух виртуалок
iptables -A INPUT -i ${WAN} -d ${WAN_IP} -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i ${WAN} -d ${WAN_IP} -p tcp --dport 8080 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i ${WAN} -d ${WAN_IP} --dport 80 -j DNAT --to-destination ${LOCAL_VM_1}:80
iptables -t nat -A PREROUTING -p tcp -i ${WAN} -d ${WAN_IP} --dport 8080 -j DNAT --to-destination ${LOCAL_VM_2}:80


Таким образом траффик распределяется между двумя виртуалками с локальными адресами LOCAL_VM_1 и LOCAL_VM_2, в итоге имеющими общий вешний IP-адрес WAN_IP.
Проблема в том, что в инпуте я не могу дропнуть пакеты при необходимости (а значит строка iptables -A INPUT -i ${WAN} -d ${WAN_IP} -p tcp --dport 80 -j ACCEPT бесполезна). Также хотелось бы туда добавить фильтры для syn flood атак.
Вот что я пытался сделать:
iptables -A INPUT -i ${WAN} -d ${WAN_IP} -p tcp --dport 22 -j ACCEPT
iptables -N Filters
iptables -A Filters -j DROP
iptables -A Filters -i lo -j ACCEPT
iptables -A Filters -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A Filters -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A Filters -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A Filters -p icmp --icmp-type echo-request -j ACCEPT
iptables -A Filters -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A Filters -m state --state INVALID -j DROP
iptables -A Filters -p tcp ! --syn -m state --state NEW -j DROP

iptables -A Filters -i ${WAN} -d ${WAN_IP} -p tcp --dport 22 -j ACCEPT
iptables -A Filters -i ${WAN} -d ${WAN_IP} -p tcp --dport 80 -j ACCEPT
iptables -A Filters -i ${WAN} -d ${WAN_IP} -p tcp --dport 8080 -j ACCEPT

iptables -A Filters -p tcp -m connlimit --connlimit-above 10 --connlimit-mask 32 -j DROP
iptables -A Filters -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 -j DROP
iptables -A Filters -m limit --limit 200/sec --limit-burst 500 -j DROP
iptables -A INPUT -j Filters
iptables -A FORWARD -j Filters

iptables -t nat -A PREROUTING -p tcp -i ${WAN} -d ${WAN_IP} --dport 80 -j DNAT --to-destination ${LOCAL_VM_1}:80
iptables -t nat -A PREROUTING -p tcp -i ${WAN} -d ${WAN_IP} --dport 8080 -j DNAT --to-destination ${LOCAL_VM_2}:80


При такой настройке я могу подключиться к основной машине по ssh, но на порты виртуалки меня не пускает.
Поскольку сейчас на машину идет ддос-атака, я хочу попробовать закрыть все публичные порты и открывать их для каждого пользователя индивидуально.
  • Вопрос задан
  • 1205 просмотров
Решения вопроса 1
hint000
@hint000
у админа три руки
хочу попробовать закрыть все публичные порты и открывать их для каждого пользователя индивидуально.
Это называется доступом по белому списку. Ниже пример, как можно это сделать. Только у меня это не в формате исполняемого шелл-скрипта, а в формате конфига, загружаемого командой iptables-restore.
# example

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# WhiteList (разрешенные внешние клиенты)
-N Wht
-A Wht -s 1.2.3.4      -j RETURN
-A Wht -s 2.3.4.5      -j RETURN
# разрешенная подсеть
-A Wht -s 3.4.5.0/24 -j RETURN
# ...

# go to hell
-A Wht  -j DNAT --to-destination 192.168.99.99

-A PREROUTING ! -s 192.168.0.0/16 -p tcp --dport 22 -j Wht
-A PREROUTING ! -s 192.168.0.0/16 -p tcp --dport 22 -j ACCEPT

-A PREROUTING ! -s 192.168.0.0/16 -p tcp --dport 80 -j Wht
-A PREROUTING ! -s 192.168.0.0/16 -p tcp --dport 80 -j DNAT --to-destination 192.168.42.18:80

-A PREROUTING ! -s 192.168.0.0/16 -p tcp --dport 8080 -j Wht
-A PREROUTING ! -s 192.168.0.0/16 -p tcp --dport 8080 -j DNAT --to-destination 192.168.42.19:80

-A PREROUTING -s 192.168.0.0/16 -j ACCEPT

COMMIT

поясню насчёт 192.168.99.99 - этот адрес я выбрал (произвольно, можно любой другой) в качестве "чёрной дыры", куда можно невозбранно отправлять ненужные пакеты. Прописана "дыра" командой ip route add blackhole 192.168.99.99
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@MechanID
Админ хостинг провайдера
Конечно строка iptables -A INPUT -i ${WAN} -d ${LOCAL_IP} -p tcp --dport 80 -j ACCEPT бесполезна - так как указан ${WAN} интерфейс и в трафике там приходит на ${WAN_IP}. - вам нужно заменить ${LOCAL_IP} на ${WAN_IP} тогда правило заработает.

По ддос атаке - опасно рейтлимитить вест трафик, когда вы делаете вот так:
-A Filters -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 -j DROP
вы рейтлимитите все и отовсюду, если у вас переполнится conntrac то начнутся потери пакетов и сервер может стать не доступным, в таких правилах всегда указывайте входящий интерфейс и порт.
Ответ написан
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
Маркируете трафик и дропаете его как только он попадает в FILTER. Не надо пытаться забивать молотком шурупы - для этого отвертка есть.
Вот как я например глушу прилетающие "снаружи" пакеты с RFC1918-адресами: (формат iptables-restore)
*mangle
-A PREROUTING -i eth0 -m set --match-set rfc1918 src -j MARK --set-mark 1
*filter
-A INPUT -m mark --mark 1 -j DROP


Сет rfc1918 - это таблица, которую составляет ipset:
create rfc1918 hash:net family inet hashsize 1024 maxelem 65536 
add rfc1918 10.0.0.0/8
add rfc1918 172.16.0.0/12
add rfc1918 192.168.0.0/16


С его помощью запросто организовать доступ к ssh например только для определенного списка адресов, а всех остальных дропать.
Ответ написан
Ваш ответ на вопрос

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

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