我需要在家时将手机连接到办公室网络。在手机上安装 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 设置为接入点