私有云如何搭建-在私有云虚拟主机上部署Wireguard VPN的详细指南
在私有云主机(服务器)上安装Wireguad
首先,使用SSH连接到你创建的私有云主机(如果你使用的是Windows,去阅读《了解和使用SSH安全鑰匙》了解详情)。
ssh -i lightsail admin@你虚拟服务器的静态IP地址
在你使用SSH成功连接到vps之后,你会看到这样的命令窗口:
安装Wireguard
- 将操作的权限升级到root
sudo -i
- 然后,将私有云主机(服务器)上所有的软件都升级到最新的版本。输入下面的命令:
sudo apt update
sudo apt upgrade
- 现在,你使用下面的命令去安装Wireguard。此命令也是Wireguard官网所建议的,在Ubuntu和Debian系统上安装Wireguard的方式。如果你的虚拟机(VPS)使用的是其它的系统,请去Wireguard官网的相关部分查看安装方式。
sudo apt install wireguard
- 当Wireguard安装完成之后。你接下来要做的事情是将Wireguard的内核模块加载到Linux的系统内核中去:
modprobe wireguard
- 你可以使用下面的命令确认Wireguard的内核模块已经加载到系统的内核之中:
lsmod | grep wireguard
当你看到类似下面的返回结果之后,就可以确认已经成功加载
配置Wirguard
在你的虚拟机(VPS)上安装好Wireguard之后,就可以开始配置工作了。首先,你可以先创建Wireguard通讯时会使用的加密钥匙对。
1、生成公用/私有钥匙钥匙对
Wireguard使用的是公用/私有钥匙密码技术来加密网络通讯数据的,在这里,参与方是在Lightsail上的私有云主机(虚拟机-VPS),以及我的一台安卓手机。我们需要为每一个参与此通讯的设备创建一个公用/私有钥匙对。
- 去Wireguard所在的目录
cd /etc/wireguard/
- 设置需要的安全许可,保证只有文件的创建者可以访问你在此创建的文件
umask 077
- 现在,使用下面的命令创建在虚拟机(VPS)上Wireguard使用的钥匙对。在这里,你利用Wireguard模块的命令wg genkey生成一个私有钥匙,存放在文件server_private.key中(名字你可以随意取);然后在私有钥匙的基础上再生成一个配对的公用钥匙,将其存放在文件server_public.key中(同样,文件你可以随意取)。
wg genkey | tee server_private.key | wg pubkey>server_public.key
2、创建Wireguard服务器的网络适配器配置文件
接着,创建Wireguard的网络适配器的配置文件wg0.conf(如果你的虚拟机上没有自带Nano文本编辑程序,使用sudo apt install nano去安装)
Nano wg0.conf
然后在网络适配器配置文件中输入下面的代码,在此代码中,我们对通讯的参与方,以及使用路由都做了定义:
[Interface]
Address = 192.168.60.1/24 #这是虚拟机与你的远端设备通讯时使用内部IP地址
PrivateKey = server_private.key
ListenPort = 54321 #这是你确定使用的UDP端口号
PostUp = iptables -I INPUT -p udp --dport 54321 -j ACCEPT
PostUp = iptables -I FORWARD -i ens3 -o wg0 -j ACCEPT
PostUp = iptables -I FORWARD -i wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D INPUT -p udp --dport 54321 -j ACCEPT
PostDown = iptables -D FORWARD -i ens3 -o wg0 -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
记得我在上面防火墙规则部分,定义了一个UDP的端口54321吗?这是Wireguard在进行vnp(VPN)加密通讯时需要“听”的一个通道。
在上面的wg0.conf配置文件中,我将vnp(VPN)通讯参与方使用密码钥匙以一个名字来代替,而没有使用真正的钥匙,比如:PrivateKey = server_private.key。这样,在创建配置文件时,我就不需知道具体的钥匙是什么,只用名字来代替。
在下面右路配置的部分,ens3是在我的例子中,虚拟机(VPS)使用的对外网络适配器(public interface)的名字。而在你的环境中,可能对外网络适配器的名字不一样。你可以使用下面的命令去找出它的名字:
ip addr show
如图,你需要的得到的结果中找出你的虚拟机(VPS)使用的对外网络适配器使用的名字是什么。
现在,同时按下Ctrl+x,然后Shift+y,最后Enter键来保存和关闭你正在编辑的wg0.conf。
下面,我使用代码将前面生成好的钥匙对的实际数据,替换wg0.conf文件中的密码钥匙代号即可
sed -i "s/server_private.key/$(sed 's:/:\\/:g' server_private.key)/" wg0.conf
现在,你可以检查一下wg0.conf,看看是否密码钥匙的值已经变成实际的数据。使用下面的命令:
cat wg0.conf
wg0.conf文件现在看起来应该是这个样子
[Interface]
Address = 192.168.60.1/24
PrivateKey = cMgbJqIl6CuU6U6gpXu4TwUlJ+TnAgaSa6Dc8b5g1F8=
ListenPort = 54321
...
修改wireguard目录的权限,只有root用户可以访问其中的内容:
sudo chmod -R 600 /etc/wireguard/
启动Wireguard
做了基本的配置之后,现在你可以启动Wireguard,使用下面的命令(注意:第一行命令让你的Wireguard在每次机器启动之后自动启动。):
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
然后,使用命令去查看运行的情况:
sudo systemctl status [email protected]
如果一切都如预期,你会得到像下面截图那样的结果。注意那个绿色的alive字样,那表明你的Wireguard在正常运行。
打开虚拟机(VPS)上的IP转发
充当 NAT 网关的系统需要启用 IP 转发,以便在内部和外部网络之间转发数据包,同时转换 IP 地址和端口号。这样,你的多个本地网络设备就可以共享虚拟机(VPS)上的一个公共 IP 地址来访问互联网。
你需要做的工作很简单,修改位于/etc/目录中的sysctl.conf文件,将net.ipv4.ip_forward=1前面的注释标记(#)出去即可。还是使用nano文本编辑器:
nano /etc/sysctl.conf
像截图中那样: