Вопрос или проблема
Я пытаюсь настроить свою локальную сеть для использования VPN-соединения на моем роутере с Linux. Я успешно настроил клиент OpenVPN с использованием NordVPN и сконфигурировал разделение туннелей, чтобы я мог использовать оба интерфейса; мне не нужен VPN для всего. Я могу пинговать 8.8.8.8 по обоим интерфейсам: tun0 и eno1s0. Проблема в том, что я хочу разрешить другим системам в моей локальной сети использовать это соединение, перенаправляя его через VPN-интерфейс tun0. Перенаправление через WAN enp1s0 работает нормально, проблема возникает, когда я изменяю правило перенаправления на tun0 — ничего не перенаправляется. Это проблема с перенаправлением или маршрутизацией?
openvpn client.conf файл:
client
dev tun
proto udp
remote 146.70.71.51 1194
route 0.0.0.0 0.0.0.0
route-metric 200
pull-filter ignore redirect-gateway
resolv-retry infinite
remote-random
nobind
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
persist-key
persist-tun
ping 15
ping-restart 0
ping-timer-rem
reneg-sec 0
comp-lzo no
verify-x509-name CN=ch368.nordvpn.com
remote-cert-tls server
verb 3
fast-io
cipher AES-256-CBC
auth SHA512
auth-user-pass nordvpn.txt
auth-nocache
(сертификаты опущены)
$ip route
default via 192.168.1.254 dev enp1s0 proto dhcp src 192.168.1.200 metric 102
10.100.0.0/16 dev tun0 proto kernel scope link src 10.100.0.2
172.16.2.0/24 dev enp2s0 proto kernel scope link src 172.16.2.1 metric 101
172.16.3.0/24 dev enp3s0 proto kernel scope link src 172.16.3.1 metric 100
192.168.1.0/24 dev enp1s0 proto kernel scope link src 192.168.1.200 metric 102
$ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:ec:ac:cd:65:12 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.200/24 brd 192.168.1.255 scope global dynamic noprefixroute enp1s0
valid_lft 50577sec preferred_lft 50577sec
3: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:ec:ac:cd:65:13 brd ff:ff:ff:ff:ff:ff
inet 172.16.2.1/24 brd 172.16.2.255 scope global noprefixroute enp2s0
valid_lft forever preferred_lft forever
4: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:ec:ac:cd:65:14 brd ff:ff:ff:ff:ff:ff
inet 172.16.3.1/24 brd 172.16.3.255 scope global noprefixroute enp3s0
valid_lft forever preferred_lft forever
5: enp4s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether 00:ec:ac:cd:65:15 brd ff:ff:ff:ff:ff:ff
22: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
inet 10.100.0.2/16 scope global tun0
valid_lft forever preferred_lft forever
nftables:
# Сбросить набор правил
flush ruleset
table ip filter {
chain INPUT_FILTER {
# По умолчанию, сбросить весь трафик, если он не соответствует критериям фильтрации.
type filter hook input priority filter; policy drop;
# Сбросить трафик локальной петли, который не находится в пространстве сети RFC.
iif "lo" ip daddr != { 127.0.0.0/8 } drop
# Разрешить локальную петлю.
iif "lo" accept
# Разрешить установленные соединения на интерфейсах Aenp2s0LL.
ct state { established } accept
# Разрешить SSH INPUT из локальной сети с ограничением по скорости.
iifname enp2s0 ip saddr { 172.16.2.0/24 } tcp dport { 22 } limit rate 5/minute ct state { established, new } accept
# Разрешить ICMP и IGMP INPUT из локальной сети, IOT с ограничением по скорости.
iifname enp2s0 ip saddr { 172.16.2.0/24 } ip protocol { icmp, igmp } limit rate 2/second accept
iifname enp3s0 ip saddr { 172.16.3.0/24 } ip protocol { icmp, igmp } limit rate 2/second accept
# Разрешить DNS INPUT из локальной сети, IOT.
iifname enp2s0 ip saddr { 172.16.2.0/24 } udp dport { 53 } ct state { established, new } accept
iifname enp3s0 ip saddr { 172.16.3.0/24 } udp dport { 53 } ct state { established, new } accept
# Разрешить DHCP INPUT из локальной сети, IOT.
iifname enp2s0 ip saddr { 172.16.2.0/24 } udp dport { 67 } ct state { established, new } accept
iifname enp3s0 ip saddr { 172.16.3.0/24 } udp dport { 67 } ct state { established, new } accept
}
chain FORWARD_FILTER {
# По умолчанию, сбросить весь трафик, если он не соответствует критериям фильтрации.
type filter hook forward priority filter; policy drop;
# Разрешить FORWARD из локальной сети в WAN. ЭТО РАБОТАЕТ.
iifname enp2s0 oifname enp1s0 accept
iifname enp1s0 oifname enp2s0 ct state { established } accept
# Разрешить FORWARD из локальной сети в VPN. ЕСЛИ Я ЗАКОММЕНТИРУЮ ПРЕДЫДУЩЕЕ ПРАВИЛО И ИСПОЛЬЗУЮ ЭТО. НЕ РАБОТАЕТ.
#iifname enp2s0 oifname tun0 accept
#iifname tun0 oifname enp2s0 ct state { established } accept
}
chain OUTPUT_FILTER {
# По умолчанию, сбросить весь трафик, если он не соответствует критериям фильтрации.
type filter hook output priority filter; policy accept;
}
}
table ip nat {
chain PREROUTING {
type nat hook prerouting priority dstnat; policy accept;
# Перенаправить https порт на vpn
iifname $lan0 tcp dport { 80,443 } dnat 10.100.0.2
}
chain POSTROUTING {
type nat hook postrouting priority srcnat; policy accept;
# Маскарад локальной сети для доступа в интернет.
iifname $lan0 ip saddr { 172.16.2.0/24 } oif $wan0 snat 192.168.1.200
# Маскарад локальной сети для доступа к vpn.
iifname $lan0 ip saddr { 172.16.2.0/24 } oifname tun0 snat 10.100.0.2
# Маскарад IOT для доступа в интернет.
iifname $iot0 ip saddr { 172.16.3.0/24 } oif $wan0 snat 192.168.1.200
}
}
$ cat /proc/sys/net/ipv4/conf/all/forwarding
1
.
Ответ или решение
Для успешного предоставления доступа клиентам локальной сети (LAN) к VPN через ваш маршрутизатор на основе Linux, необходимо убедиться, что ваше сетевое окружение правильно настроено для маршрутизации и передачи данных через интерфейс VPN (tun0). Вот последовательная инструкция, которая поможет вам решить эту задачу.
1. Понимание архитектуры сети
Ваше текущее сетевое окружение включает несколько интерфейсов:
- enp1s0 — основной WAN-интерфейс с вашей локальной сетью.
- tun0 — интерфейс VPN, который обеспечивает зашифрованный доступ к интернету.
- enp2s0, enp3s0 — локальные интерфейсы, представляющие разные подсети.
2. Настройка маршрутизации
Убедитесь, что маршруты по умолчанию и маршруты к VPN настроены правильно. Ваше текущее состояние с помощью команды ip route
подтверждает это, но важно также дополнительно настроить маршрутизацию для всех необходимых подсетей.
3. Настройка NAT для VPN
Если клиенты LAN должны использовать VPN для выхода в интернет, вам нужно настроить NAT (перевод сетевых адресов) для интерфейса tun0. В вашем конфиге nftables, это следует сделать в разделе POSTROUTING
таблицы NAT. Проверьте, что у вас есть правило, которое выглядит так:
# Маскарад LAN для доступа через VPN.
iifname $lan0 ip saddr { 172.16.2.0/24 } oifname tun0 snat 10.100.0.2
Это правило должно быть в самом низу списка, чтобы оно применялось к клиентам LAN, которые хотят использовать VPN. Также убедитесь, что oifname tun0
указывает на корректный интерфейс VPN.
4. Конфигурация фильтров nftables
В FORWARD_FILTER
цепочке, добавьте правила, позволяющее передавать трафик с LAN на VPN и обратно. Приведу пример:
# Добавляем правила для разрешения передачи данных между LAN и VPN.
iifname enp2s0 oifname tun0 accept
iifname tun0 oifname enp2s0 ct state { established } accept
5. Проверка и отладка
Для проверки работоспособности маршрутизации через tun0, используйте команды ping
и traceroute
от клиентов LAN к определённому IP, например, к 8.8.8.8. Здесь важен момент, чтобы убедиться, что вы получаете ответы через интерфейс tun0.
Также можете использовать tcpdump
для мониторинга входящего и исходящего трафика на интерфейсе tun0:
tcpdump -i tun0
6. Дополнительные параметры конфигурации
Убедитесь, что в /etc/sysctl.conf
установлена величина net.ipv4.ip_forward=1
и выполните команду sysctl -p
для применения изменений. Это разрешит маршрутизацию пакетов между интерфейсами.
7. Заключение
Теперь ваша локальная сеть должна быть в состоянии использовать VPN соединение для доступа к интернету. Если при тестировании возникнут проблемы, стоит проверить журналы OpenVPN для выявления возможных ошибок соединения.
Этот процесс требует внимательного анализа текущей конфигурации сети, тем не менее, с соблюдением вышеуказанных шагов вы сможете успешно обеспечить доступ к вашему VPN для клиентов LAN.