4

Мне нужно подключить телефон к офисной сети, находясь дома. Установка клиента vpn на телефон не вариант. Я следовал этому руководству, чтобы получить точку доступа, работающую с rpi:

Настройте Raspberry Pi для работы в качестве точки доступа:https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md

Вместо создания моста (br0 между wlan0 и eth0), как указано в руководстве, я использовал iptables для пересылки:

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Это работает довольно хорошо, но это не работает, когда я подключаюсь к VPN. Я пробовал различные комбинации команды iptables, но, похоже, ничего не работает идеально. Вот несколько комбинаций, которые я пробовал:

Чего я хочу достичь:

  • "vpn works" здесь означает, что устройство, подключенное к rpi (точке доступа), может получить доступ к офисным веб-сайтам.
  • "Интернет работает" здесь означает, что устройство, подключенное к rpi (точке доступа), может иметь доступ к Интернету в целом.
  • Я использую vpnc для подключения к vpn.

$ route

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         *               0.0.0.0         U     0      0        0 tun0
default         ralink.dlink.co 0.0.0.0         UG    202    0        0 eth0
10.20.30.40     *               255.255.255.255 UH    0      0        0 tun0
192.168.0.0     *               255.255.255.0   U     202    0        0 eth0
192.168.1.0     *               255.255.255.0   U     303    0        0 wlan0
as-40816.abc    ralink.dlink.co 255.255.255.255 UGH   0      0        0 eth0

[05/05/2018] Обновлена таблица маршрутизации после начала настройки:

Это было, когда я изменил сервер VPN на другой хост

$ route -n (host2)

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.0.1     0.0.0.0         UG    202    0        0 eth0
10.0.0.0        *               255.0.0.0       U     0      0        0 tun0
10.104.26.116   *               255.255.255.255 UH    0      0        0 tun0
150.11.0.101    *               255.255.255.255 UH    0      0        0 tun0
150.11.0.102    *               255.255.255.255 UH    0      0        0 tun0
102.191.24.21   192.168.0.1     255.255.255.255 UGH   0      0        0 eth0
192.168.0.0     *               255.255.255.0   U     202    0        0 eth0
192.168.1.0     *               255.255.255.0   U     303    0        0 wlan0

1 ответ1

3

В вашем примере показано устройство tun , поэтому мы должны использовать исключительно маршрутизацию. Я использую Raspbian Stretch Lite 2018-04-18. Идея состоит в том, чтобы настроить статическую минимальную конфигурацию без каких-либо дополнительных действий, например, с использованием dhcp server или чего-то подобного. Если маршрутизация работает, она может быть расширена шаг за шагом.

Стандартные сети на Raspbian часто путают с более сложными настройками [1]. Поэтому я использую systemd-networkd который предназначен для настройки сервера. Поскольку мне сложно угадать все ip-адреса ваших интерфейсов, я настроил свой тест с этими ip-адресами:

                             10.10.10.2                       +----------+   10.10.10.1
                                /           vpn-tunnel        |          |       \
                             (tun0) =============\\    //======================> VPN-SERVER
PHONE ~.~.~.~.~.~> (wlan0)RPI(eth0) ------------> ROUTER ---> | INTERNET |
     \    wifi       /          \    ethernet    /       wan  |          |
192.168.1.2   192.168.1.1   192.168.0.2    192.168.0.1        +----------+

Другая проблема для меня заключается в том, что у меня нет концентратора VPN cisco3000, поэтому я не могу использовать vpnc . Вместо этого я использовал openvpn но он должен делать то же самое в маршрутизации. Но настройка инфраструктуры openvpn здесь выходит за рамки.

Вы можете посмотреть, как перейти от сети к systemd-networkd, если хотите использовать это, но вам нужно только использовать шаги с 1 по 3 с этими файлами:

rpi ~$ sudo cat >/etc/systemd/network/04-eth.network <<EOF
[Match]
Name=e*
[Network]
Address=192.168.0.2/24
Gateway=192.168.0.1
EOF

rpi ~$ sudo cat >/etc/systemd/network/08-wifi.network <<EOF
[Match]
Name=wl*
[Network]
Address=192.168.1.1/24
IPForward=yes
EOF

ip forwarding имеет важное значение.

Не wpa_supplicant . Вместо этого установите hostapd [2]:

rpi ~$ sudo -Es
rpi ~# systemctl disable wpa_supplicant.service
rpi ~# apt update
rpi ~# apt full-upgrade
rpi ~# apt install hostapd
rpi ~# systemctl stop hostapd.service

Настройте программное обеспечение хоста точки доступа (hostapd) с помощью этого файла:

rpi ~# cat >/etc/hostapd/hostapd.conf <<EOF
interface=wlan0
driver=nl80211
ssid=MyTestAP
hw_mode=g
channel=6
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=VerySecretPw
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOF

rpi ~# chmod 600 /etc/hostapd/hostapd.conf

Установите DAEMON_CONF = "/etc/hostapd/hostapd.conf" в /etc/default /hostapd с помощью:

rpi ~# sed -i 's/^#DAEMON_CONF=.*$/DAEMON_CONF="\/etc\/hostapd\/hostapd.conf"/' /etc/default/hostapd
rpi ~# systemctl reboot

Затем вы должны установить статический маршрут в вашем интернет-роутере, чтобы он мог найти маршрут через распи к вашему мобильному телефону. На большинстве интернет-роутеров вы можете установить статический маршрут, но как это сделать, зависит от модели. Это зависит от вас, чтобы выяснить это. На Raspberry Pi это будет выглядеть так (не устанавливайте его на роутере Raspi!)

rpi ~$ sudo ip route add 192.168.1.0/24 via 192.168.0.2 dev ethX

Это означает, что для интернет-маршрутизатора: «отправьте все пакеты, принадлежащие подсети 192.168.1.0/24 (сеть назначения), следующему маршрутизатору в моей подсети, вашему raspi-router 192.168.0.2 (шлюз). Он знает, куда идти ».

Если у вас нет доступа к интернет-роутеру, вы можете подделать его с помощью nat чтобы лгать, что все пакеты приходят от вашего raspi. Установите это на своем Raspberry Pi:

rpi ~$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Но это должен быть только второй вариант, потому что он не является чистой маршрутизацией, имеет ограничения и может сбивать с толку.

Если вы сейчас подключаете свой мобильный телефон к MyTestAP, настройте его на статический IP-адрес 192.168.1.2, шлюз 192.168.1.1. Тогда вы сможете подключиться к Интернету.

Настройка:

rpi ~$ ip addr   # stripped to relevant information
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.0.2/24 brd 192.168.0.255 scope global eth0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.1.1/24 brd 192.168.1.255 scope global wlan0

rpi ~$ ip route
default via 192.168.0.1 dev eth0 proto static
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.2
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.1

Теперь я устанавливаю соединение VPN, например, с:

rpi ~$ sudo openvpn myVpn.conf

Настройка тогда:

rpi ~$ ip addr   # stripped to relevant information
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.0.2/24 brd 192.168.0.255 scope global eth0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.1.1/24 brd 192.168.1.255 scope global wlan0
11: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none
    inet 10.10.10.2 peer 10.10.10.1/32 scope global tun0

rpi ~$ ip route
default via 192.168.0.1 dev eth0 proto static
10.0.0.0/8 via 10.10.10.1 dev tun0
10.10.10.1 dev tun0 proto kernel scope link src 10.10.10.2
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.2
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.1

Здесь мы также должны установить статические маршруты на удаленном сервере vpn, но я думаю, что у нас нет никаких шансов сделать это. Так что мы можем только подделать сервер с nat . На распи множество:

rpi ~$ sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

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


Рекомендации:
[1] dhcpcd vs /etc /network /interfaces
[2] Настройка Raspberry Pi в качестве точки доступа

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .