Синтаксис iptables
iptables — работает в режиме совместимости и ссылается на утилиту iptables-nft, а значит в бэкграунде работает nft
- filter — предназначен для фильтрации трафика, состоит из трех компонентов:
- INPUT — для входящих пакетов, адресованных непосредственно локальному серверу
- FORWARD — для перенаправления (транзитного) трафика между разными сетями или сетевыми интерфейсами
- OUTPUT — для исходящих пакетов, генерируемых локальным сервером.
- nat — предназначен для замены/подмены IP адресов, состоит из трех компонентов:
- POSTROUTING — для обработки исходящих (транзитных) пакетов (SNAT, MASQUERADE)
- PREROUTING — для обработки входящих пакетов (DNAT,REDIRECT)
- OUTPUT — для исходящих пакетов, генерируемых локальным сервером
- mangle — предназначен для модификации заголовок IP пакетов (TTL,TOS,MARK), редко необходим и может быть опасен для не опытных, состоит из пяти компонентов:
- INPUT
- FORWARD
- OUTPUT
- POSTROUTING
- PREROUTING
- raw — предназначен для маркировки пакетов, которые НЕ должны обрабатываться системой, редко необходим, состоит из двух компонентов:
P.S. Компоненты с одинаковым названием, но в разных таблицах — совершенно независимые объекты
Для того чтоб посмотреть текущее состояние правил фаервола, можно набрать команду:
sudo iptables -L
Таблица filter (INPUT)
- Разрешить входящий трафик с сети 192.168.19.0/24
iptables -A INPUT -s 192.168.19.0/24 -j ACCEPT
- Запретить входящий трафик с сети 192.168.19.0/24
iptables -A INPUT -s 192.168.19.0/24 -j DROP
- Запретить входящий трафик с хоста
iptables -A INPUT -s 192.168.19.224/32 -j DROP
- Открыть порт 80 для всех входящих
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- Разрешить только с одного хоста
iptables -A INPUT -s 192.168.19.224/32 -p tcp --dport ssh -j ACCEPT
- Разрешить весь входящий трафик для интерфейса
iptables -A INPUT -i ens32 -j ACCEPT
- Разрешить весь входящий трафик для интерфейса с определенной сети
iptables -A INPUT -i ens32 -s 192.168.19.0/24 -j ACCEPT
- Разрешить весь входящий трафик для интерфейса кроме определенной сети
iptables -A INPUT -i ens32 ! -s 192.168.19.0/24 -j ACCEPT
- Разрешить для интерфейса входящий трафик с хоста по протоколу и порту
iptables -A INPUT -i ens32 -s 192.168.19.224/32 -p tcp --dport 80 -j ACCEPT
- Несколько портов в одном правиле
iptables -A INPUT -i ens32 -s 192.168.19.0/24 -p tcp -m multiport --dports 80,81,443,53 -j ACCEPT
iptables -A INPUT -i ens32 -s 192.168.19.224/32 -m mac --mac-source a0:8c:fd:a3:ed:a4 -p icmp -j ACCEPT
iptables -A INPUT -i ens32 -m mac --mac-source a0:8c:fd:a3:ed:a4 -m time --timestart 12:03 --timestop 16:04 -j ACCEPT
- Ограничения по количеству пакетов
iptables -A INPUT -p icmp -m limit --limit 10/m -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 93:0xffff -j DROP
iptables -A INPUT -p icmp -j LOG --log-prefix "ICMP_TRACE"
- Разрешить вход тех пакетов которые сервер сам запросил, а так же уже установленные сессии
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Таблица filter (FORWARD)
- Разрешить передачу трафика от сетевой карточки ens32 к другой сетевой карточки ens33
iptables -A FORWARD -i ens32 -o ens33
- Разрешить передачу трафика от сетевой карточки ens33 к другой сетевой карточки ens32
iptables -A FORWARD -i ens33 -o ens32
- от сети 192.168.19.0/24 к сети 192.168.100.0/24
iptables -A FORWARD -s 192.168.19.0/24 -d 192.168.100.0/24 -j ACCEPT
- от сети 192.168.100.0/24 к сети 192.168.19.0/24
iptables -A FORWARD -s 192.168.100.0.24 -d 192.168.100.0/24 -j ACCEPT
Таблица filter (OUTPUT)
Как правило исходящий трафик со стороны сервера не запрещают, но бывают некоторые исключения, например если на сервер установили «крякнутый» софт, который будет требовать лицензию, и появилось необходимость заблокировать попытку обращения на официальный ресурс
iptables -A OUTPUT -d 192.168.0.50 -j DROP
Таблица nat (POSTROUTING)
- MASQUERADE — Для исходящих пакетов заменяет IP-адрес источника на адрес интерфейса, с которого уходит пакет
iptables -t nat -A POSTROUTING -s 192.168.19.0/24 -o ens33 -j MASQUERADE
- SNAT — Аналогично MASQUERADE, но с указанием конкретного адреса, чей адрес будет использоваться для подмены
iptables -t nat -A POSTROUTING -s 192.168.19.0/24 -o ens33 -j SNAT --to-source 1.1.1.1
Таблица nat (PREROUTING)
- Пробросить порт 8000/tcp на другой сервер с адресом 10.7.0.169 (DNAT)
iptables -t nat -A PREROUTING -p tcp --dport 8000 -j DNAT --to-destination 10.7.0.169
- Пробросить порт 8080/tcp на порт 80 (REDIRECT)
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
Важный момент
- Порядок действий происходит сверху вниз, важно понимать если вы сначала напишите разрешить а следующим правилом запретить то будет выполняться первое правила а на второе не будет доходить
- Даже в случае пинга внешних хостов, нужно не только отправить пакеты к ним, но и получить ответ. При работе с iptables важно помнить, что многие протоколы передачи данных требуют двусторонней коммуникации. Поэтому нужно настраивать правила соответствующим образом — случаи, когда новички забывают разрешить работу с сервером по SSH случаются очень часто.