Тут наводяться приклади настройки для різних ситуацій. Про структуруIPTABLES. управління, архітектуру та інше - дивіться в циклі Linux: IPTABLES - керівництво: частина 1 - основи IPTABLES.
Налаштування здійснюється на:
# Lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU / Linux 6.0.7 (squeeze)
Release: 6.0.7
Codename: squeeze
Створюємо файл настройок для IPTABLES:
Дозволяємо його запуск:
# Chmod + x /etc/network/if-up.d/iptables.conf
ВАЖЛИВО: деякі опції вказуються з двома тире - хоча в прикладах вони відображаються як одне! Врахуйте це, якщо копіюєте правила прямо з блогу:
- - state
- - dport
- - tcp-flags
- - reject-with
У нього додаємо:
# Задаємо шлях до виконуваного файлу IPTABLES
IPTABLES = '/ sbin / iptables'
# Скидаємо існуючі правила для всіх таблиць і ланцюжків
$ IPTABLES -F
$ IPTABLES -X
# Задаємо правила за замовчуванням (якщо не спрацювало не одне правило з ланцюжка - спрацює правило звідси)
$ IPTABLES -P INPUT DROP
$ IPTABLES -P OUTPUT ACCEPT
$ IPTABLES -P FORWARD ACCEPT
# Дозволяємо весь трафік по loopback інтерфейсу lo0
# Дозволяємо трафік вже встановленим і створює нові підключення з'єднанням:
$ IPTABLES -A INPUT -m state -state RELATED, ESTABLISHED -j ACCEPT
# Дозволяємо входить SSH через інтерфейс eth0
$ IPTABLES -A INPUT -p tcp -i eth0 -dport 22 -j ACCEPT
Тепер розберемо створені правила докладніше.
У IPTABLES використовується три види таблиць:
Відповідно, нас цікавить третя таблиця Filter. У цій таблиці є три вбудовані ланцюжка:
- INPUT - для вхідних пакетів.
- FORWARD - для проходять через дану машину до іншої.
- OUTPUT - для вихідних.
Пакет, що проходить через ці ланцюжки, виходячи з правила може бути пропущений (ACCEPT) або відкинутий (DROP):
Перше створене нами правило для ланцюжка INPUT задає поведінку за замовчуванням для пакетів, що проходять через цей фільтр. У разі, якщо жодна з правил, заданих нижче не буде застосовано до пакету - він буде відкинутий (DROP) без повідомлення відправника:
$ IPTABLES -P INPUT DROP
Пакети, що проходять фільтр OUTPUT відповідно будуть пропущені:
Те ж саме стосується «транзитних» пакетів:
$ IPTABLES -P OUTPUT ACCEPT
$ IPTABLES -A INPUT -i lo -j ACCEPT
Задає для користувача правило (-A) в фільтр INPUT для пакетів, що проходять через інтерфейс (-i) loopback (lo) і виконує мета (-j) «прийняти» (ACCEPT).
У наступному правилі використовується модуль (-m) state. який перевіряє стан встановлюється з'єднання - RELATED або ESTABLISHED і якщо з'єднання підходить під це правило - дозволяє його:
$ IPTABLES -A INPUT -m state -state RELATED, ESTABLISHED -j ACCEPT
У наступному правилі для фільтра вхідних з'єднань INPUT ми вказуємо:
$ IPTABLES -A INPUT -p tcp -i eth0 -dport 22 -j ACCEPT
Протокол (-p) TCP. інтерфейс (-i) eth0. і порт призначення, тобто порт на нашому сервері, до якого встановлюється з'єднання (-dport) 22.
Додамо ще кілька правил:
# Робимо захист від DOS атак:
$ IPTABLES -A INPUT -p tcp -m tcp -tcp-flags SYN, ACK, FIN, RST RST -m limit -limit 1 / s -j ACCEPT
# Дозволяємо FTP
$ IPTABLES -A INPUT -i eth0 -p tcp -dport 21 -j ACCEPT
# Дозволяємо HTTP
$ IPTABLES -A INPUT -i eth0 -p tcp -dport 80 -j ACCEPT
# Дозволяємо HTTPS
$ IPTABLES -A INPUT -i eth0 -p tcp -dport 443 -j ACCEPT
# Дозволяємо SMTP тільки з мережі 77.120. ***. 1/24
$ IPTABLES -A INPUT -s 77.120. ***. 1/24 -i eth0 -p tcp -dport 25 -j ACCEPT
# РазрешаемPOP3 тільки з IP 77.120. ***. 46
$ IPTABLES -A INPUT -s 77.120. ***. 46 -i eth0 -p tcp -dport 110 -j ACCEPT
# Дозволяємо DNS
$ IPTABLES -A INPUT -i eth0 -p udp -sport 53 -j ACCEPT
# Доступ до портів 8081 і 8082 дозволяємо тільки з мереж 91. ***. **. 0/24, 195. ***. ***. 0/23 і IP 37. ***. **. 174
for net in 91. ***. **. 0/24 195. ***. ***. 0/23 37. ***. **. 174; do
$ IPTABLES -A INPUT -p tcp -m tcp -s $ net -m multiport -dports 8081,8082 -j ACCEPT
done
$ IPTABLES -A INPUT -p tcp -m tcp -m multiport -dports 8081,8082 -j DROP
# Дозволяємо ping
$ IPTABLES -A INPUT -p icmp -j ACCEPT
Перезапустити скрипт, що б правила вступили в силу, заодно перевіримо помилки:
У разі помилок - буде вказано в якому рядку яка помилка. наприклад:
iptables v1.4.8: unknown protocol `tcp-dport 'specified
Пропущений пробіл після tcp.
Подивитися поточні правила можна за допомогою опції -list:
# Iptables -list
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all - anywhere anywhere
ACCEPT all - anywhere anywhere state RELATED, ESTABLISHED
ACCEPT tcp - anywhere anywhere tcp dpt: ssh
ACCEPT tcp - anywhere anywhere tcp flags: FIN, SYN, RST, ACK / RST limit: avg 1 / sec burst 5
ACCEPT tcp - anywhere anywhere tcp dpt: ftp
ACCEPT tcp - anywhere anywhere tcp dpt: www
ACCEPT tcp - anywhere anywhere tcp dpt: https
ACCEPT tcp - 0. ***. ***. 77.colo.static.dc.volia.com/24 anywhere tcp dpt: smtp
ACCEPT tcp -! 0. ***. ***. 77.colo.static.dc.volia.com/24 anywhere tcp dpt: smtp
ACCEPT tcp - 46. ***. ***. 77.colo.static.dc.volia.com anywhere tcp dpt: pop3
ACCEPT udp - anywhere anywhere udp spt: domain
ACCEPT tcp - 91. ***. **. 0/24 anywhere tcp multiport dports tproxy, 8082
ACCEPT tcp - 195. ***. ***. 0/23 anywhere tcp multiport dports tproxy, 8082
ACCEPT tcp - 37. ***. ***. 174 anywhere tcp multiport dports tproxy, 8082
DROP tcp - anywhere anywhere tcp multiport dports tproxy, 8082
ACCEPT icmp - anywhere anywhere icmp echo-request
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Ще кілька прикладів використання.
Перевірити статус IPTABLES:
# Iptables -L -n -v
Chain INPUT (policy DROP 176 packets, 36734 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all - lo * 0.0.0.0/0 0.0.0.0/0
179K 40M ACCEPT all - * * 0.0.0.0/0 0.0.0.0/0 state RELATED, ESTABLISHED
1 100 ACCEPT tcp - eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt: 22
0 0 ACCEPT tcp - eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt: 21
3 180 ACCEPT tcp - eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt: 80
1 28 ACCEPT icmp - * * 0.0.0.0/0 0.0.0.0/0
1 60 ACCEPT tcp - * * 195.191.226.102 0.0.0.0/0 tcp dpt: 514
0 0 ACCEPT tcp - * * 91.218.228.236 0.0.0.0/0 tcp dpt: 514
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 180K packets, 12M bytes)
pkts bytes target prot opt in out source destination
Вивести поточні правила, тільки INPUT:
# Iptables -L INPUT -n -v
# Iptables -L OUTPUT -n -v
Додавання і видалення правил.
Вивести поточні правила INPUT із зазначенням рядків (номерів правил):
# Iptables -L INPUT -n -line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all - 0.0.0.0/0 0.0.0.0/0
2 ACCEPT all - 0.0.0.0/0 0.0.0.0/0 state RELATED, ESTABLISHED
3 ACCEPT tcp - 0.0.0.0/0 0.0.0.0/0 tcp dpt: 22
4 ACCEPT tcp - 0.0.0.0/0 0.0.0.0/0 tcp dpt: 21
5 ACCEPT tcp - 0.0.0.0/0 0.0.0.0/0 tcp dpt: 80
6 ACCEPT icmp - 0.0.0.0/0 0.0.0.0/0
7 ACCEPT tcp - 195.191.226.102 0.0.0.0/0 tcp dpt: 514
8 ACCEPT tcp - 91.218.228.236 0.0.0.0/0 tcp dpt: 514
Що б додати правило перед 5:
# Iptables -I INPUT 5 -i eth0 -p tcp -dport 8080 -j ACCEPT
# Iptables -L INPUT -n -line-numbers | grep 80
5 ACCEPT tcp - 0.0.0.0/0 0.0.0.0/0 tcp dpt: 8080
6 ACCEPT tcp - 0.0.0.0/0 0.0.0.0/0 tcp dpt: 80
Старе правло «посунулась» на 6 рядок, нове - стало 5.
Обмеження вихідних з'єднання для IP8.8.8.8:
# Iptables -I INPUT 7 -s 8.8.8.8 -j DROP
# Iptables -L INPUT -n -line-numbers | grep 8.8.8.8
7 DROP all - 8.8.8.8 0.0.0.0/0
# Iptables -A OUTPUT -p icmp -d www.facebook.com -j DROP
# Ping 173.252.101.26
PING 173.252.101.26 (173.252.101.26) 56 (84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
Подивимося в правилах:
# Iptables -L OUTPUT -n -line-numbers
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp - 0.0.0.0/0 173.252.101.26
# Iptables -A INPUT -p tcp -destination-port 22 -m mac -mac-source 00: 60: ef: 0b: f6: 1a -j ACCEPT
# Iptables -A INPUT -p tcp -destination-port 22 -m iprange -src-range 10.0.0.5-10.0.0.10 -j ACCEPT
Для обмежень використовується connlimit модуль. Щоб дозволити лише 3 SSH з'єднання на одного клієнта:
# Iptables -A INPUT -p tcp -syn -dport 22 -m connlimit -connlimit-above 3 -j REJECT
Встановити кількість запитів HTTP до 20:
# Iptables -p tcp -syn -dport 80 -m connlimit -connlimit-above 20 -connlimit-mask 24 -j DROP
-connlimit-above 3: вказує, що правило діє тільки якщо кількість з'єднань перевищує 3;
-connlimit-mask 24: вказує маску мережі.