Raspberry pi como ponto de acesso com vpn

4

Preciso conectar meu telefone à rede do escritório enquanto estiver em casa. Instalar um cliente vpn no telefone não é uma opção. Eu segui este tutorial para obter um ponto de acesso trabalhando com um rpi:

Configure a raspberry pi to act as an access point : https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md

Em vez de criar uma bridge (br0 entre wlan0 e eth0) como indicado no tutorial, usei o iptables para fazer o encaminhamento:

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

Isso funciona muito bem, mas não funciona quando eu me conecto à vpn. Eu tentei várias combinações do comando iptables, mas nada parece estar funcionando perfeitamente. Aqui estão algumas combinações que tentei:

Oqueeuqueroalcançaré:

  • "vpn works" aqui significa que um dispositivo conectado ao rpi (access point) pode acessar sites de escritórios.
  • "internet works" significa que um dispositivo conectado ao rpi (access point) pode acessar a internet em geral.
  • Estou usando o vpnc para se conectar à 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] Tabela de roteamento atualizada após o início da configuração:

Foi quando mudei o servidor vpn para outro host

$ 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
    
por Gautam 28.04.2018 / 10:40

1 resposta

3

Seu exemplo mostra um dispositivo tun , portanto, precisamos usar exclusivamente o roteamento. Eu uso Raspbian Stretch Lite 2018-04-18 . A ideia é configurar uma configuração mínima estática sem quaisquer extras, por ex. dhcp server ou mais. Se o roteamento funcionar, ele poderia ser estendido passo a passo.

Rede padrão em Raspbian é muitas vezes confusa, particularmente com configurações mais complexas [1]. Então eu uso systemd-networkd que é projetado para configurações de servidor. Como é difícil adivinhar todos os endereços IP de suas interfaces, configurei meu teste com esses endereços 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        +----------+

Outro problema para mim é que eu não tenho um cisco3000 VPN Concentrator, portanto não posso usar vpnc . Em vez disso, usei openvpn , mas ele deve fazer as mesmas coisas no roteamento. Mas a configuração de uma infraestrutura openvpn está fora do escopo aqui.

Você pode olhar para como migrar da rede para a systemd-networkd se quiser usar isso, mas você só tem que usar a Etapa 1 para a Etapa 3 com esses arquivos:

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 é essencial.

Não configure wpa_supplicant . Em vez disso, instale 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

Configure o software host do ponto de acesso (hostapd) com este arquivo:

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

Defina DAEMON_CONF="/etc/hostapd/hostapd.conf" em / etc / default / hostapd com:

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

Então você tem que definir uma rota estática no seu roteador de internet para que ele possa encontrar a rota sobre o raspi para o seu celular. Na maioria dos roteadores da Internet, você pode definir uma rota estática, mas como isso varia de modelo para modelo. Cabe a você descobrir isso. Em um Raspberry Pi ficaria assim (não configurá-lo em seu roteador Raspi!)

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

Isso significa que para o roteador da Internet: "enviar todos os pacotes pertencentes à sub-rede 192.168.1.0/24 (rede de destino) para o próximo roteador na sub-rede, seu roteador raspi 192.168.0.2 (gateway). Ele sabe para onde ir. "

Se você não tem acesso ao roteador de internet, você pode fingir com nat para dizer que todos os pacotes estão vindo do seu raspi. Coloque isso no seu Raspberry Pi:

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

Mas isso deve ser apenas a segunda escolha, porque não é roteamento limpo e tem limitações e pode ser confuso.

Se você conectar agora seu celular ao MyTestAP configure-o com um endereço IP estático 192.168.1.2, gateway 192.168.1.1. Então você deve ser capaz de se conectar à internet.

A configuração é:

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

Agora eu estabeleço uma conexão vpn, por exemplo com:

rpi ~$ sudo openvpn myVpn.conf

A configuração então é:

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

Aqui também devemos definir rotas estáticas no servidor VPN remoto, mas acho que não temos nenhuma chance de fazer isso. Então, só podemos falsificar o servidor com um nat . No conjunto de raspi:

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

Agora consegui entrar sempre na Internet com o meu telemóvel através da rede Wi-Fi, mas apenas na rede vpn se a ligação fosse estabelecida.


referências:
[1] dhcpcd vs / etc / network / interfaces
[2] Configurando um Raspberry Pi como um ponto de acesso

    
por 08.05.2018 / 00:09