Мне нужно настроить мою машину так, чтобы разрешить HTTP-трафик только на / от serverfault.com. Все остальные сайты, порты сервисов недоступны. Я придумал следующие правила iptables:
#drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP
#Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
#allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT
Не очень хорошо работает:
После того, как я все бросаю и перехожу к правилу 3:
iptables -A ВЫХОД -p tcp -d serverfault.com --dport 80 -j ПРИНЯТЬ
Я получаю такую ошибку:
iptables v1.4.4: host/network `serverfault.com' not found
Try `iptables -h' or 'iptables --help' for more information.
Как вы думаете, это связано с DNS? Могу ли я тоже это позволить? Или мне в правилах просто указать IP-адреса? Как вы думаете, можно ли добиться того, что я пытаюсь сделать, с помощью более простых правил? Как?
Буду признателен за любую помощь или подсказки по этому поводу. Большое спасибо!
В правилах IPTables порядок имеет значение. Правила добавляются и применяются по порядку. Более того, при добавлении правил вручную они применяются сразу. Таким образом, в вашем примере любые пакеты, проходящие через цепочки INPUT и OUTPUT, начинают отбрасываться, как только устанавливается политика по умолчанию. Кстати, именно поэтому вы и получили то сообщение об ошибке. Происходит вот что:
Хотя параметры источника / назначения принимают имена хостов, это настоятельно не рекомендуется. Чтобы процитировать страницу руководства,
Имена хостов будут разрешены только один раз, прежде чем правило будет отправлено ядру. Обратите внимание, что указывать любое имя, которое будет разрешено удаленным запросом, например DNS, - действительно плохая идея.
Slillibri попал в точку, на что своим ответом вы пропустили правило DNS ACCEPT. В вашем случае это не имеет значения, но обычно я бы установил политику по умолчанию позже. Последнее, что вам нужно, это работать удаленно и разрешить SSH после включение запрета по умолчанию.
Кроме того, в зависимости от вашего дистрибутива вы должны иметь возможность сохранять правила брандмауэра, чтобы они автоматически применялись при запуске.
Зная все это и переделывая ваш сценарий, я бы порекомендовал вот что.
# Allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT
# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP
Добавить
iptables -A OUPUT -p udp --dport 53 -j ACCEPT
чтобы разрешить поиск в DNS.
Такой вид требований может быть лучше обработан с помощью веб-прокси и / или фильтра. Для этого можно настроить Dansgaurdian. Вам нужно будет использовать правила NAT, чтобы пропускать трафик через фильтр.
Использование iptables для фильтрации разрешит доступ к любым сайтам с соответствующих IP-адресов. Обычно это небольшая часть всей сети.
Боюсь, что iptables не работает на этом уровне, он заботится только об IP-адресе, а не об имени хоста. Если вы хотите заблокировать доступ к виртуальным хостам с другими именами на том же IP-адресе, вам нужно будет посмотреть, как вставить файлы .htaccess.
Вам необходимо настроить это на своем веб-сервере. iptables - это фильтр пакетов. HTTP-транзакции отправляют имя сайта (то есть stackoverflow) как часть полезной нагрузки TCP (т.е. не как часть заголовка TCP, который легко читает iptables).
Учитывая это, а также тот факт, что транзакции HTTP почти наверняка будут распределены по нескольким пакетам (то есть вы не можете просто сопоставить строку в заголовке HTTP), это намного лучше обрабатывается конфигурацией вашего веб-сервера или прокси-сервером. из этого.
Было бы полезно узнать причины этого, есть еще несколько альтернатив: