前言
家里的网络因为没有公网 IP,有时候想要连接到家里的树莓派或者电脑就无法实现。这个时候可以采用内网穿透的方法远程连接家中的机器,内网穿透的方案有很多,下面介绍一种采用 OpenVPN 实现内网穿透的方案。
配置
主机:腾讯云
操作系统:Ubuntu 16.04
教程
安装 OpenVPN
首先,我们需要在服务器安装 OPenVPN。在 Ubuntu 系统中我们可以通过 apt
简单的进行安装。同时我们也需要安装 easy-rsa
,它可以帮助我们生成 VPN 使用过程中所需的 CA 证书。
1 | $ sudo apt-get update |
设置 CA 目录
OpenVPN 是使用 TLS/SSL 的 VPN。这意味着它利用证书来加密服务器和客户端之间的通信。为了发布受信任的证书,我们需要建立一个自己的简单的证书颁发机构(CA)。
使用 make-cadir
命令复制 easy-rsa 模板到 home 目录。
1 | make-cadir ~/openvpn/openvpn-ca |
接着进入刚刚新建的目录准备配置 CA:
1 | ~/openvpn/openvpn-ca |
配置 CA 变量
进入 ~/openvpn/openvpn-ca
目录后,我们需要修改 vars
文件,以便于生成需要的 CA 值。
1 | $ vim vars |
在文件底部找到以下配置:
1 | ... |
将这些变量修改为任意你喜欢的值,但是不要为空:
1 | ... |
然后,我们还要修改紧接着出现的 KEY_NAME
的值,为了简单起见,我们改为 server
:
1 | export KEY_NAME="server" |
构建 CA 证书
首先进入你的 CA 目录,然后执行 source vars
:
1 | $ cd ~/openvpn/openvpn-ca |
接着会有以下输出:
1 | $ NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/ubuntu/openvpn/openvpn-ca/keys |
执行下列操作确保操作环境干净:
1 | $ ./clean-all |
现在我们可以构建根 CA:
1 | $ ./build-ca |
这将会启动创建根证书颁发密钥、证书的过程。由于我们刚才修改了 vars 文件,所有值应该都会自动填充。所以,一路回车就好了:
1 | Generating a 2048 bit RSA private key |
现在,我们就有了创建以下步骤需要的 CA 证书。
创建服务器端证书、密钥和加密文件
通过下列命令生成服务器端证书和秘钥:
1 | ./build-key-server server |
注:server
就是刚才在 vars
文件中修改的 KEY_NAME
变量的值。请不要使用别的名字!
然后一直回车选择默认值即可,不要设置 challenge password
,直接回车即可。到最后,你需要输入两次 y 注册证书和提交。
1 | ... |
然后还需要生成一些其他东西。我们可以在密钥交换过程中生成一个强大的 Diffie-Hellman 密钥:
1 | $ ./build-dh |
这个操作大约会花费几分钟不等。
然后,我们可以生成 HMAC 签名加强服务器的 TLS 完整性验证功能:
1 | $ openvpn --genkey --secret keys/ta.key |
配置 OpenVPN 服务
首先将刚刚生成的各类文件复制到 OpenVPN 目录下:
1 | $ cd ~/openvpn-ca/keys |
然后,解压并复制一个 OpenVPN 配置文件到 OpenVPN 目录:
1 | $ gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf |
接着更改配置,注释掉 udp
更改协议为 tcp
:
1 | proto tcp |
找到 tls-auth
位置,去掉注释,并在下面新增一行:
1 | tls-auth ta.key 0 # This file is secret |
去掉 user
和 group
行前的注释:
1 | user nobody |
去掉 client-to-client
行前的注释允许客户端之间互相访问:
1 | client-to-client |
开启客户端固定 IP 配置文件夹:
1 | client-config-dir ccd |
去掉注释后的完整配置如下:
1 | port 1194 |
调整服务器网络配置
允许 IP 转发
编辑 sudo vim /etc/sysctl.conf
文件,去掉 net.ipv4.ip_forward
设置前的注释:
1 | net.ipv4.ip_forward=1 |
输入 sudo sysctl -p
读取文件并对当前会话生效。
调整 UFW 规则
sudo vim /etc/ufw/before.rules
编辑文件,在文件顶部,新增如下 11-18 行的内容:
1 | 01 # |
其中,第 16 行还需要做一点调整。在终端执行 ip route | grep default 命令,你会看到类似如下的输出:
1 | default via xxx.xxx.xxx.xxx dev eth0 |
dev 后的内容如果与第 16 行的 eth0
不同则更换 eth0
为 dev 后的内容,保存文件退出。
接着 sudo vim /etc/default/ufw
修改文件,找到 DEFAULT_FORWARD_POLICY
设置,修改为:
1 | DEFAULT_FORWARD_POLICY="ACCEPT" |
打开 OpenVPN 端口并使变化生效
1 | $ sudo ufw allow 1194/tcp |
启动 OpenVPN
执行:
1 | $ sudo systemctl start openvpn@server |
设置开机自启:
1 | $ sudo systemctl enable openvpn@server |
创建客户端配置
生成客户端证书、密钥对
1 | $ cd ~/openvpn-ca |
client-woodenrobot
为密钥对名称,生成过程中回车选择默认选项即可。
创建客户端配置
执行下列命令,生成客户端配置的基础文件:
1 | $ mkdir -p ~/client-configs/files |
然后打开 ~/client-configs/base.conf 文件,修改 remote server_IP_address 1194
一行为你的服务器公网 IP。
然后更改客户端协议为 tcp
:
1 | ;dev tap |
去掉 user
和 group
前的注释:
1 | # Downgrade privileges after initialization (non-Windows only) |
找到 ca/cert/key,注释掉:
1 | # SSL/TLS parms. |
最后在文件末新增一行:
1 | key-direction 1 |
保存退出文件。
去掉注释后的完整配置为:
1 | client |
创建配置生成脚本
新建 ~/client-configs/make_config.sh 文件,复制如下内容:
1 | #!/bin/bash |
保存并赋予执行权限:
1 | $ chmod 700 ~/client-configs/make_config.sh |
生成客户端配置
执行:
1 | $ cd ~/client-configs |
使用此脚本生成一个配置文件方便客户端使用。
注:需要生成客户端密钥后才可使用脚本生成配置文件,client-woodenrobot.ovpn
为刚刚生成的客户端密钥名称
生成后的脚本储存在 ~/client-configs/files
目录下,名称为 client-woodenrobot
。将文件下载到本地即可使用了。
为客户端设置固定 IP
首先在 OpenVPN 所在的文件夹内创建 ccd
文件夹:
1 | $ sudo mkdir -p /etc/openvpn/ccd |
然后进入该文件夹并创建与客户端密钥名称相同的文件夹并写入一下内容:
1 | $ cd /etc/openvpn/ccd |
内容如下:
1 | ifconfig-push 10.8.0.8 10.8.0.9 |
此内容意为固定 client-woodenrobot
客户端的 OpenVPN 内网 IP 为 10.8.0.8
。
客户端命令行使用
首先安装 OpenVPN
, 运行时选择配置为客户端配置文件:
1 | $ sudo openvpn --config client-woodenrobot.ovpn |
使用此方法可以让家里的电脑或者树莓派等设备实现内网穿透,从而远程连接进行操作。
注:该方法只有连接内网机器时会使用 OpenVPN 代理,平时访问网页等不会走代理,并不是全局代理,节省服务带宽的使用