В загальному:
Для перегляду та зміни конфігурації брандмауера потрібні права адміністратора ( root
), як і послуги відкриття в обмеженому діапазоні номерів портів. Це означає, що вам слід або ввійти в систему як root
або альтернативно використовувати sudo
для запуску команди як root. Я спробую позначити такі команди додатковими [sudo]
.
Зміст:
- Питання порядку чи різниця між
-I
та-A
- Показати поточну конфігурацію брандмауера
- Інтерпретація результату
iptables -L -v -n
- Знайте своє оточення
- Ланцюги INPUT і FORWARD
- Модулі ядра
1. Порядок питань або різниця між -I
і-A
Що потрібно пам’ятати, це те, що правила брандмауера перевіряються в порядку, в якому вони перераховані. Ядро зупинить обробку ланцюга, коли буде запущено правило, яке дозволить або заборонить пакет або з'єднання.
Я думаю, що найпоширенішою помилкою для початківців адміністраторів брандмауера є те, що вони дотримуються правильних вказівок, щоб відкрити новий порт, наприклад, наведений нижче:
[sudo] iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
а потім виявіть, що це не набуде чинності.
Причиною цього є те, що -A
опція додає це нове правило, після всіх існуючих правил,
і оскільки дуже часто остаточне правило в існуючому брандмауері було тим, яке блокує весь трафік, який не дозволяється явно, в результаті чого
...
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
8 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
Або еквівалент в iptables-save:
...
iptables -A INPUT -j REJECT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
і нове правило, що відкриває TCP-порт 8080, ніколи не буде досягнуто. (про що свідчать лічильники, що вперто залишаються при 0 пакетах і нульових байтах).
Вставивши правило з -I
новим правилом, було б першим у ланцюжку і буде працювати.
2. Показати поточну конфігурацію брандмауера
Моя рекомендація адміністратору брандмауера полягає в тому, щоб переглянути фактичну конфігурацію ядра Linux, а не намагатися діагностувати проблеми з брандмауером із зручних для користувача інструментів. Часто розуміючи основні проблеми, ви можете їх легко вирішити в питанні, підтримуваному цими інструментами.
Команда [sudo] iptables -L -v -n
- твій друг (хоча деякі люди люблять iptables-save
краще). Часто при обговоренні конфігурацій корисно використовувати --line-numbers
параметр, а також нумерувати рядки. Посилання на правило #X полегшує їх обговорення.
Примітка: правила NAT включаються у iptables-save
висновок, але повинні бути перераховані окремо, додавши -t nat
опцію, тобто [sudo] iptables -L -v -n -t nat --line-numbers
.
Запуск команди кілька разів і перевірка збільшення лічильників може бути корисним інструментом, щоб дізнатися, чи дійсно нове правило спрацьовує.
[root@host ~]# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 784K 65M fail2ban-SSH tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 2789K 866M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 15 1384 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 25 packets, 1634 bytes)
num pkts bytes target prot opt in out source destination
Chain fail2ban-SSH (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 117.239.37.150 0.0.0.0/0 reject-with icmp-port-unreachable
2 4 412 REJECT all -- * * 117.253.208.237 0.0.0.0/0 reject-with icmp-port-unreachable
Альтернативно, вихід iptables-save
дає сценарій, який може відновити вищевказану конфігурацію брандмауера:
[root@host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A fail2ban-SSH -s 117.239.37.150/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 117.253.208.237/32 -j REJECT --reject-with icmp-port-unreachable
COMMIT
Це питання переваги того, що вам буде легше зрозуміти.
3. Інтерпретація результату iptables -L -v -n
Політика встановлює дію за замовчуванням в ланцюзі використання , коли немає чітких правил сірників. У INPUT
ланцюжку, яка встановлена НА ПРИЙМАНИЙ весь трафік.
Перше правило в ланцюзі INPUT одразу є цікавим, воно надсилає весь трафік (джерело 0.0.0.0/0 та призначення 0.0.0.0/0), призначений для порту 22 TCP ( tcp dpt:22
) порт за замовчуванням для SSH, на спеціальну ціль ( fail2ban-SSH
) . Як зазначає ім'я, це правило підтримується fail2ban (продукт безпеки, який серед іншого сканує файли системного журналу на предмет можливих зловживань і блокує IP-адресу порушника).
Це правило було б створене командним рядком iptables, подібним iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
або знайденому у висновку iptables-save as -A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
. Часто ви знайдете будь-яке з цих позначень у документації.
Лічильники вказують, що це правило збігало 784 000 пакетів і 65 мегабайт даних.
Трафік, який відповідає цьому першому правилу, потім обробляється fail2ban-SSH
ланцюжком, який як нестандартний ланцюг потрапляє до списку нижче вихідного ланцюга.
Цей ланцюг складається з двох правил, по одному для кожного кривдника (джерела ip-адреси 117.253.221.166 або 58.218.211.166), яке заблоковано (з а reject-with icm-port-unreachable
).
-A fail2ban-SSH -s 117.253.221.166/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 58.218.211.166/32 -j REJECT --reject-with icmp-port-unreachable
Пакети SSH, які не є з цих заблокованих хостів, ще не дозволені і не заборонені, і тепер, коли власна ланцюжок завершена, буде перевірено відповідність другому правилу ланцюга INPUT.
Усі пакети, яким не призначено порт 22, пройшли перше правило в ланцюзі INPUT, а також будуть оцінені в правилі № 2 INPUT.
Правило INPUT №2 передбачає, що це призначений для стану брандмауера , який відстежує з'єднання. Це має деякі переваги, лише пакети для нових з'єднань потрібно перевіряти на повний набір правил, але як тільки дозволені додаткові пакети, що належать до встановленого або пов'язаного з'єднання, приймаються без додаткової перевірки.
Правило введення №2 відповідає всім відкритим і пов'язаним з'єднанням і пакетам, що відповідають цьому правилу, не потрібно додатково оцінювати.
Примітка: зміни правил у конфігурації стаціонарного брандмауера вплинуть лише на нові з'єднання, а не на встановлені з'єднання.
На відміну від цього, простий фільтр пакетів перевіряє кожен пакет проти повного набору правил, не відстежуючи стан з'єднання. У такому брандмауері не використовуються ключові слова штату .
Правило INPUT №3 є досить нудним, lo
дозволений весь трафік, що підключається до інтерфейсу петлі ( або 127.0.0.1).
Правила INPUT 4, 5 і 6 використовуються для відкриття портів TCP 22, 80 і 443 (порту за замовчуванням для відповідних SSH, HTTP і HTTPS) шляхом надання доступу до НОВИХ з'єднань (існуючі з'єднання вже дозволені правилом INPUT 2).
У брандмауері без громадянства ці правила з’являться без атрибутів держави:
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
або
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
Остаточне правило INPUT, # 7 - це правило, яке блокує весь трафік, якому НЕ було надано доступ у правилах INPUT 1-7. Досить поширена умова: все, що не допускається, заперечується. Теоретично це правило можна було б опустити, встановивши ПОЛІТИКУ за замовчуванням на ОТМЕНИТИ.
Завжди досліджуйте весь ланцюжок.
4. Знайте своє оточення
4.1. Налаштування програмного брандмауера не впливатимуть на налаштування безпеки, що підтримуються в інших місцях мережі, тобто, незважаючи на відкриття мережевої служби з iptables
незміненими списками контролю доступу на маршрутизаторах або інших брандмауерах у вашій мережі, все ще може блокувати трафік ...
4.2. Якщо жодна служба не прослуховує, ви не зможете підключитися та отримати помилку відмови в з'єднанні , незалежно від налаштувань брандмауера. Тому:
- Переконайтесь, що служба слухає (за правильним мережевим інтерфейсом / ip-адресою) та використовуючи номери портів, які ви очікуєте при
[sudo] netstat -plnut
використанні або альтернативно ss -tnlp
.
- Якщо ваші послуги ще не працюють, емулюйте простого слухача, наприклад, netcat:
[sudo] nc -l -p 123
або openssl s_server -accept 1234 [options]
якщо вам потрібен слухач TLS / SSL (перевірте man s_server
параметри).
- Переконайтеся, що ви можете підключитися із самого сервера, тобто
telnet <IP of Server> 123
або echo "Hello" | nc <IP of Server> 123
або під час тестування послуги openssl s_client -connect <IP of Server>:1234
, захищеної TLS / SSL , перш ніж спробувати те саме з віддаленого хоста.
4.3. Зрозумійте протоколи, якими користуються ваші служби. Ви не можете належним чином увімкнути / відключити послуги, які ви недостатньо розумієте. Наприклад:
- використовується TCP або UDP або обидва (як у DNS)?
- чи послуга використовує фіксований порт за замовчуванням (наприклад, щось на зразок TCP-порту 80 для веб-сервера)?
- або ж вибрано динамічний номер порту, який може змінюватись (тобто послуги RPC, як класичні NFS, які реєструються в Portmap)?
- сумнозвісний FTP навіть використовує два порти , як фіксований, так і динамічний номер порту, налаштований на пасивний режим ...
- опис послуги, порту та протоколу
/etc/services
не обов'язково збігається з фактичною послугою, що використовує порт.
4.4. Фільтр пакетів ядра - це не єдине, що може обмежувати підключення до мережі:
- SELinux також може обмежувати мережеві послуги.
getenforce
підтвердить, чи працює SELinux.
- Хоча дещо незрозумілі TCP обгортки все ще є потужним інструментом забезпечення мережевої безпеки. Зверніться
ldd /path/to/service |grep libwrap
до /hosts.[allow|deny]
файлів і керуйте ними.
5. INPUT
або FORWARD
Ланцюги
Поняття ланцюгів більш докладно пояснено тут, але його короткий:
INPUT
Ланцюг , де ви відкриваєте і / або закрити мережеві порти для служб працюють локально, на машині , де ви видаєте команди Iptables.
У FORWARD
ланцюзі ви застосовуєте правила для фільтрування трафіку, який ядро пересилає до інших систем, фактичних систем, а також контейнерів Docker та серверів віртуальних гостьових серверів, коли ваша машина Linux працює як міст, маршрутизатор, гіпервізор та / або робить мережеву адресу переклад та переадресація портів.
Поширене неправильне уявлення про те, що оскільки контейнер докера або гость KVM працює локально, правила фільтра, що застосовуються, повинні бути у ланцюзі INPUT, але це зазвичай не так.
6. Модулі ядра
Оскільки фільтр пакетів працює в межах ядра Linux, він також може бути складений як динамічний модуль, фактично декілька модулів. Більшість дистрибутивів включають netfilter як модулі, а необхідні модулі netfilter завантажуватимуться в ядро за потребою, але для деяких модулів адміністратору брандмауера потрібно буде вручну переконатися, що вони завантажуються. В першу чергу це стосується модулів відстеження підключення, таких, nf_conntrack_ftp
якими можна завантажувати insmod
.
Модулі, що зараз завантажуються в запущене ядро, можуть відображатися за допомогою lsmod
.
Спосіб забезпечення постійного завантаження модулів через перезавантаження залежить від дистрибутива Linux.