Вопрос или проблема
Я пытаюсь создать VPN-сервер с помощью PiVPN на виртуальной машине Debian 12. Я могу подключиться к VPN, но не могу выйти в интернет.
PiVPN не поддерживает nftables изначально, но он должен иметь возможность использовать его, если я настрою его сам. Если я не прав, пожалуйста, дайте знать.
Я использовал этот скрипт для nftables, чтобы настроить его, но не редактировал напрямую конфигурационный файл. Я оставил виртуальную машину работающей во время тестирования и проверки применения правил. Значение переменной lan не является моим реальным lan ip-адресом, 10.0.0.0 – это заполнитель. Есть ли что-то неправильное в моем скрипте? Самое главное, работает ли правило в цепочке postrouting так, как я думаю.
flush ruleset
define lan = 10.0.0.0-10.0.0.190
table inet filter {
chain input {
type filter hook input priority 0;
iifname lo accept;
jump baseRules;
tcp dport ssh ip sdarr $lan accept;
policy drop;
}
chain baseRules {
ct state { established,related} accept;
ct state invalid drop;
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate 2/second accept;
ip protocol icmp icmp type echo-request limit rate 2/second accept;
}
chain forward {
type filter hook forward priority 0; policy accept;
}
chain output {
type filter hook output priority 0; policy accept;
}
chain postrouting {
type nat hook postrouting priority 0;
oifname ens0 masquerade;
policy accept;
}
}
Ответ или решение
Настройка файрвола для WireGuard VPN на Debian 12 с использованием nftables
Построение VPN-сервера с использованием PiVPN и WireGuard на виртуальной машине Debian 12 – это отличное решение для обеспечения безопасности и конфиденциальности соединений. Однако вы столкнулись с проблемой, когда подключение к VPN не позволяет вам выходить в интернет. Эта проблема может быть связана с конфигурацией вашего файрвола, созданного с помощью nftables. В этом руководстве мы рассмотрим, как правильно настроить nftables для WireGuard VPN.
Шаг 1: Анализ текущей конфигурации
Рассмотрим ваш текущий скрипт для nftables:
flush ruleset
define lan = 10.0.0.0-10.0.0.190
table inet filter {
chain input {
type filter hook input priority 0;
iifname lo accept;
jump baseRules;
tcp dport ssh ip sdarr $lan accept;
policy drop;
}
chain baseRules {
ct state { established,related} accept;
ct state invalid drop;
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate 2/second accept;
ip protocol icmp icmp type echo-request limit rate 2/second accept;
}
chain forward {
type filter hook forward priority 0; policy accept;
}
chain output {
type filter hook output priority 0; policy accept;
}
chain postrouting {
type nat hook postrouting priority 0;
oifname ens0 masquerade;
policy accept;
}
}
Шаг 2: Понимание проблемы
-
Правило Postrouting:
Правило в цепочке postrouting делает NAT (masquerading) для всех пакетов, выходящих через интерфейсens0
. Это правило необходимо, чтобы обеспечить правильную маршрутизацию трафика из внутренней сети (например, VPN) в интернет. Однако еслиens0
— это ненадежный интерфейс, вы можете не видеть ожидаемого трафика. -
Цепочка Forward:
Ваша цепочка forward настроена на "policy accept", что позволяет проходить всем пакетам. Однако, возможно, вам необходимо добавить конкретные правила для явного разрешения трафика между VPN и интернетом.
Шаг 3: Рекомендации по конфигурации nftables
Обновите ваше правило postrouting и добавьте необходимые правила в цепочку forward. Вот пример корректировки вашего файрвола:
flush ruleset
define lan = 10.0.0.0/24 # Убедитесь, что у вас правильная маска
table inet filter {
chain input {
type filter hook input priority 0;
iifname lo accept;
jump baseRules;
tcp dport ssh ip sdarr $lan accept;
policy drop;
}
chain baseRules {
ct state { established, related } accept;
ct state invalid drop;
# ICMP для IPv4 и IPv6
ip protocol icmp accept;
ip6 nexthdr icmpv6 accept;
}
chain forward {
type filter hook forward priority 0;
iifname wg0 oifname ens0 accept; # Разрешаем трафик с интерфейса VPN
iifname ens0 oifname wg0 accept; # Разрешаем обратный трафик
policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
chain postrouting {
type nat hook postrouting priority 0;
oifname ens0 masquerade; # Убедитесь, что ens0 соответствует сетевому интерфейсу с выходом в интернет
policy accept;
}
}
Шаг 4: Применение конфигурации
-
Примените настройки: После внесения изменений примените конфигурацию, выполнив команду:
sudo nft -f /path/to/your/nftables.conf
-
Проверка состояния:
Убедитесь, что настройки активны и функционируют правильно:sudo nft list ruleset
Заключение
С правильной настройкой nftables ваши пользователи VPN должны иметь возможность выходить в интернет через сервер WireGuard. Обратите внимание на правильность интерфейсов и наличие NAT, а также проверьте, правильно ли настроен маршрут для клиентских устройств VPN. Если существуют дополнительные ограничения на уровне маршрутизатора или провайдера, это также может потребовать вашего внимания.
Следуя данным рекомендациям, вы обеспечите стабильное и безопасное соединение для пользователей вашего WireGuard VPN.