Всем привет,
это мой первый пост здесь. Немного о моем опыте: я администрирую Linux-серверы уже более десяти лет. Примерно неделю назад я установил Discourse на сервер (Debian Bullseye). Пока всё отлично!
Теперь я хочу применить стандартные меры по укреплению безопасности на хост-системе (например, веб-сервере). В частности, это наборы правил nftables. Обычно я использую следующие:
#!/usr/sbin/nft -f
####################
# Очистка/Сброс #
####################
flush ruleset
####################
# Входящий трафик #
####################
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# Разрешить интерфейс loopback
iifname lo accept
# Ограничение скорости для ICMPv4|ICMPv6
ip protocol icmp icmp type { echo-request, echo-reply, destination-unreachable, time-exceeded, parameter-problem, router-solicitation, router-advertisement } limit rate over 5/second drop
ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, echo-request, parameter-problem, echo-reply, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, ind-neighbor-solicit, ind-neighbor-advert } limit rate over 5/second drop
# Разрешить пакеты для установленных/связанных соединений
ct state established,related accept
# Отбросить некорректные соединения
ct state invalid drop
# Разрешить ICMPv4: запросы Ping | Сообщения об ошибках | Сообщения о выборе маршрутизатора
ip protocol icmp icmp type { echo-request, echo-reply, destination-unreachable, time-exceeded, parameter-problem, router-solicitation, router-advertisement } accept
# Разрешить трафик ICMPv6 (https://tools.ietf.org/html/rfc4890#page-18)
ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, echo-request, parameter-problem, echo-reply, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, ind-neighbor-solicit, ind-neighbor-advert } accept
# Разрешить SSH-доступ на порту 2222 [ограничение скорости]
tcp dport 2222 ct state new limit rate 3/minute accept
# Разрешить HTTP / HTTPS трафик
tcp dport { http, https } accept
# Отклонить остальные пакеты
ip protocol tcp reject with tcp reset
ip6 nexthdr tcp reject with tcp reset
}
####################
# Пропускаемый трафик #
####################
chain forward {
type filter hook forward priority 0; policy drop;
}
####################
# Исходящий трафик #
####################
chain output {
type filter hook output priority 0; policy accept;
# Разрешить интерфейс loopback
oifname lo accept
}
}
Однако после активации правил Discourse перестал работать. Я подозреваю, что пакеты не передаются в Docker-установку Discourse. Скорее всего, проблема именно в этом правиле:
####################
# Пропускаемый трафик #
####################
chain forward {
type filter hook forward priority 0; policy drop;
}
Но прежде чем начинать экспериментировать, я хотел бы спросить, сталкивался ли кто-то с этой проблемой и есть ли у кого-то рабочие правила брандмауэра для базовой системы. Имеют ли эти правила вообще смысл для установки Docker Discourse? До сих пор я мало работал с Docker.
Немного дополнительной информации. Эти правила брандмауэра автоматически добавляются Docker (docker-ce):
table ip nat {
chain DOCKER {
iifname "docker0" counter packets 0 bytes 0 return
iifname != "docker0" meta l4proto tcp tcp dport 443 counter packets 155 bytes 7070 dnat to 172.17.0.2:443
iifname != "docker0" meta l4proto tcp tcp dport 80 counter packets 128 bytes 6263 dnat to 172.17.0.2:80
}
chain POSTROUTING {
type nat hook postrouting priority srcnat; policy accept;
oifname != "docker0" ip saddr 172.17.0.0/16 counter packets 34 bytes 2188 masquerade
meta l4proto tcp ip saddr 172.17.0.2 ip daddr 172.17.0.2 tcp dport 443 counter packets 0 bytes 0 masquerade
meta l4proto tcp ip saddr 172.17.0.2 ip daddr 172.17.0.2 tcp dport 80 counter packets 0 bytes 0 masquerade
}
chain PREROUTING {
type nat hook prerouting priority dstnat; policy accept;
fib daddr type local counter packets 11439 bytes 550595 jump DOCKER
}
chain OUTPUT {
type nat hook output priority -100; policy accept;
ip daddr != 127.0.0.0/8 fib daddr type local counter packets 0 bytes 0 jump DOCKER
}
}
table ip filter {
chain DOCKER {
iifname != "docker0" oifname "docker0" meta l4proto tcp ip daddr 172.17.0.2 tcp dport 443 counter packets 155 bytes 7070 accept
iifname != "docker0" oifname "docker0" meta l4proto tcp ip daddr 172.17.0.2 tcp dport 80 counter packets 128 bytes 6263 accept
}
chain DOCKER-ISOLATION-STAGE-1 {
iifname "docker0" oifname != "docker0" counter packets 588 bytes 44199 jump DOCKER-ISOLATION-STAGE-2
counter packets 1187 bytes 428425 return
}
chain DOCKER-ISOLATION-STAGE-2 {
oifname "docker0" counter packets 0 bytes 0 drop
counter packets 588 bytes 44199 return
}
chain FORWARD {
type filter hook forward priority filter; policy drop;
counter packets 1187 bytes 428425 jump DOCKER-USER
counter packets 1187 bytes 428425 jump DOCKER-ISOLATION-STAGE-1
oifname "docker0" ct state related,established counter packets 316 bytes 370893 accept
oifname "docker0" counter packets 283 bytes 13333 jump DOCKER
iifname "docker0" oifname != "docker0" counter packets 588 bytes 44199 accept
iifname "docker0" oifname "docker0" counter packets 0 bytes 0 accept
}
chain DOCKER-USER {
counter packets 1187 bytes 428425 return
}
chain INPUT {
type filter hook input priority filter; policy accept;
}
}
Всего доброго