Как разрешить трафик через VPN в пространствах имен с помощью nftables
У меня есть интерфейс Wireguard, настроенный в выделенном пространстве имен. Настраивается сначала создание интерфейса в основном пространстве имен (который имеет доступ к маршрутизации физического интерфейса в Интернет), затем перемещение интерфейса Wireguard в пространство имен (ссылка).
Теперь это мой набор правил в основном пространстве имен:
sudo nft -a list table inet filter
table inet filter { # handle 15
set blackhole { # handle 4
type ipv4_addr
elements = { 224.0.0.1, 224.0.0.251,
255.255.255.255 }
}
set in_tcp_accept { # handle 5
type inet_service
flags interval
elements = { 22 }
}
set ip6blackhole { # handle 6
type ipv6_addr
elements = { ff02::16 }
}
set out_tcp_accept { # handle 7
type inet_service
flags interval
elements = { 80, 443, 11371 }
}
set out_udp_accept { # handle 8
type inet_service
flags interval
elements = { 53, 67, 123 }
}
chain global { # handle 1
ct state established,related accept # handle 12
ct state invalid drop # handle 13
}
chain input { # handle 2
type filter hook input priority filter; policy drop;
jump global # handle 14
ip daddr @blackhole counter packets 0 bytes 0 drop # handle 15
ip6 daddr @ip6blackhole counter packets 0 bytes 0 drop # handle 16
iif "lo" accept # handle 17
meta l4proto { icmp, ipv6-icmp } accept # handle 18
tcp dport @in_tcp_accept ct state new accept # handle 19
tcp dport { 80, 443 } ct state new accept # handle 20
udp dport 51821 accept # handle 21
}
chain output { # handle 3
type filter hook output priority filter; policy drop;
jump global # handle 22
oif "lo" accept # handle 23
ip protocol icmp accept # handle 24
ip6 nexthdr ipv6-icmp counter packets 3 bytes 192 accept # handle 25
udp dport @out_udp_accept ct state new accept # handle 26
tcp dport @out_tcp_accept ct state new accept # handle 27
tcp sport 22 tcp flags { rst, psh | ack } counter packets 44 bytes 6052 accept # handle 28
и это блокирует выходной трафик отwg0
в пространстве имен.
Как разрешить приток трафика сvpn
пространство имен и пройти черезeno1
в Интернет?
1 ответ
Я предполагаю, что WireGuardwg0
интерфейс настроен на использование порта 51821 основного хоста, поскольку в файле есть правило для этого порта.inet filter input
цепочке, а значение находится рядом с обычным эталонным портом 51820.
Просто добавьте обратное этому правилу ввода:
udp dport 51821 accept # handle 21
вinet filter output
цепь:
udp sport 51821 accept
или же добавьте этот порт вout_udp_accept
набор.
С учетом некоторых ограничений по сравнению с более простыми настройками, это два места, позволяющие новый исходящий поток из UDP-порта 51821.
В соответствии с текущими правилами тот же поток может быть разрешен вместо ( нового) входящего на номер 51821, что позволит позднее пройти черезglobal
связать весь поток в обоих направлениях до тех пор, пока одноранговый узел первым достигнет системы, но это может никогда не сработать для IPv4 во входящем направлении сначала, если система скрыта за IPv4 NAT, а шлюз NAT не настроен на пересылку UDP-порта 51821 на этой системы (или просто например если система стоит за CG-NAT...). Если это так,PersistentKeepalive
следует использовать в конфигурации WireGuard.
Примечание. ICMPv6 вoutput
с цепочкой следует обращаться так, как это было вinput
цепь. Вместо:
ip protocol icmp accept # handle 24 ip6 nexthdr ipv6-icmp counter packets 3 bytes 192 accept # handle 25
это следует использовать:
meta l4proto { icmp, ipv6-icmp } counter accept
Причина, как документально подтверждено , заключается в том, что практически никогда не следует использоватьip6 nexthdr
что не является точным эквивалентомip protocol
: он может соответствовать промежуточному заголовку, а не окончательному заголовку ICMPv6, и, следовательно, не пропускать трафик.