1. OpenVPN配置关键操作
1.1 安装软件包
1 2 3 4 5 6 7 8 9 |
Debian 8: apt-get install openvpn easy-rsa CentOS 7: yum install openvpn easy-rsa CentOS 5&6: yum install openvpn |
1.2 制作server与client证书
-
1.2.1 拷贝 easy-rsa 目录至 /etc/openvpn
123456789101112Debian 8:cp -rv /usr/share/easy-rsa /etc/openvpn/easy-rsaCentOS 7:cp -rv /usr/share/easy-rsa/2.0/ /etc/openvpn/easy-rsaCentOS 6:cp -rv /usr/share/openvpn/easy-rsa/2.0/ /etc/openvpn/easy-rsaCentOS 5:cp -rv /usr/share/doc/openvpn-2.2.0/easy-rsa/2.0/ /etc/openvpn/easy-rsa -
1.2.2 配置证书参数
(注意:CentOS 5 中 easy-rsa 相关脚本没有执行权限,请对相应文件添加执行权限)
设置环境变量,编辑文件 /etc/openvpn/easy-rsa/vars,注意以下信息:12345678910111213141516171819202122232425# Key_SIZE, 密钥长度,旧版本系统(RedHat5)默认为1024,我们统一设置为2048export KEY_SIZE=2048# CA 的密钥超时时间,默认10年export CA_EXPIRE=3650# 证书超时时间,默认10年export KEY_EXPIRE=3650# 下面是一些会被放进证书的信息,地区、机构等,根据需要填写,不允许留空export KEY_COUNTRY="US"export KEY_PROVINCE="CA"export KEY_CITY="SanFrancisco"export KEY_ORG="Fort-Funston"export KEY_OU="MyOrganizationalUnit"# X509 证书的名称,根据需要随意修改export KEY_NAME="EasyRSA"# If you'd like to sign all keys with the same Common Name, uncomment the KEY_CN export below# You will also need to make sure your OpenVPN server config has the duplicate-cn option set# export KEY_CN="CommonName" -
1.2.3 生成 Diffie-Hellman密钥交换协议参数 和 CA 证书
123456cd /etc/openvpn/easy-rsasource ./vars # 设置环境变量./clean-all # 清空keys目录下的文件./build-dh # 生成DH参数./build-ca # 生成CA证书,会提示确认一些证书信息(vars里定义的证书信息),一路回车即可 -
1.2.4 生成服务端(server)证书
该过程同样先提示确认一些基本信息,最后提示你是否签发该证书,输入 'y' 并回车即可
12345678910111213141516171819202122232425262728293031323334353637383940414243cd /etc/openvpn/easy-rsa./build-key-server server # 生成服务端证书,后面的参数 'server' 指定生成证书的文件名# 示例输出:[root@localhost easy-rsa]# ./build-key-server serverGenerating a 2048 bit RSA private key.........................................+++.......................................................................+++writing new private key to 'server.key'Country Name (2 letter code) [US]:State or Province Name (full name) [CA]:Locality Name (eg, city) [SanFrancisco]:Organization Name (eg, company) [Fort-Funston]:Organizational Unit Name (eg, section) [MyOrganizationalUnit]:Common Name (eg, your name or your server's hostname) [server]:Name [EasyRSA]:Email Address [me@myhost.mydomain]:Please enter the following 'extra' attributesto be sent with your certificate requestA challenge password []: # 提示输入密码,加密证书,默认为空An optional company name []:Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnfCheck that the request matches the signatureSignature okThe Subject's Distinguished Name is as followscountryName :PRINTABLE:'US'stateOrProvinceName :PRINTABLE:'CA'localityName :PRINTABLE:'SanFrancisco'organizationName :PRINTABLE:'Fort-Funston'organizationalUnitName:PRINTABLE:'MyOrganizationalUnit'commonName :PRINTABLE:'server'name :PRINTABLE:'EasyRSA'Certificate is to be certified until May 15 03:48:22 2027 GMT (3650 days)Sign the certificate? [y/n]:y # 提示确认签发证书, 输入'y'回车即可1 out of 1 certificate requests certified, commit? [y/n]y # 再次提示确认签发证书, 输入'y'回车即可Write out database with 1 new entriesData Base Updated -
1.2.5 生成客户端(client)证书
Openvpn默认的证书认证方式,原则上是应该每个客户端单独配置一个证书,便于用户管理。 但是由于我们情况特殊,用户数量很少,不存在复杂的用户管理,因此只生成一份证书,并在openvpn服务端配置中打开duplicate-cn选项,使得一份证书可以被多个客户端同时使用。
12345cd /etc/openvpn/easy-rsa./build-key client # 生成服务端证书,后面的参数 'client' 指定生成证书的文件名# 交互过程与服务端证书生成过程一致
1.3 准备配置文件
-
1.3.1 服务端配置文件
服务端配置文件默认在/etc/openvpn/server.conf, 对于CentOS 7,在/etc/openvpn下存在空的server目录,删除即可
123456789101112131415161718192021222324252627282930cd /etc/openvpn # 进入放置配置文件的目录cp -v /etc/openvpn/easy-rsa/keys/{ca.crt,server.crt,server.key,dh2048.pem} ./cat > server.conf << 'EOF' # 写入配置文件的内容port 1194 # 服务端口proto tcp # 底层协议,支持TCP/UDPdev tun # 虚拟网卡设备类型,tun/tapca ca.crt # CA证书路径scert server.crt # 服务端证书路径key server.key # 服务端私钥路径dh dh2048.pem # DH 参数路径push "route 10.12.0.0 255.255.0.0" # 这里是单独下发的路由条目;push "redirect-gateway def1 bypass-dhcp" # 这一行是下发默认路由,由于会影响客户端的网络,我们在这里注释掉verb 3persist-keypersist-tuncomp-lzo # 开启压缩duplicate-cn # 允许多个客户端共用一个证书cipher BF-CBC # 数据加密算法,这里选择了BF-CBC,兼容低版本OpenVPN。可选其他配置,和客户端配置文件统一即可client-to-clientkeepalive 10 120status openvpn-status.logserver 192.168.0.0 255.255.255.0 # 配置tun模式下的子网网段,不要和服务端、客户端现有网段冲突即可EOF -
1.3.2 客户端配置文件
将客户端证书和CA证书拷贝出来,并准备客户端配置如下:
1234567891011121314151617181920212223242526272829cd /some/place/to/store/client/conf # 随意选择一个保存客户端配置文件的地方cp -v /etc/openvpn/easy-rsa/keys/{ca.crt,client.crt,client.key} ./cat > client.conf << 'EOF' # 写入配置文件的内容clientdev tunproto tcpremote [Server Address] [Server Port] # 服务端IP地址和端口resolv-retry infinite # 重连次数不限# Try to preserve some state across restarts.persist-keypersist-tunca ca.crtcert client.crtkey client.keycipher BF-CBCexplicit-exit-notifycomp-lzoverb 3mute 20# redirect-gateway def1 bypass-dhcp # 可以单独在客户端配置该选项,即默认路由,全部网络数据从VPN走,方便调试。(默认注释)EOF
1.4 设置服务开机启动
1 2 3 4 5 6 7 8 9 10 11 12 |
Debian 7&8: update-rc.d -f openvpn enable 2 3 4 5 service openvpn start CentOS 7: systemctl -f enable openvpn@server.service systemctl start openvpn@server.service CentOS 5&6: chkconfig openvpn on service openvpn start |
1.5 设置 NAT 网络转发
-
1.5.1 开启数据包转发的内核选项
123echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.confsysctl -p -
1.5.2 配置 iptables nat
1234iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE # -s 指定数据包来源网段,即上面配置的openvpn子网网段iptables-save > /etc/sysconfig/iptables # 可将当前配置保存到配置文件里,便于重启后能够自动重新设置规则# /etc/sysconfig/iptables文件仅存在于红帽系发行版,另请注意不要和原有规则冲突
2.其他注意事项
2.1 Windows机器NAT网络配置
请参考:启用和配置 NAT
2.2 Windows机器重启OpenVPN的坑
- 重启OpenVPN服务后,需要再次重启路由服务,否则NAT网络失效
- Win-R, 打开‘运行’窗口,启动services.msc , 找到openvpn服务,点击重启
- 然后再找到 ‘Routing and Remote Access’ 服务,点击重启
- 服务器重启后,由于OpenVPN与路由服务启动顺序不同,可能导致NAT失效,需要手动重启‘Routing and Remote Access’ 服务