правила iptables, щоб дозволити трафік HTTP лише до одного домену


20

Мені потрібно налаштувати свою машину так, щоб дозволити трафік HTTP до / з сервера defaultfault.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 OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT

Я отримую цю помилку:

iptables v1.4.4: host/network `serverfault.com' not found
Try `iptables -h' or 'iptables --help' for more information.

Як ви думаєте, це пов’язано з DNS? Чи повинен я це дозволити? Або я просто ставлю в правилах IP-адреси? Як ви вважаєте, що те, що я намагаюся зробити, можна досягти більш простими правилами? Як?

Буду вдячний за будь-яку допомогу чи підказки щодо цього. Дуже дякую!


2
Не забувайте sstatic.net та інших. serverfault.com не повністю походить від serverfault.com
Zoredache

Чи можна запустити проксі в іншій системі? Це найкраще / найпростіше рішення: serverfault.com/questions/215134
mattdm

Відповіді:


29

З правилами IPTables, питання порядку. Правила додаються та застосовуються в порядку. Більше того, при додаванні правил вручну вони застосовуються негайно. Таким чином, у вашому прикладі будь-які пакети, що проходять через ланцюги INPUT та OUTPUT, починають випадати, як тільки встановлюється політика за замовчуванням. Це також, до речі, чому ви отримали повідомлення про помилку, яке ви зробили. Що таке:

  1. Застосовується політика DROP за замовчуванням
  2. IPTables отримує ім'я хоста як призначення
  3. IPTables намагається знайти DNS на "serverfault.com"
  4. Пошук DNS блокується дією DROP

Хоча параметри джерела / призначення прийматимуть імена хостів, це сильно не рекомендується. Щоб цитувати довідкову сторінку,

Імена хостів будуть вирішені лише один раз, перш ніж правило буде представлено в ядро. Зауважте, що вказати будь-яке ім’я, яке слід вирішити за допомогою віддаленого запиту, наприклад, DNS, - це дійсно погана ідея.

Сліллібрі вдарив цвяхом по голові, що його відповідь, ви пропустили правило 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

3
Прекрасна, добре продумана відповідь.
JakeRobinson

1
Я ціную це, хоча ви, мабуть, також пропустили мою помилку. На жаль
Скотт Пак

3
Насправді ви можете розміщувати ваші iptables -Pзаяви будь-де у своєму сценарії, оскільки політика ланцюга застосовується лише тоді, коли пакети "відпадають" в кінці ланцюжка. Зазвичай я ставлю заяви про політику (як правило, DROPполітики) у верхній частині моїх сценаріїв iptables.
Стівен у понеділок,

1
@Steven: Ви абсолютно праві. Здається, ОП вводить їх інтерактивно. Давайте зробимо вигляд, що ви підключені до свого хоста через SSH, і ваше перше правило стосується DROP політики. Підключення SSH буде припинено, перш ніж ви зможете вводити більше правил. Це те саме питання про терміни, якщо це інший прояв, ніж вона зіткнулася.
Скотт Пак

Спасибі. Спробував це. Але не вийшло без додавання sudo iptables -I OUTPUT 1 -o lo -j ACCEPT. Чи не слід цього додавати?
Кіран


5

Такі вимоги можуть бути краще оброблені за допомогою веб-проксі та / або фільтра. Для цього можна настроїти Dansgaurdian. Вам потрібно буде використовувати правила NAT, щоб примусити ваш трафік через фільтр.

Використання iptables для фільтрації дозволить будь-яким сайтам, доступним за відповідними IP-адресами. Зазвичай це невелика підмножина всієї мережі.


1
Повністю згоден з цим. iptablesмабуть, невірний інструмент для використання тут, оскільки він не дуже добре справляється з іменами DNS. Набагато краще підходить веб-проксі з відповідними налаштуваннями фільтра.
Стівен, понеділок,

2

Я боюся, що iptables не працює на цьому рівні, він дбає лише про IP-адресу, а не ім'я хоста. Якщо ви хочете заблокувати доступ до інших віртуальних хостів імен на тому ж ip, вам потрібно буде подивитися на введення файлів .htaccess.


Річ у тім, що коли я намагаюся правило 3, не "відкидаючи все", він добре працює з iptables!
Зенет

2
хм, я неправильно прочитав питання. Правильно, те, що відбувається на задньому плані, полягає в тому, що iptables вирішать serverfault.com до 64.34.119.12 (див. Відповідь від slillibri, щоб зрозуміти, чому рішення не працює). Однак, оскільки iptables не розуміє імен хостів і просто дозволяє ip, ви зможете підключитися до будь-якого веб-сайту цього ip, якщо у нього є кілька сайтів.
Niall Donegan

2
@Emily, це може спрацювати нормально, додавши правило, але якщо IP сервера default default.com зміниться, трафік не буде дозволений. Дозвіл на сайт, наприклад google.com, який має сотні адрес, які часто змінюються, взагалі не працюватиме.
Зоредаче

1

Вам потрібно налаштувати це на своєму веб-сервері. iptables - фільтр пакетів. HTTP-транзакції надсилають ім’я сайту (тобто stackoverflow) як частину корисного навантаження TCP (тобто не як частина заголовка TCP, який iptables читає легко).

Враховуючи це, і той факт, що транзакції HTTP майже напевно будуть поширюватися на декілька пакетів (тобто ви не можете просто зіставити рядок у заголовку HTTP), це набагато краще обробляється вашою конфігурацією веб-сервера або проксі-сервером спереду. з неї.

Було б корисно знати міркування, що стоять за цим, є кілька інших альтернатив:

  1. Перенаправляйте на правильну URL-адресу, якщо вони вводять неправильну URL-адресу (наприклад, перенаправлення на stackoverflow.com, якщо вони вводять www.stackoverflow.com)
  2. Скажіть своєму веб-серверу, щоб він не обслуговував хостів, окрім stackoverflow.com
  3. Розмістіть сайт на окремому IP-адресі, на який більше нічого не вирішено, і лише змусьте ваш веб-сервер слухати це.

Привіт Філе, я не впевнений, що я розумію, що таке веб-сервер? У мене немає веб-сервера. Я роблю цю конфігурацію на своєму комп’ютері.
Зенет
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.