Я хочу настроить iptables и ip6tables для IPv6. Но по какой-то неизвестной причине последнее правило ip6tables в моей конфигурации блокирует любое исходящее соединение для моего сервера (apt-get, wget, ping, ping6 и т. Д.). Сервер - Debian 8.1, это капля DO с настроенным IPv6.
Вот конфиг:
#!/bin/sh
# Flush all existing first
sudo iptables -F
# Disable tracking
sudo iptables -t raw -I PREROUTING -p tcp --dport 80 -j NOTRACK
sudo iptables -t raw -I PREROUTING -p tcp --dport 22 -j NOTRACK
sudo iptables -t raw -I OUTPUT -p tcp --dport 80 -j NOTRACK
sudo iptables -t raw -I OUTPUT -p tcp --dport 22 -j NOTRACK
# Local
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
# DNS
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A OUTPUT -p udp --sport 53 --dport 1024:65535 -j ACCEPT
# Custom rules
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow ping from inside
sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# Allow ping from outside
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
# Drop everything else
sudo iptables -A INPUT -j DROP
# IPv6
# Flush all existing first
sudo ip6tables -F
# Disable tracking
sudo ip6tables -t raw -I PREROUTING -p tcp --dport 80 -j NOTRACK
sudo ip6tables -t raw -I PREROUTING -p tcp --dport 22 -j NOTRACK
sudo ip6tables -t raw -I OUTPUT -p tcp --dport 80 -j NOTRACK
sudo ip6tables -t raw -I OUTPUT -p tcp --dport 22 -j NOTRACK
# Local
sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A OUTPUT -o lo -j ACCEPT
# DNS
sudo ip6tables -A INPUT -p udp --dport 53 -j ACCEPT
sudo ip6tables -A OUTPUT -p udp --sport 53 --dport 1024:65535 -j ACCEPT
# Custom rules
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow ping from inside
sudo ip6tables -A OUTPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-reply -j ACCEPT
# Allow ping from outside
sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
sudo ip6tables -A OUTPUT -p icmpv6 --icmpv6-type echo-reply -j ACCEPT
# Drop everything else
sudo ip6tables -A INPUT -j DROP
Если я удалю это последнее правило (ip6tables -A INPUT -j DROP), все будет работать нормально. В чем может быть проблема?
UPD. Спасибо тем, кто ответил за бесценную информацию по всему набору правил. Если кому-то нужна работающая сейчас конфигурация, это для базового веб-сервера с открытыми 80 и 22 портами без сохранения состояния (для приложений с высоким трафиком):
#!/bin/sh
# Flush all existing first
sudo iptables -F
# Local
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
# Allow outbound DNS
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT
# Allow inbound HTTP (apt-get, wget etc.)
sudo iptables -A INPUT -p tcp --sport 80 -j ACCEPT
# Custom rules
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow ICMP
sudo iptables -A INPUT -p icmp -j ACCEPT
sudo iptables -A OUTPUT -p icmp -j ACCEPT
# Drop everything else
sudo iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
# IPv6
# Flush all existing first
sudo ip6tables -F
# Local
sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A OUTPUT -o lo -j ACCEPT
# Allow outbound DNS
sudo ip6tables -A OUTPUT -p udp --dport 53 -j ACCEPT
sudo ip6tables -A INPUT -p udp --sport 53 -j ACCEPT
# Allow inbound HTTP (apt-get, wget etc.)
sudo ip6tables -A INPUT -p tcp --sport 80 -j ACCEPT
# Custom rules
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow ICMP
sudo ip6tables -A INPUT -p icmpv6 -j ACCEPT
sudo ip6tables -A OUTPUT -p icmpv6 -j ACCEPT
# Drop everything else
sudo ip6tables -A INPUT -j REJECT --reject-with icmp6-adm-prohibited
Правило не блокирует исходящие соединения. Однако он отбрасывает ответы, отправленные всем вашим исходящим соединениям.
Это не единственный недостаток ваших правил. Вы отбрасываете много пакетов ICMPv6, которые необходимы для правильной работы. Более того, тихое отбрасывание пакетов не является хорошей практикой, потому что это затруднит отладку проблем и внесет дополнительные проблемы, которых не было бы, если бы вы отправляли правильные сообщения об ошибках.
Чтобы решить первую проблему, вам нужно либо включить отслеживание подключений, чтобы ответы на исходящие подключения были разрешены. Либо внимательно оцените, какие исходящие подключения вам нужны, и выберите набор правил без сохранения состояния, позволяющих входящему трафику соответствовать этому исходящему трафику. .
Чтобы решить вторую проблему, вам необходимо разрешить все входящие сообщения об ошибках ICMPv6, а также обнаружение соседей.
Чтобы решить третью проблему, используйте REJECT --reject-with icmp6-adm-prohibited
вместо того DROP
.
На INPUT (IPv6) разрешены только следующие пакеты:
lo
На практике вы блокируете все остальные входящие пакеты, включая ответы на ваши исходящие пакеты. Вы должны изучить «межсетевой экран с отслеживанием состояния», используя модуль «state». Видеть https://www.sixxs.net/wiki/IPv6_Firewalling для некоторых примеров.
Вы также блокируете слишком много ICMPv6. И объявление маршрутизатора, и обнаружение соседей являются примерами ICMPv6, которые, вероятно, понадобятся.