Разрешить клиентам LAN доступ к VPN на маршрутизаторе

Вопрос или проблема

Я пытаюсь настроить свою локальную сеть для использования 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.

Оцените материал
Добавить комментарий

Капча загружается...