Маршрутизация трафика через VPN с использованием Raspberry Pi

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

У меня такая настройка:

  • Raspberry Pi подключен к маршрутизатору через LAN-кабель
  • Создано мостовое соединение между eth0 и wlan0
  • Используется hostapd для точки доступа Wi-Fi
  • Настроено соединение l2tp/ipsec с одним из моих серверов в интернете

Проблема, с которой я столкнулся, и цель:

  • Цель состоит в том, чтобы сделать Raspberry Pi маршрутизатором Wi-Fi, который будет направлять весь трафик, поступающий через Wi-Fi, через мой VPN
  • Проблема, с которой я сталкиваюсь, заключается в том, что Raspberry Pi использует VPN-туннель, когда я выполняю curl, но все подключенные пользователи Wi-Fi не получают VPN-адрес.

Пример интерфейса:

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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether b8:27:eb:21:2b:9a brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether b8:27:eb:21:2b:9a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.7/24 brd 192.168.1.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba27:ebff:fe21:2b9a/64 scope link
       valid_lft forever preferred_lft forever
4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether b8:27:eb:74:7e:cf brd ff:ff:ff:ff:ff:ff
6: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc pfifo_fast state UNKNOWN group default qlen 3
    link/ppp
    inet 192.168.42.11 peer 192.168.42.1/32 scope global ppp0
       valid_lft forever preferred_lft forever

Маршрутная таблица:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 ppp0
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 br0
45.36.81.212    192.168.1.1     255.255.255.255 UGH   0      0        0 br0
63.126.53.74    192.168.1.1     255.255.255.255 UGH   0      0        0 br0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 br0
192.168.42.1    0.0.0.0         255.255.255.255 UH    0      0        0 ppp0

45.36.81.212 – это мой VPN
63.126.53.74 – это мой собственный локальный публичный IP
(адреса были слегка изменены по очевидным причинам).

ОС: Raspbian

Будет ли перенаправление wlan0 на ppp0 решением проблемы, или мне нужно вмешиваться в br0?

У меня аналогичная настройка, где некоторые клиенты используют шлюз, который является устройством с VPN-туннелем, а другие используют обычное интернет-соединение от провайдера в дом.

Я не сливаю свою Wi-Fi и Ethernet на VPN-шлюзе. Вместо этого эта машина работает как VPN-клиент. Это заставляет VPN-шлюз проверять маршрутную таблицу для обработки трафика, который мост обошел бы.

На VPN-шлюзе у меня три IP-адреса:

  • eth0: 192.168.1.254 в основном это просто клиент в моей основной сети
  • eth1: 192.168.2.1 шлюз для альтернативной сети
  • tun0: 10.2.3.5 это VPN-туннель, и IP-адрес каждый раз разный, когда туннель поднимается

Я также поддерживаю 3 статических маршрута на VPN-шлюзе:

  • умолчательный маршрутизатор -> 192.168.1.1
  • 0.0.0.0/1 -> 10.2.3.5
  • 128.0.0.0/1 -> 10.2.3.5

И один важный динамический маршрут для VPN:
– 10.2.3.5 -> 10.2.3.6

Умолчательный маршрут к шлюзу моего провайдера (192.168.1.1) обеспечивает, что VPN-шлюз всегда сможет найти интернет.

Остальные два маршрута – это два “более специфичных” маршрута, которые охватывают все пространство адресов IPv4. Таким образом, любой трафик куда-либо (кроме любых непосредственно подключенных сетей) передается на интерфейс VPN-туннеля, а конкретный динамический маршрут VPN-туннеля 10.2.3.5 -> 10.2.3.6 передает весь этот трафик через туннель.

Таким образом, все клиенты, подключающиеся к Wi-Fi через VPN-шлюз, проходят через VPN-туннель, и я все еще могу позволить клиентам получить доступ к сети моего провайдера (Wi-Fi) для получения общего доступа в интернет, если это необходимо или желаемо.

Ответ или решение

Маршрутизация трафика через VPN с использованием Raspberry Pi

Ваша задача заключается в том, чтобы настроить Raspberry Pi как Wi-Fi маршрутизатор, который будет маршрутизировать весь входящий трафик через VPN. Несмотря на то что вы уже добились некоторых успехов, текущая конфигурация требует доработки для достижения желаемого результата.

Текущая конфигурация

  1. Аппаратное обеспечение и соединения:

    • Raspberry Pi подключен к роутеру через LAN-кабель.
    • Настроено мостовое соединение между eth0 и wlan0, что подразумевает объединение проводного и беспроводного интерфейсов.
    • Используется hostapd для создания Wi-Fi точки доступа.
  2. VPN подключение:

    • Вы настроили L2TP/IPsec соединение с удалённым сервером.
  3. Проблема:

    • Трафик, генерируемый самим Raspberry Pi (например, при выполнении команды curl), проходит через VPN.
    • Однако устройства, подключенные к Wi-Fi, не получают IP-адрес из VPN и не маршрутизируются через него.

Решение проблемы

Для корректной маршрутизации трафика всех клиентов через VPN необходимо внести изменения в маршрутизацию и настройки сетевых интерфейсов. Вот пошаговый подход:

  1. Настройка маршрутизации:

    • Поскольку br0 (ваш мост) объединяет eth0 и wlan0, он может не корректно маршрутизировать трафик через VPN. Вместо этого вы должны напрямую направить трафик с wlan0 на VPN интерфейс ppp0.
  2. Изменение таблицы маршрутов:

    • Вам нужно добавить статические маршруты, чтобы обеспечить направление всего трафика VPN через ppp0. При помощи команды ip route add добавьте следующее:
      sudo ip route add default dev ppp0

      Эта команда перенаправит весь трафик по умолчанию через VPN интерфейс.

  3. Настройка iptables:

    • Вам необходимо настроить iptables для обеспечения NAT (преобразования сетевых адресов) для трафика от ваших клиентов в wlan0 перед отправкой его в VPN. Используйте следующие команды для настройки:
      sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
      sudo iptables -A FORWARD -i ppp0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
      sudo iptables -A FORWARD -i wlan0 -o ppp0 -j ACCEPT

      Эти команды обеспечат маскарадинг (скрытие) локальных IP-адресов при выходе в интернет через VPN.

  4. Перезапуск сетевых служб:

    • После внесения изменений перезапустите необходимые службы, чтобы применить изменения. Используйте команду:
      sudo systemctl restart networking

      Убедитесь, что все службы работают корректно и не выдают ошибок.

  5. Проверка конфигурации:

    • После перезапуска убедитесь, что ваши устройства, подключенные к wlan0, получают VPN IP. Это можно сделать, используя команду для проверки IP-адреса, например, curl ifconfig.me на клиентах Wi-Fi.

Заключение

Теперь ваш Raspberry Pi должен выполнять функции маршрутизатора и успешно маршрутизировать весь входящий трафик Wi-Fi через VPN. Важно регулярно проверять настройки и корректно управлять маршрутами и iptables, чтобы избежать возможных проблем с сетевой доступностью. Также рекомендуется создать резервную копию конфигурации перед внесением изменений, чтобы в случае ошибки можно было легко восстановить предыдущие настройки.

Если у вас возникли дополнительные вопросы или сложности с реализацией, не стесняйтесь обращаться за помощью в специализированные IT-сообщества или техническую поддержку.

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

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