Debian настройка і управління iptables (перевірити)

Тут наводяться приклади настройки для різних ситуацій. Про структуру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. У цій таблиці є три вбудовані ланцюжка:

  1. INPUT - для вхідних пакетів.
  2. FORWARD - для проходять через дану машину до іншої.
  3. 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: вказує маску мережі.

Схожі статті