本文以 Ubuntu 为服务器搭建 OpenVPN 实现翻墙与外网客户端访问服务端内网。

安装openvpn与easyrsa (证书生成工具) 并启动

1
sudo apt install openvpn easy-rsa

首先把配置文件模板拷贝到/etc/openvpn/目录下,再解压

1
2
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
sudo gzip -d /etc/openvpn/server.conf.gz

然后把easy-rsa拷贝到openvpn的配置目录下,方便操作

1
2
mkdir /etc/openvpn/easy-rsa/
cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/

切换到easy-rsa目录,并且清除之前生成的keys(如果有)

1
2
3
cd /etc/openvpn/easy-rsa/
./clean-all
./build-ca #生成ca证书

生产服务器证书,这里有个坑,当询问到最后一步的时候一定要按y,不然会生成空的证书

As in the previous step, most parameters can be defaulted. Two other queries require positive responses, “Sign the certificate? [y/n]” and “1 out of 1 certificate requests certified, commit? [y/n]”.

1
./build-key-server myservername

生成Diffie Hellman 参数(可能有点慢):

1
./build-dh

现在所有的证书都在 /etc/openvpn/easy-rsa/keys/ 里了,现在需要拷贝出来,拷贝到 openvpn 配置文件夹里面 (/etc/openvpn)

1
2
cd keys/
cp myservername.crt myservername.key ca.crt dh2048.pem /etc/openvpn/

最后,还需要生成一个秘钥 ta.key

1
openvpn --genkey --secret ta.key

现在可以看到/etc/openvpn目录有的证书与秘钥如下:

myservername.crt myservername.key ca.crt dh2048.pem ta.key

现在开始修改openvpn配置文件,让配置文件对应刚刚拷贝过来的证书

1
2
3
4
5
6
7
vim /etc/openvpn/server.conf

ca ca.crt
cert myservername.crt
key myservername.key
dh dh2048.pem
tls-auth ta.key 0

现在服务器就配置完成了,启动试试

1
systemctl start openvpn@server

启动成功!
看看日志:

1
systemctl status openvpn@server

或者

1
journal -u openvpn@server

制作客户端证书

1
2
cd /etc/openvpn/easy-rsa/
./build-key client1

然后把下列证书与秘钥传送到客户端所在机器

  1. /etc/openvpn/ca.crt
  2. /etc/openvpn/easy-rsa/keys/client1.crt
  3. /etc/openvpn/easy-rsa/keys/client1.key
  4. /etc/openvpn/ta.key

Windows 客户端配置

1.先在官网下一份openvpn客户端,在安装目录找到sample-config文件夹,找到client.ovpn,拷贝到安装目录的config文件夹。

2.然后将服务器上制作的客户端证书与秘钥传送到config文件夹。

3.修改一下client.ovpn配置

1
2
3
4
ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1

4.找到系统托盘,连接!连接成功,现在ping 10.8.0.x (openvpn服务器的IP) 成功,但是现在还不能翻墙

OpenVpn 翻墙配置

首先需要配置Ubuntu支持流量转发,编辑 /etc/sysctl.conf

1
#net.ipv4.ip_forward=1

把注释去掉,然后重新加载

1
sudo sysctl -p /etc/sysctl.conf

修改openvpn配置 /etc/openvpn/server.conf,使其重定向客户端流量

1
push "redirect-gateway def1 bypass-dhcp"

修改dns

1
push "dhcp-option DNS 8.8.8.8"

重启openvpn

1
systemctl restart openvpn@server

现在用客户端连上发现不能上网了,只能访问openvpn这台机器!是因为openvpn把客户端的所有流量都转发了,但是服务端并没有配置流量转发到外网。

设置 iptables 转发10.8.0.x 的所有流量到外网:

1
iptables -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE

现在访问Google,OK!