Вопрос или проблема
У меня такая настройка:
- 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. Несмотря на то что вы уже добились некоторых успехов, текущая конфигурация требует доработки для достижения желаемого результата.
Текущая конфигурация
-
Аппаратное обеспечение и соединения:
- Raspberry Pi подключен к роутеру через LAN-кабель.
- Настроено мостовое соединение между
eth0
иwlan0
, что подразумевает объединение проводного и беспроводного интерфейсов. - Используется
hostapd
для создания Wi-Fi точки доступа.
-
VPN подключение:
- Вы настроили L2TP/IPsec соединение с удалённым сервером.
-
Проблема:
- Трафик, генерируемый самим Raspberry Pi (например, при выполнении команды
curl
), проходит через VPN. - Однако устройства, подключенные к Wi-Fi, не получают IP-адрес из VPN и не маршрутизируются через него.
- Трафик, генерируемый самим Raspberry Pi (например, при выполнении команды
Решение проблемы
Для корректной маршрутизации трафика всех клиентов через VPN необходимо внести изменения в маршрутизацию и настройки сетевых интерфейсов. Вот пошаговый подход:
-
Настройка маршрутизации:
- Поскольку
br0
(ваш мост) объединяетeth0
иwlan0
, он может не корректно маршрутизировать трафик через VPN. Вместо этого вы должны напрямую направить трафик сwlan0
на VPN интерфейсppp0
.
- Поскольку
-
Изменение таблицы маршрутов:
- Вам нужно добавить статические маршруты, чтобы обеспечить направление всего трафика VPN через
ppp0
. При помощи командыip route add
добавьте следующее:sudo ip route add default dev ppp0
Эта команда перенаправит весь трафик по умолчанию через VPN интерфейс.
- Вам нужно добавить статические маршруты, чтобы обеспечить направление всего трафика VPN через
-
Настройка 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.
- Вам необходимо настроить
-
Перезапуск сетевых служб:
- После внесения изменений перезапустите необходимые службы, чтобы применить изменения. Используйте команду:
sudo systemctl restart networking
Убедитесь, что все службы работают корректно и не выдают ошибок.
- После внесения изменений перезапустите необходимые службы, чтобы применить изменения. Используйте команду:
-
Проверка конфигурации:
- После перезапуска убедитесь, что ваши устройства, подключенные к
wlan0
, получают VPN IP. Это можно сделать, используя команду для проверки IP-адреса, например,curl ifconfig.me
на клиентах Wi-Fi.
- После перезапуска убедитесь, что ваши устройства, подключенные к
Заключение
Теперь ваш Raspberry Pi должен выполнять функции маршрутизатора и успешно маршрутизировать весь входящий трафик Wi-Fi через VPN. Важно регулярно проверять настройки и корректно управлять маршрутами и iptables, чтобы избежать возможных проблем с сетевой доступностью. Также рекомендуется создать резервную копию конфигурации перед внесением изменений, чтобы в случае ошибки можно было легко восстановить предыдущие настройки.
Если у вас возникли дополнительные вопросы или сложности с реализацией, не стесняйтесь обращаться за помощью в специализированные IT-сообщества или техническую поддержку.