OpenVPN概念

VPN,即Virtual Private Networking,虚拟专用网络,而OpenVPN则是一套能让不同局域网下的机器之间建立安全隧道的解决方案。

本文要讲什么

在CentOS7上安装和配置OpenVPN,涉及到的系统相关名词有rpm、yum、firewalld等。

配置服务端

CentOS7默认源里木有OpenVPN,所以我们首先要添加EPEL的源。

1
rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

使用Yum安装OpenVPN和easy-rsa包(后者用于签发证书)

1
yum install openvpn easy-rsa

为了防止升级easy-rsa包时你的改动被覆盖掉,把生成证书的脚本拷贝到/etc/openvpn/easy-rsa/目录。

1
rsync -av /usr/share/easy-rsa/2.0/ /etc/openvpn/easy-rsa/

进入easy-rsa目录并且根据你的需求编辑vars文件

1
2
cd /etc/openvpn/easy-rsa/
vim /etc/openvpn/easy-rsa/vars
1
2
3
4
5
6
7
8
export KEY_COUNTRY="CN"
export KEY_PROVINCE="BJ"
export KEY_CITY="BeiJing"
export KEY_ORG="Weformation LTD"
export KEY_EMAIL="admin@cnwelee.me"
export KEY_CN=cnwelee.me
export KEY_NAME=server
export KEY_OU=server

下面我们需要使用esay-rsa目录下的脚本们来生成必要文件

调用vars

1
../vars

清空keys目录

1
./clean-all

生成服务端证书和密钥

1
./build-key-server server

生成Diffie-Hellman 参数 .pem文件

1
./build-dh

生成第一个客户端密钥

1
./build-key client1

重复这一步可以为每个需要连接本OpenVPN服务器的客户端生成密钥。

复制所有生成的服务器端文件到/etc/openvpn目录

1
cp /etc/openvpn/easy-rsa/keys/{dh2048.pem,ca.crt,server.crt,server.key} /etc/openvpn/

OpenVPN附带一个服务端配置示例文档,我们会以它为模板进行修改。首先把它拷过来:

1
cp /usr/share/doc/openvpn-2.3.8/sample/sample-config-files/server.conf /etc/openvpn/

现在我们来编辑server.conf文件,因为我们使用2048位的密钥所以我们修改dh dh1024.pemdh dh2048.pem:

1
sed -i 's/dh dh1024.pem/dh dh2048.pem/' /etc/openvpn/server.conf

为了让客户端的流量可以通过服务器,把redirect-gateway选项的注释去掉

1
sed -i '/redirect-gateway/s/^;//' /etc/openvpn/server.conf

推送DNS服务器到客户端(默认是OpenDNS):

1
sed -i '/dhcp-option/s/^;//g' /etc/openvpn/server.conf

user nobodygroup nobody的注释去掉,这样可以以较少的权限运行OpenVPN

1
sed -i '/nobody/s/^;//g' /etc/openvpn/server.conf

现在我们可以使用以下命令开启OpenVPN服务了

1
systemctl start openvpn@server.service

使用以下命令让openvpn服务开机启动

1
systemctl enable openvpn@server.service

通过VPN对客户端的流量(客户端想访问互联网)进行路由

服务端必须要开启IPv4包转发功能(服务器上多个网卡接口之间转发IPv4的包)。查看是否开启:

1
cat /proc/sys/net/ipv4/ip_forward

如果输出是1则说明开启了,是0的话就运行以下命令进行开启

1
2
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

下面我们配置防火墙规则

1
2
3
4
5
6
firewall-cmd --permanent --add-service openvpn
firewall-cmd --permanent --zone=trusted --add-interface=tun0
firewall-cmd --permanent --zone=trusted --add-masquerade
DEV=$(ip route get 8.8.8.8 | awk 'NR==1 {print $(NF-2)}')
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $DEV -j MASQUERADE
firewall-cmd --reload

配置客户端

无论你使用什么操作系统,都需要传输./build-key脚本生成的client1.key密钥和client1.crt证书,以及证书签发机构认证的ca.crt文件到客户机。你可以通过SSH使用SFTP\FTP或Rsync来传输。我们还需要创建一个client1.ovpn文件,内容如下:

1
2
3
ls **YOUR_SERVER_IP_ADDRESS** 1194
dev tunproto udpresolv-retry infinitenobindpersist-keypersist-tunverb 3
key client1.keyca ca.crtcert client1.crtcomp-lzo

Linux

安装最新版OpenVPN

1
2
3
sudo yum install openvpn # CentOS && Fedora
sudo apt-get install openvpn # Debian && Ubuntu && Mint
sudo pacman -S openvpn # ArchLinux

创建一个新目录mkdir ~/.openvpn并且把client1.ovpnclient1.keyclient1.crtca.crt拷贝进去,使用如下命令开启OpenVPN服务

1
sudo openvpn --config ~/.openvpn/client1.ovpn

注意这目录取决于你的Linux发行版本,你也可以通过GUI工具配置你的OpenVPN客户端。

Windows

下载并安装最新版客户端,把client1.ovpnclient1.keyclient1.crtca.crt拷贝到C:\Program Files\OpenVPN\config目录

Mac OS

下载并安装最新版本tunnelblick,拷贝client1.ovpn,client1.key,client1.crtca.crtDownloads目录.
打开应用并找到 “OpenVPN Configuration(s)” ,然后根据屏幕提示操作即可。

本文地址: https://blog.welee.space/openvpn/