Linux / VPN · 2022-04-03 0

Wireguard 打造私人局域网

为了外出的时能够方便访问到家庭局域网server的资源,通常的做法是吧资源端口暴露到公网。如果依赖资源很多,配置麻烦也不安全

Wireguard 是一个轻量。内核级别的VPN实现。严格来说它只是一个peer-to-peer的工具。只是可以配合Linux 的iptables实现路由和转发功能,从而实现一个VPN网络。

1. Wireguard 有什么优点:

  • 轻量,wireguard其实就是个加密通道实现。大部分功能以来操作系统
  • 高性能,linux内核模块实现,运行在内核空间
  • 省电,UDP协议实现,没有长链接,移动设备来说更省电

2. 我想用来实现什么

我家里的home server & raspberry pi中跑了很多常用服务。如smb、home-assistant、dns server。可以借助于wireguard实现外出时无缝访问局域网资源。不用将服务暴露到公网,相当更安全。

因为局域网的Openwrt路由器中做了很多便利工具,如去广告等。即使我在外也可以通过wireguard使用局域网openwrt的DNS服务。

局域网的home server也可以通过wireguard之间访问的我的移动设备或者Macbook。这样我可以通过home server来固定暴露MacBook上的端口。并且提供https加密。比较方便工作中的开发调试。

3. Wireguard Server的安装

因为我的路由器是openwrt,所以我之间将wireguard安装在Openwrt上,省去了端口转发。

如果你想安装在其他server上,参考这个 Docker 安装 Wireguard

  • 安装必要包
opkg update
opkg install wireguard-tools
opkg install kmod-wireguard
opkg install luci-app-wireguard
  • 配置 server interface

生成server密钥对:

wg genkey | tee privatekey | wg pubkey > publickey

生成两个文件,内容是server的公钥和私钥

修改server配置,vim /etc/config/network:

config interface 'vpn'
	option proto 'wireguard'
	option private_key '用上一步生产的privatekey替换'
	option listen_port '51820' # server的公开端口
	list addresses '192.168.172.0/24' # 子网网段

  • 配置一个peer

生成peer密钥对:

wg genkey | tee peer_privatekey | wg pubkey > peer_publickey

同样修改/etc/config/network文件:

config wireguard_vpn 'wg_peer_mbp'
	option preshared_key '可选项,server和client保持一致就OK'
	option description 'My MBP peer'
	option public_key 'peer_publickey的内容'
	option persistent_keepalive '25'
	option route_allowed_ips '1'
	list allowed_ips '192.168.172.10/32' # 给peer分配的ip
  • 配置client

wireguard是一个对等配置,下面我们配置client的peer对等点:

peer.conf

[Interface]
PrivateKey = 这里是上一步生产的peer_privatekey内容
Address = 192.168.172.10/32
DNS = 172.16.0.1 # 我的openwrt ip,可选项

[Peer]
PublicKey = 这里是server的public key
PresharedKey = 与server里面peer配置的一致即可
AllowedIPs = 192.168.172.1/24, 172.16.0.1/24 # 需要转发的ip段
Endpoint = server地址或者domain:51820
PersistentKeepalive = 25

peer.conf 里面的Interface配置对应的是openwrt config里面的interface vpn

peer.conf 里面的Peer配置对应的是openwrt config里面的wg_peer_mbp

server peer里面登记client peer的公钥。client peer里面登记的是sever的公钥。wireguard是双向对等验证

从这里下载wireguard客户端:

https://www.wireguard.com/install/

客户端导入peer.conf即可。

wireguard的client支持Demand功能。可以灵活配置client在什么样的网络状态下自动连接server。

例如:我配置了一直连接server除非已经连接了家里的Wi-Fi

  • 配置openwrt防火墙
config rule 'wg'
	option name 'Allow-WireGuard'
	option src 'wan'
	option dest_port '51820'
	option proto 'udp'
	option target 'ACCEPT'

4. 结尾

因为使用的openwrt。本身已经支持打开了路由转发。如果使用的是linux server。需要手动打开ip_forward

echo "1" > /proc/sys/net/ipv4/ip_forward