
Я пытаюсь заблокировать весь трафик на веб-сервер, за исключением некоторых определенных подсетей. Я проверил множество сообщений и считал, что правильно настроил iptables, но по какой-то причине сайт все еще доступен за пределами подсетей, определенных мной в наборе правил. Может ли кто-нибудь пролить свет на то, что я мог сделать неправильно? Я установил, что удаление правила 3 делает сайт вообще недоступным. Сам сайт находится в 10.10.0.0/16.
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- any any 10.10.0.0/16 anywhere
2 0 0 ACCEPT all -- any any 172.30.0.0/16 anywhere
3 0 0 ACCEPT all -- lo any anywhere anywhere
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- any lo anywhere anywhere
Целью будет добавление в белый список различных публичных IP-адресов и блокировка сайта, чтобы он был доступен только некоторым.
Были добавлены следующие правила:
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT
iptables -I INPUT -s 10.10.0.0/16 -j ACCEPT
iptables -I INPUT -s 172.30.0.0/16 -j ACCEPT
iptables -P INPUT DROP
решение1
Theпорядок правилимеет значение в iptables. Используя iptables -A
вы добавляете правилав конценабора правил. Но iptables -I
вставляет правило поверх набора правил, если вы не указали номер строки (вы этого не сделали). В результате правила не оцениваются в предполагаемом порядке.
Вот пример конфигурации, которая должна работать, на основеэта почта. Очистите свои правила заранее, чтобы избежать дублирования.
iptables -P FORWARD DROP
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 10.10.0.0/16 -j ACCEPT
iptables -A INPUT -s 172.30.0.0/16 -j ACCEPT
# add some more whitelisting rules here
iptables -P INPUT DROP # Drop everything we don't accept
Третье правило важно:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
в противном случае ваш сервер не будет получать ответы на инициированные им соединения, например, DNS-запросы.
Кстати, iptables работает с IPv4, но не с IPv6, поэтому, если ваш сервер поддерживает IPv6, у вас могут быть клиенты, подключающиеся с помощьюIPv6. Это возможно, если они подключаются по имени хоста вместо IP-адреса, и что имя хоста разрешается в допустимый адрес IPv6 на вашем сервере. Вы, вероятно, знаете, но многие люди до сих пор не знают, что iptables фильтрует трафик IPv6 (и атаки). Я бы также добавил похожие ip6tables
правила, если это подходит для вашей настройки.