Налаштувати деякі порти брандмауера, щоб вони приймали лише з'єднання з локальною мережею?


18

Як встановити брандмауер в системі в локальній мережі, щоб деякі порти були відкриті лише для з'єднань з локальної мережі, а не від зовнішнього світу?

Наприклад, у мене є ящик із запуском Scientific Linux 6.1 (дистрибутив, заснований на RHEL), і я хочу, щоб його SSH-сервер приймав з'єднання лише з localhost або LAN. Як це зробити?

Відповіді:


24

Якщо iptables ядра повністю порожні ( iptables -F), це зробить те, що ви запитаєте:

# iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP

Це говорить про те, що всім локальним адресам дозволено спілкуватися з портом TCP 22, що localhost отримує однаковий розгляд (так, 127. * не просто 127.0.0.1), а пакети з кожної іншої адреси, що не відповідають цим першим двом правилам, безцеремонно потрапляють у трохи відро . Ви можете використовувати REJECTзамість, DROPякщо ви хочете активне відхилення (TCP RST), а не зробити порт TCP 22 чорною дірою для пакетів.

Якщо ваша локальна мережа не використовує блок 192.168.0. *, Вам, природно, потрібно змінити IP-адресу та маскувати в першому рядку, щоб відповідати IP-схемі вашої локальної мережі.

Ці команди можуть не робити те, що ви хочете, якщо у вашому брандмауері вже налаштовано деякі правила. (Скажіть, iptables -Lяк root, щоб дізнатися.) Що часто трапляється, це те, що одне з існуючих правил захоплює пакети, які ви намагаєтесь відфільтрувати, так що додавання нових правил не впливає. У той час як ви можете використовувати -Iзамість -Aз iptablesкомандою зрощувати нові правила в середину ланцюжка , а не додаючи їх, як правило , краще , щоб дізнатися, як ланцюга отримують заселена при завантаженні системи і змінювати цей процес , так що ваші нові правила завжди отримати встановлені в правильний порядок.

RHEL 7+

В останніх системах типу RHEL найкращий спосіб зробити це використовувати firewall-cmdабо його еквівалент GUI. Це говорить firewalldдемону ОС, що ви хочете, а що насправді заповнює та маніпулює тим, що ви бачите через iptables -L.

RHEL 6 і раніше

У старих системах типу RHEL найпростіший спосіб зміни ланцюгів брандмауера під час замовлення питань - це редагування /etc/sysconfig/iptables. Інструменти брандмауера GUI та TUI брандмауера досить спрощені, тому щойно ви почнете додавати такі складні правила, як це, краще повернутися до старих хороших конфігураційних файлів. Остерігайтеся, як тільки ви почнете це робити, ви ризикуєте втратити свої зміни, якщо ви коли-небудь використовувати засоби брандмауера ОС для зміни конфігурації, оскільки він може не знати, як поводитися з такими правилами ручної роботи.

Додайте щось подібне до цього файлу:

-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -j DROP

Куди ви додасте, це складний біт. Якщо ви знайдете рядок у цьому файлі, про який йдеться --dport 22, просто замініть його на три рядки вище. В іншому випадку він, ймовірно, повинен пройти до першого існуючого рядка, який закінчується -j ACCEPT. Як правило, вам потрібно буде ознайомитись із тим, як працює iptables , і тоді правильна точка вставки стане очевидною.

Збережіть цей файл, а потім скажіть, service iptables restartщоб перезавантажити правила брандмауера. Не забудьте зробити це під час входу в консоль, на випадок, якщо ви будете товсто пальцем редагувати! Ви не хочете заблокувати себе з машини під час входу через SSH.

Подібність до команд, наведених вище, не випадково. Більшість цього файлу складається з аргументів iptablesкоманди. Відмінності щодо вищезазначеного полягають у тому, що iptablesкоманда скидається, а INPUTназва ланцюга стає спеціальним RH-Firewall-1-INPUTланцюгом, характерним для RHEL . (Якщо ви хочете докладніше вивчити файл, ви побачите раніше у файлі, де вони перейменовані в INPUTланцюжок. Чому? Не можу сказати.)


4

Інструмент низького рівня для налаштування брандмауера під Linux - це iptables . Також доступні інструменти вищого рівня. Я не знаю, чи є у Science Linux рекомендований інструмент брандмауера.

Згідно з цією веб-сторінкою (я не підтвердив, що вона стосується 6.1), service iptables saveбуде збережено поточні правила брандмауера, і ці збережені правила завантажуються під час завантаження. Отже, вам потрібно встановити потрібні правила за допомогою iptablesкоманд (або будь-яким іншим способом), а потім запустити, service iptables saveщоб налаштування стало стійким.

Повідомлення в блозі Скотта Пак - це початок для відмови від пакетів "дивних кульок", які зазвичай не потрібні та мають високий ризик бути частиною нападу. Крім того, ви захочете закрити всі вхідні порти та відкривати лише ті, що вам потрібні. Щось на зразок цього:

# Accept everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# Accept ICMP
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
# Drop oddball packets
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Accept packets that are part of established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept selected incoming connections, e.g. ssh from 10.0.42.x
iptables -A INPUT -p tcp --dport 22 -s 10.0.42.0/24 -j ACCEPT
# Reject incoming connections that aren't explicitly accepted
iptables -A INPUT -j REJECT

1
Жилле, ти трохи не перечитав питання? Я розумію, що вікно Scientific Linux - це один з комп'ютерів в локальній мережі, але не брандмауер.
rozcietrzewiacz

@Gilles Так, вікно є одним з комп'ютерів у локальній мережі.
hpy

@rozcietrzewiacz Я розумію, що брандмауер працює на тій же машині, що і сервер. Я згоден, що питання певною мірою неоднозначне, але оскільки penyuan згадав лише про ОС однієї машини, я припускаю, що все відбувається на цій машині. Інакше це не буде питанням unix, це було б не вказаним адміністратором мережевого питання.
Жил "ТАК - перестань бути злим"

1

Кращий спосіб зробити це за допомогою iptables. Схоже, це було достатньо охоплено іншими, тому для повноти я зазначу альтернативний метод контролю доступу, який доступний для багатьох демонів у більшості дистрибутивів Linux. Цей метод контролю доступу надається libwrapбібліотекою.

Щоб перевірити, чи підтримує ваш улюблений демон libwrap, спробуйте виконати наступне:

ldd `which sshd` | grep libwrap

Якщо ви отримаєте не порожній результат, наприклад

libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f84e7b0e000)

тоді вам точно подобається їхати.

Це майже впевненість, що ваш sshdдемон має libwrapпідтримку, і тому він повинен проконсультуватися з файлами /etc/hosts.allowта /etc/hosts.denyфайлами для контролю доступу. Припустимо, що ваша локальна мережа локальної мережі є 192.168.100.0/24, ви можете заборонити доступ sshdусім клієнтам, окрім тих, що знаходяться на локальному хості або локальній локальній мережі, додавши у свій /etc/hosts.denyфайл наступне :

sshd: ALL EXCEPT 127.0.0.0/255.0.0.0, [::1]/128, 192.168.100.0/255.255.255.0

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

Щоб отримати докладніші відомості, ознайомтеся зі сторінками, починаючи з hosts_access(5).


1

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

Для додаткової безпеки вище, ви можете використовувати окрему підмережу для підключення до локальної мережі. Для цього до кожного комп'ютера додайте другу IP-адресу, яка використовувалася б лише в локальній мережі, а не маршрутизатором. Скажімо, вся мережа зараз використовує 192.168.0.xxxадреси, а маршрутизатор (шлюз, брандмауер) є 192.168.0.1. Тому додайте другу адресу для кожного комп'ютера - наприклад:

ifconfig eth0:0 192.168.5.1/24

Далі відредагуйте sshdконфігурацію, щоб використовувати лише цю адресу (щоб вона не дозволяла з'єднанням 192.168.0.xxx) - відредагуйте /etc/ssh/sshd_configта змініть ListenAddressодну із вашої нової підмережі ( 192.168.5.1у наведеному вище прикладі). Це воно! Якщо ви не налаштовуєте шлюз для маршрутизації зв'язку цієї підмережі, він повинен бути відокремлений зовні.

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