Мне нужно настроить мой компьютер так, чтобы он разрешал только 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 ACCEPT. В вашем случае это не имеет значения, но обычно я бы установил политику по умолчанию позже в процессе. Последнее, что вам нужно - это работать удаленно и разрешить SSH после включения запрета по умолчанию.
Кроме того, в зависимости от вашего дистрибутива вы сможете сохранить правила брандмауэра, чтобы они автоматически применялись во время запуска.
Зная все это и переставляя ваш сценарий, вот что я бы порекомендовал.
источник
iptables -P
операторы в любом месте вашего скрипта, так как политики цепочки применяются только тогда, когда пакеты «падают» с конца цепочки. Обычно я помещаю утверждения политики (обычноDROP
политики) в начало моих сценариев iptables.sudo iptables -I OUTPUT 1 -o lo -j ACCEPT
. Разве это не должно быть добавлено?Добавлять
разрешить поиск DNS.
источник
Этот вид требования может быть лучше обработан с помощью веб-прокси и / или фильтра. Dansgaurdian может быть настроен для этого. Вам нужно будет использовать правила NAT, чтобы заставить ваш трафик через фильтр.
Использование iptables для фильтрации разрешит доступ к любым сайтам с соответствующих IP-адресов. Обычно это небольшое подмножество всей сети.
источник
iptables
это, вероятно, неправильный инструмент для использования здесь, так как он не очень хорошо работает с DNS-именами. Веб-прокси с соответствующими настройками фильтра подходит гораздо лучше.Боюсь, что iptables не работает на этом уровне, его интересует только IP-адрес, а не имя хоста. Если вы хотите заблокировать доступ к другим виртуальным хостам с тем же IP-адресом, вам нужно посмотреть на размещение файлов .htaccess.
источник
Вы должны настроить это на своем веб-сервере. iptables - это фильтр пакетов. HTTP-транзакции отправляют имя сайта (т. Е. Stackoverflow) как часть полезной нагрузки TCP (т. Е. Не как часть заголовка TCP, который легко читается iptables).
Учитывая это, и тот факт, что HTTP-транзакции почти наверняка будут распределены по нескольким пакетам (то есть вы не можете просто сопоставить строку в заголовке HTTP), это гораздо лучше обрабатывается конфигурацией вашего веб-сервера или прокси-сервером впереди. этого
Было бы полезно узнать причину этого, есть несколько других альтернатив:
источник