Всем привет.
Появилась необходимость дропать пакеты на этапе 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, но на порты виртуалки меня не пускает.
Поскольку сейчас на машину идет ддос-атака, я хочу попробовать закрыть все публичные порты и открывать их для каждого пользователя индивидуально.