使用 Raspberry pi 作为 VPN 接入点

使用 Raspberry pi 作为 VPN 接入点

我需要在家时将手机连接到办公室网络。在手机上安装 vpn 客户端不是一个选择。我按照本教程获取了一个与 rpi 配合使用的接入点:

配置树莓派作为接入点: https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md

我没有按照教程中的指示创建桥接器( wlan0 和 eth0 之间的 br0 ),而是使用 iptables 进行转发:

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

这很有效,但当我连接到 vpn 时它不起作用。我尝试了 iptables 命令的各种组合,但似乎没有一个能完美地工作。以下是我尝试过的一些组合:

在此处输入图片描述

我想要实现的是:

在此处输入图片描述

  • 这里的“vpn 工作”是指连接到 rpi(接入点)的设备能够访问办公室网站。
  • 这里的“互联网工作”是指连接到 rpi(接入点)的设备通常能够访问互联网。
  • 我正在使用 vpnc 连接到 vpn。

$ 路线

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

[2018/05/05] 设置开始工作后更新了路由表:

这是当我将 vpn 服务器更改为另一台主机时

$ route -n(主机2)

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

您的示例显示了一个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        +----------+

对我来说,另一个问题是,我没有 cisco3000 VPN 集中器,所以我无法使用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

在 /etc/default/hostapd 中设置 DAEMON_CONF="/etc/hostapd/hostapd.conf":

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

然后,您必须在互联网路由器中设置静态路由,以便它可以通过 raspi 找到到您手机的路由。在大多数互联网路由器上,您都可以设置静态路由,但具体如何设置因型号而异。这取决于您自己。在 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 路由器192.168.0.2(网关)。它知道去哪里。”

如果您无法访问互联网路由器,您可以假装nat所有数据包都来自您的 raspi。在您的 Raspberry Pi 上进行以下设置:

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

但这应该只是第二选择,因为它不是干净的路由并且有局限性并且可能会造成混淆。

如果您现在将手机连接到测试AP配置静态 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。在 raspi 上设置:

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

现在,我可以通过 wifi 使用手机随时访问互联网,但只有在建立了连接后才能访问 vpn 网络。


参考:
[1]dhcpcd 与 /etc/network/interfaces
[2]将 Raspberry Pi 设置为接入点

相关内容