Рис.1. Компоненты Netfilter
Модули iptables:
-m state — контроль состояний (предпосылки сессий)
-m multiport — поддержка перечислений портов
-m conntrack — контроль сессий (полноценная поддержка сессий tcp / udp)
Внешние модули iptables:
Примеры:
Работа со списками (ipset)
ipset -N blacklist iphash
ipset -A blacklist 10.10.10.10
iptables -A INPUT -m set --match-set blacklist src -j DROP
Использование модулей:
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,443 -m conntrack --cstate NEW -j ACCEPT
Важно:
modprobe xt_conntrack
echo xt_conntrack >/etc/modules-load.d/conntrack.conf
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
а также разрешить себе доступ к консоли сервера
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
Среди плюсов можно выделить:
Главным минусом является их ограничения и юзабилити, а также их отсутствие в различных пакетах, репозиториях и пр. Не стоит рассчитывать на то, что в ОС предустановлено.
Откат от firewalld (firewall-cmd):
iptables-save >/etc/sysconfig/iptables
ip6tables-save >/etc/sysconfig/ip6tables
systemctl stop firewalld
systemctl disable firewalld
yum remove firewalld (dnf remove firewalld / apt remove …)
yum install iptables-services (dnf / apt)
systemctl enable iptables --now
Рис.2. Таблицы и цепочки
Рис.3. Прохождение трафика
Рис.4. Прохождение трафика через iptables
Рис.5. Прохождение трафика через iptables
Рис.6. Канал управления работы FW (Control Plane)
Рис.7. Компоненты Netfilter
Гибкость nf_tables:
iptables-translate -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
nft 'add rule ip filter INPUT tcp dport 22 ct state new counter accept'
Что же используется в качестве FW?
iptables -V
iptables v1.8.9 (nf_tables)
Конфигурация хранится в /etc/sysconfig/nftables.conf
Подключение конфигурации include /etc/nftables/main.nft
Как в истории с iptables, nft срабатывает «на лету»
Рис.8. nftables и уровни сети
Рис.9. Прохождение трафика nftables
Первым делом необходимо определить таблицы, цепочки и политику «по умолчанию» (accept):
nft add table inet main
— создание ip-таблицы main
nft add chain inet main input { type filter hook input priority 0; policy accept; }
- добавление цепочки input типа filter перехватывающей входящий трафик с приоритетом 0 (наивысший) и дефолтной политикой accept. После добавления этой цепочки трафик сразу будет перехвачен этой таблицей и будет подчиняться описанным в этой таблице правилами!
Аналогичным образом добавляем цепочки output и forward:
nft add chain inet main output { type filter hook output priority 0; policy accept; }
nft add chain inet main forward { type filter hook forward priority 0; policy accept; }
Как описывать правила nf_tables:
nft add rule inet main input ip saddr { 10.10.10.10, 10.10.10.20 } tcp dport 22 accept comment "SSH_admin"
nft add rule inet main output ip daddr 10.10.10.1 udp dport 53 accept comment "DNS_UDP_requests"
nft add rule inet main output tcp dport { 80, 443 } oifname eth0 counter accept comment "WEB_Out_Access"
nft list table inet main
— вывести ip-таблицу main
nft list ruleset
— вывести всю политику FW
Source NAT:
nft add table natnft add chain nat postrouting { type nat hook postrouting priority 0; }
nft add rule nat postrouting ip saddr 192.168.1.0/24 oif eth0 snat to 1.2.3.4
NAT pooling
nft add rule inet nat postrouting snat ip to 10.0.0.2/31
nft add rule inet nat postrouting snat ip to 10.0.0.4-10.0.0.127
NAT ports-protocols
nft add rule inet nat postrouting ip protocol tcp snat ip to 10.0.0.1-10.0.0.100:3000-4000
Destination NAT:
nft add chain nat prerouting { type nat hook prerouting priority -10; }
nft add rule nat prerouting iifname eth0 tcp dport { 80, 443 } dnat to 192.168.1.120
Masquerade:
nft add rule nat postrouting masquerade
Redirect:
nft add rule nat prerouting tcp dport 22 redirect to 2222
nft add rule nat output tcp dport 853 redirect to 10053
Флаги NAT:
nft add rule nat postrouting masquerade random,persistent
nft add rule nat postrouting ip saddr 192.168.1.0/24 oif eth0 snat to 1.2.3.4 fully-random
Без statefull NAT:
nft add rule ip raw prerouting ip protocol tcp ip daddr set 192.168.1.100 tcp dport set 10 notrack
nft add rule ip6 raw prerouting ip6 nexthdr tcp ip6 daddr set fe00::1 tcp dport set 10 notrack
Коррекция порта 8080 в 80:
nft add table raw
nft add chain raw prerouting { type filter hook prerouting priority -300; }
nft add rule raw prerouting tcp dport 8080 tcp dport set 80
Коррекция TCP Options:
nft add rule ip filter forward tcp flags syn tcp option maxseg size set rt mtu
nft add rule ip filter forward tcp flags syn tcp option maxseg size set 1452
Взаимодействие с контролем сессий (mangle — untracking NAT filter prerouting):
nft add rule ip6 raw prerouting ip6 daddr fd00::1 ip6 daddr set fd00::2 notrack
Сервис nftables.service
nft list ruleset >/etc/nftables/main.nft
— сохранение политики
nft -a list ruleset
— вывести политику вместе с handle
nft add rule filter output position 8 ip daddr 127.0.0.8 drop
— добавление правила output в позицию 8
nft insert rule filter output position 8 ip daddr 127.0.0.8 drop
— вставка правила output в позицию 8
nft replace rule filter input handle 2 counter
— заменить правило input с handle 2
nft delete rule filter output handle 5
— удалить правило с handle 5
nft flush
— очистка правил (nft flush chain filter output
; nft flush table filter
; nft flush ruleset
)
Рис.10. Файрволл BSD-систем (FreeBSD)
FreeBSD / OpenBSD Systems (как принято в сообществе — идите на 3 буквы - man)
https://man.freebsd.org/cgi/man.cgi?ipfw(8)
https://docs.freebsd.org/en/books/handbook/firewalls/
Особенности FW у FreeBSD:
Типы пред-конфига FW:
Тип | Описание |
---|---|
open | пропускает весь трафик |
client | защищает только «себя» |
simple | защищает сети (forwarding). |
closed | весь трафик запрещен, кроме loopback-интерфейса |
workstation | защищает только «себя» используя Statefull Inspection (сессии) |
UNKNOWN | отключен (правила ipfw / pf не загружаются) |
P.S.
Для сильно сопротивляющихся новому, можно воспользоваться пакетом iptables-nft. Он позволяет использовать политику iptables не смотря на установленную в ядро nf_tables. iptables прозрачно трансформируется в nft, что позволяет смотреть политику через nft list ruleset
, но для написания правил использовать команду iptables