
Привет, у меня есть онлайн-сервер, который я использую как шлюз, и iptables ведет себя странно.
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i tun+ -j ACCEPT
-A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A BLOCK_CHAIN -s 173.230.154.149/32 -j REJECT --reject-with icmp-host-prohibited
-A BLOCK_CHAIN -m state --state NEW -j ACCEPT
но 173.230.154.149 все еще может получить доступ к серверу Apache в 80 или 443, он не должен быть заблокирован
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN
и
-A BLOCK_CHAIN -s 173.230.154.149/32 -j REJECT --reject-with icmp-host-prohibited
Да, это онлайн-сервер, который направляет все веб-сервисы на персональный более крупный сервер через VPN с OpenVPN.
все работает как и ожидалось, просто я не могу заблокировать входящие соединения с определенных IP, которые, очевидно, атакуют сервер
типология сети - это
Внешний IP XX.XX.X.XX Vpn 10.0.0.0/24
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.100
-A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.100
решение1
Пакет, маршрутизируемый, а не принимаемый локальным процессом, проходит через цепочку filter/FORWARD, а не через цепочку filter/INPUT, даже если это вызвано использованием NAT. Поэтому текущие правила блокировки в filter/INPUT не действуют. Эти правила:
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN -A INPUT -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN
следует просто заменить на:
-A FORWARD -i eth0 -p tcp -m tcp --dport 443 -j BLOCK_CHAIN
-A FORWARD -i eth0 -p tcp -m tcp --dport 80 -j BLOCK_CHAIN
Очевидно, их следует добавлять перед правилами, разрешающими доступ к веб-серверу, чтобы они могли иметь какой-либо эффект. Поэтому добавьте их хотя бы перед этими:
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
Потому что после того, как первоначальное соединение будет принято, все последующие пакеты будут блокироваться по этому правилу:
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
Поэтому их необходимо блокировать при первом появлении.
Дополнительные замечания:
избыточные правила
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i tun+ -j ACCEPT -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
Первое правило выше, а также второе правило, каждое из них в отдельности, делают третье правило излишним.
Так же:
-A FORWARD -i eth0 -o tun+ -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o tun+ -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT
Первое правило делает два последующих излишними.
Но все это могло быть сделано для проверки текущей проблемы.
Если только не запущено самое последнее ядро (где проблема исправлена), никакое правило REJECT не должно отклонять пакет в состоянии INVALID. Такой пакет должен быть "только" ОТБРАСЫВАТЬСЯ, иначе могут произойти редкие случайные сбои соединения легитимного трафика.
Теперь это задокументировано в
iptables-extensions(8)
:Предупреждение: не следует без разбора применять цель REJECT к пакетам, состояние соединения которых классифицируется как INVALID; вместо этого следует только ОТБРАСЫВАТЬ их.
(Далее на странице руководства приводится дополнительное обоснование.)
Так что обычно,
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
должно следовать:
-A FORWARD -m conntrack --ctstate INVALID -j DROP