Лабораторна робота 8: iptables¶
Цілі¶
Виконавши цю лабораторну роботу, ви зможете
- налаштовувати основні правила IP-фільтра
- налаштовувати IP-переадресацію
Приблизний час виконання цієї лабораторної роботи: 60 хвилин
Я завжди використовую iptables на своїх пристроях Linux. Подивіться – навіть якщо ви не хочете, щоб хакери потрапили на вулицю, ви можете блокувати такі рекламні сайти, як* doubleclick.com та інші злі виродки. Або, можливо, ви хочете зробити трохи більше журналу? …Iptables вас врятує!
-- George W.Bush
iptables¶
iptables — це інструмент, який використовується для керування фільтрацією пакетів IPv4 та підсистемою NAT ядра Linux. Підсистема відома як netfilter.
Утиліта командного рядка iptables надає інструменти інтерфейсу (користувацького середовища) для керування цією підсистемою. Вона використовується для налаштування, підтримки та перевірки таблиць правил фільтрації IP-пакетів у ядрі. Можна визначити кілька різних таблиць.
Деякі поширені терміни, що використовуються в обговореннях iptables, описані нижче:
TABLES (ТАБЛИЦІ)¶
У більшості ядер Linux визначено три незалежні таблиці. Таблиці в будь-який час залежать від параметрів конфігурації ядра та наявних модулів. Існують наступні таблиці:
-
filter: Це основна таблиця та таблиця за замовчуванням (якщо параметр -t не передано). Він містить вбудовані ланцюжки:
-
INPUT (для пакетів, що надходять у саму коробку)
- FORWARD (для пакетів, що маршрутизуються через коробку)
-
OUTPUT (для локально згенерованих пакетів).
-
nat: До цієї таблиці звертаються, коли зустрічається пакет, який створює нове з’єднання. Він складається з наступних трьох вбудованих ланцюжків:
-
PREROUTING (для зміни пакетів одразу після їх надходження)
- OUTPUT (для зміни локально згенерованих пакетів перед маршрутизацією)
-
POSTROUTING (за зміну пакетів перед їх відправкою)
-
mangle: Ця таблиця використовується для спеціалізованої зміни пакетів. Вона має наступні 5 вбудованих ланцюгів:
-
PREROUTING (для зміни вхідних пакетів перед маршрутизацією)
- OUTPUT (для зміни локально згенерованих пакетів перед маршрутизацією)
- INPUT (для пакетів, що надходять у саму коробку)
- FORWARD (для зміни пакетів, що маршрутизуються через приставку)
- POSTROUTING (за зміну пакетів перед їх відправкою)
CHAINS (ЛАНЦЮГИ)¶
Ланцюжок — це список правил, які можуть відповідати набору пакетів. Кожне правило визначає, що робити з пакетом, який співпадає. Кожна таблиця містить ряд вбудованих ланцюжків, а також може містити визначені користувачем ланцюжки.
TARGETS (ЦІЛІ)¶
Правило брандмауера визначає критерії для пакета та цілі. Якщо пакет не збігається, перевіряється наступне правило в ланцюжку; якщо воно збігається, то наступне правило вказується значенням цілі, яке може бути назвою визначеного користувачем ланцюжка або одним із спеціальних значень ACCEPT, DROP, QUEUE або RETURN.
Usage: iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
Commands:
Either long or short options are allowed.
--append -A chain Append to chain
--check -C chain Check for the existence of a rule
--delete -D chain Delete matching rule from chain
--delete -D chain rulenum
Delete rule rulenum (1 = first) from chain
--insert -I chain [rulenum]
Insert in chain as rulenum (default 1=first)
--replace -R chain rulenum
Replace rule rulenum (1 = first) in chain
--list -L [chain [rulenum]]
List the rules in a chain or all chains
--list-rules -S [chain [rulenum]]
Print the rules in a chain or all chains
--flush -F [chain] Delete all rules in chain or all chains
--zero -Z [chain [rulenum]]
Zero counters in chain or all chains
--new -N chain Create a new user-defined chain
--delete-chain
-X [chain] Delete a user-defined chain
--policy -P chain target
Change policy on chain to target
--rename-chain
-E old-chain new-chain
Change chain name, (moving any references)
Options:
--ipv4 -4 Nothing (line is ignored by ip6tables-restore)
--ipv6 -6 Error (line is ignored by iptables-restore)
[!] --protocol -p proto protocol: by number or name, eg. `tcp'
[!] --source -s address[/mask][...]
source specification
[!] --destination -d address[/mask][...]
destination specification
[!] --in-interface -i input name[+]
network interface name ([+] for wildcard)
--jump -j target
target for rule (may load target extension)
--goto -g chain
jump to chain with no return
--match -m match
extended match (may load extension)
--numeric -n numeric output of addresses and ports
[!] --out-interface -o output name[+]
network interface name ([+] for wildcard)
--table -t table table to manipulate (default: `filter')
--verbose -v verbose mode
--wait -w [seconds] maximum wait to acquire xtables lock before give up
--line-numbers print line numbers when listing
--exact -x expand numbers (display exact values)
[!] --fragment -f match second or further fragments only
--modprobe=<command> try to insert modules using this command
--set-counters -c PKTS BYTES set the counter during insert/append
[!] --version -V print package version.
Завдання 1¶
Основи iptables
Ця вправа навчить вас деяким основам iptables. Зокрема, ви дізнаєтеся, як переглядати або переглядати правила iptables, створювати основні правила фільтрації, видаляти правила, створювати/видаляти користувацькі ланцюжки тощо.
Без зайвих слів, давайте одразу перейдемо до використання iptables.
Щоб переглянути діючі правила¶
-
Увійшовши як суперкористувач, перегляньте всі правила в таблиці фільтрів. Впишіть:
[root@serverXY root]# iptables -L -
Щоб переглянути більш докладний вихід, введіть:
[root@serverXY root]# iptables -L -v -
Відобразити лише правила в ланцюжку INPUT. Впишіть:
[root@serverXY root]# iptables -v -L INPUT -
Покажіть усі правила під таблицею. Впишіть:
[root@serverXY root]# iptables -L -t mangle -
Відобразіть усі правила під таблицею nat. Впишіть:
[root@serverXY root]# iptables -L -t nat
Щоб очистити всі поточні правила¶
-
Очистіть (або видаліть) усі правила, які «можливо» зараз завантажено. Впишіть:
[root@serverXY root]# iptables --flush
Для створення власних ланцюжків¶
-
Створіть свій власний ланцюжок і назвіть його «mychain». Впишіть:
[root@serverXY root]# iptables -N mychain -
Перелічіть правила під створеним вище ланцюжком. Впишіть:
[root@serverXY root]# iptables -L mychain Chain mychain (0 references) target prot opt source destination
Щоб видалити ланцюжки¶
-
Спочатку спробуйте видалити вбудований ланцюжок INPUT. Впишіть:
[root@serverXY root]# iptables -X INPUT
!!! question
Яким був ваш результат?
-
Далі спробуйте видалити ланцюжок, який ви створили вище. Впишіть:
[root@serverXY root]# iptables -X mychain -
Спробуйте знову перерахувати правила в ланцюжку, який ви щойно видалили. Впишіть:
[root@serverXY root]# iptables -L mychain
Завдання 2¶
Основна фільтрація пакетів
Ця вправа навчить вас створювати дещо складніші правила фільтрації пакетів. Зокрема, ви заблокуєте всі типи пакетів ICMP у своїй партнерській системі.
Щоб фільтрувати типи пакетів icmp¶
-
Перш ніж почати, переконайтеся, що ви можете пінгувати вашу партнерську систему і що ваша партнерська система може надто успішно пінгувати вас. Впишіть:
[root@serverXY root]# ping -c 2 serverPR <SNIP> --- serverPR ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1005ms ............................................... -
Очистіть усі існуючі правила. Впишіть:
[root@serverXY root]# iptables -F -
Створіть правило, щоб заборонити всі вихідні пакети типу icmp до будь-якого пункту призначення. Впишіть:
[root@serverXY root]# iptables -A OUTPUT -o eth0 -p icmp -j DROP
Простими словами, попередню команду можна інтерпретувати як: «Додати правило до ланцюжка OUTPUT у таблиці фільтрів». Дозвольте цьому правилу відкидати кожен пакет типу ICMP, який проходить через інтерфейс eth0
-
Перевірте дію свого правила, спробувавши перевірити serverPR. Впишіть:
[root@serverXY root]# ping -c 2 serverPR PING serverPR (10.0.5.8) 56(84) bytes of data. ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted -
Перегляньте щойно створене правило. Впишіть:
[root@serverXY root]# iptables -vL OUTPUT Chain OUTPUT (policy ACCEPT 21221 packets, 2742K bytes) pkts bytes target prot opt in out source destination 93 7812 DROP icmp -- any eth0 anywhere anywhere -
Очистіть усі правила та повторіть команду ping з обох систем.
!!! question
Успіх чи невдача?
-
Тепер створіть ще одне правило, яке видалятиме пакети icmp, які надходять із певної небажаної IP-адреси (наприклад, 172.16.0.44). Впишіть:
[root@serverXY root]# iptables -A INPUT -i eth0 -p icmp --source 172.16.0.44 -j DROP
Ви б прочитали наведену вище команду простою мовою так: «Додати правило до ланцюжка INPUT у таблиці фільтрів». Нехай це правило відкидає всі пакети типу ICMP та має адресу джерела 172.16.0.44”
-
Щоб перевірити дію цього правила, ви можете попросити когось іншого у вашій лабораторії [кому не було призначено IP-адресу 172.16.0.44] спробувати перевірити вас. Успіх чи невдача?
-
Замість того, щоб скидати всі правила у ваших таблицях. Видаліть лише правило, яке ви створили вище. Для цього потрібно знати номер правила. Щоб дізнатися тип номера правила:
[root@serverXY root]# iptables -vL INPUT --line-numbers Chain INPUT (policy ACCEPT 31287 packets, 9103K bytes) num pkts bytes target prot opt in out source destination 1 486 40824 DROP icmp -- eth0 any serverPR anywhere
Стовпець, що містить номер правила, було виділено у зразку вихідних даних вище.
-
Використовуючи номер рядка, який відповідає правилу, яке потрібно видалити, ви можете видалити певне правило (рядок номер 1) у ланцюжку INPUT, виконавши:
[root@serverXY root]# iptables -D INPUT 1
Для фільтрації інших видів трафіку¶
У цій вправі ви дізнаєтесь, як фільтрувати трафік типу tcp.
Популярний протокол ftp є службою на основі TCP. Це означає, що він транспортується через пакети типу TCP.
У наступних кроках ми досліджуємо націлювання та фільтрування трафіку типу FTP, що надходить із заданої IP-адреси.
-
Запустіть ftp-сервер, який ви налаштували та ввімкнули в одній із попередніх лабораторних робіт. Впишіть:
[root@serverXY root]# *service vsftpd restart* Shutting down vsftpd: [ OK ] Starting vsftpd for vsftpd: [ OK ] -
Попросіть свого партнера спробувати увійти на ваш ftp-сервер як анонімний користувач. Переконайтеся, що ваш партнер може успішно увійти з serverPR — зробіть це перед тим, як перейти до наступного кроку.
-
Поки ваш партнер ще ввійшов у систему, створіть правило, щоб вимкнути весь трафік типу ftp, що надходить із serverPR. Впишіть:
[root@serverXY root]# iptables -A INPUT -i eth0 -s 172.16.0.z -p tcp --dport 21 -j DROP*
Простіше кажучи, вищезгадане правило/команда перекладається як: Додати правило до ланцюжка INPUT у таблиці фільтрів. Нехай це правило ВІДКИДАЄ всі пакети з адресою джерела 172.16.0.z, призначені для порту 21 на нашій локальній системі.
-
Щойно ви виконаєте наведену вище команду, стек netfilter негайно введе її в дію. Щоб переконатися в цьому, попросіть свого партнера спробувати будь-які ftp-команди, залишаючись увімкненим на ваш ftp-сервер, наприклад,
ls. Успіх чи невдача?!!! question "Лабораторні завдання:"
``` Успіх чи невдача? Якщо це не вдасться, попросіть свого партнера спробувати відключитися та спробувати увійти знову з нуля, а потім перевірте, чи все вийде. ``` -
Попросіть іншу особу, яка НЕ є вашим партнером, спробувати анонімно увійти на ваш ftp-сервер. Ви також можете попросити когось із hq.example.org спробувати підключитися до вашого ftp-сайту.
!!! question
Успіх чи невдача?
-
Увімкніть і запустіть веб-сервер на serverXY.
-
Переконайтеся, що інші люди можуть відвідувати ваш веб-сайт за допомогою браузера. Створіть правило для блокування трафіку http від hq.example.org до вашої локальної машини.
Завдання 3¶
Базове пересилання пакетів
У цій вправі ви дізнаєтеся, як налаштувати базове правило пересилання пакетів.
Правило, яке ви налаштували, дозволить вашій системі слугувати маршрутизатором для вашої партнерської системи.
Ваша система направлятиме весь трафік, що надходить із системи вашого партнера, до Інтернету або до вашого власного шлюзу за замовчуванням. Це те, що відомо як IP-маскарадування або NAT (трансляція мережевих адрес).
Якщо бути педантичним, то маскування IP-адреси та NAT-інг насправді є дещо різними звірами і зазвичай використовуються для досягнення різних цілей. Ми не будемо надто зупинятися на конкретних відмінностях у наступних вправах.
Ця вправа передбачає наступне, тому, будь ласка, внесіть зміни відповідно до ваших конкретних налаштувань:
ServerXY
i. У вашій системі є дві мережеві карти - eth0 і eth1.
ii. Перший інтерфейс eth0 буде розглядатися як зовнішній інтерфейс (або вихід в Інтернет)
iii. Другий інтерфейс eth1 буде розглядатися як внутрішній інтерфейс (або звернений до локальної мережі)
iv. Інтерфейс eth0 має IP-адресу 172.16.0.z
v. Інтерфейс eth1 має IP-адресу 10.0.0.z з маскою мережі 255.0.0.0
vi. Що ви успішно пройшли «Лабораторну роботу 2» і зрозуміли основні концепції в ній.
ServerPR
Про систему вашого партнера зроблено наступні припущення.
i. Він має лише одну мережеву карту - eth0
ii. eth0 має IP-адресу - 10.0.0.y з маскою мережі 255.0.0.0
iii. Маршрутизатор або шлюз за замовчуванням для serverPR — 10.0.0.z (тобто IP-адреса для eth1 serverXY)
iv. Що ви успішно пройшли «Лабораторну роботу 2» і зрозуміли основні концепції в ній.
Підключіть мережу так, щоб вона виглядала так, як показано нижче:
Наші звичайні піктограми для serverXY та serverPR було замінено вище на піктограми маршрутизатора.
Щоб створити правило переадресації¶
-
Переконайтеся, що ваша мережа фізично підключена так само, як показано на малюнку вище.
-
Призначте всім інтерфейсам відповідні параметри IP-адреси, маски мережі та шлюзу.
-
Очистіть усі правила iptables, які ви зараз завантажили.
!!! note
Очищення таблиць не завжди є необхідним або обов'язковим. Ви могли помітити, що на початку деяких виконаних досі вправ ми вказали, що потрібно очищати існуючі таблиці. Це для того, щоб ви почали з чистого аркуша і щоб у вас не було жодних помилкових правил, прихованих десь у ваших таблицях, які можуть призвести до неправильної роботи. Зазвичай одночасно можуть бути завантажені сотні правил, що виконують різні функції.
-
Попросіть свого партнера з serverPR спробувати ping-нути 172.16.0.100 (hq.example.org). Це має не спрацювати, оскільки ви тепер є шлюзом за замовчуванням для serverPR, і ви ще не ввімкнули маршрутизацію у своїй системі.
-
Як root на serverXY тип:
[root@serverXY root]# *iptables --table nat -A POSTROUTING -o eth0 -j MASQUERADE* -
Тепер знову повторіть крок 4.
!!! question
Чи вам вдалося?
-
Вищезазначене повинно було вийти з ладу. Вам також потрібно ввімкнути пересилання пакетів у запущеному ядрі. Впишіть:
[root@serverXY root]# *echo 1 > /proc/sys/net/ipv4/ip_forward* -
Щоб зробити вказані вище зміни в ядрі постійними між перезавантаженнями, створіть запис нижче у вашому файлі “/etc/sysctl.conf”:
net.ipv4.ip_forward = 0
Щоб зберегти правила iptables¶
Досі всі правила та ланцюжки iptables, які ви створювали, були тимчасовими або непостійними. Це означає, що якщо вам доведеться перезавантажити систему в будь-який момент, усі внесені вами правила та зміни буде втрачено.
Щоб запобігти цьому, вам потрібен механізм для запису або збереження тимчасових правил iptables під час виконання в системі, щоб вони завжди були доступні після перезавантаження системи.
-
Використайте команду
iptables-save, щоб зберегти всі зміни у файлі /etc/sysconfig/iptables. Впишіть:[root@serverXY root]# *iptables-save > /etc/sysconfig/iptables*
!!! tip
Ваші можливості з `iptables` обмежені лише вашою уявою. У цій лабораторній роботі ми ледве торкнулися поверхні. Сподіваємося, що ми доторкнулися достатньо, щоб ви могли дати волю своїй уяві.
Додаткові питання¶
Ось кілька додаткових способів дослідження iptables:
Запитання та завдання:
-
Який параметр потрібен, щоб отримати більш детальну версію цієї команди iptables -L -t nat?
-
Яка команда відображає правила в ланцюжку OUTPUT?
-
На якому порту «зазвичай» прослуховує ftp-сервіс?
-
Яка команда створює ланцюжок під назвою "mynat-chain" у таблиці nat?
-
Знайдіть в Інтернеті список деяких простіших у використанні інструментів або програм, які можна використовувати для керування підсистемою брандмауера в системах на базі Linux.
-
Створіть правило
iptablesдля блокування http-трафіку з hq.example.org на ваш локальний комп'ютер. Який загальновідомий порт прослуховують веб-сервери? Запишіть повну команду для цього? Перетворіть або перекладіть команду, яку ви записали вище, у її еквівалент простою мовою.
Author: Wale Soyinka