和朋友一起搞的贩卖物联网卡的平台需要对接运营商的接口,而运营商的接口却有白名单判断,也就意味着只有指定的ip才能访问运营商的接口。
而在服务端调试接口是不现实的,麻烦不说,出问题也不好debug,于是就想到了通过VPN来转发我们本地请求,来骗过运营商的ip验证。
openvpn原理

一、 安装依赖项

1.1、安装epel

参考地址:https://fedoraproject.org/wiki/EPEL

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum update

如何检查epel是否安装成功?

yum repolist

输出如下:

使用epel源安装软件:

yum --enablerepo=epel install git

1.2、安装openvpn依赖项

yum --enablerepo=epel install easy-rsa openssh-server lzo openssl openssl-devel openvpn NetworkManager-openvpn openvpn-auth-ldap

1.3、安装完成

ll /usr/share/easy-rsa/
ll /etc/openvpn

输出如下:

[root@izbp1gu22m7bc5n12j6cntz openvpn]# ll /usr/share/easy-rsa/
total 4
lrwxrwxrwx 1 root root 5 Sep 28 15:11 3 -> 3.0.3
lrwxrwxrwx 1 root root 5 Sep 28 15:11 3.0 -> 3.0.3
drwxr-xr-x 3 root root 4096 Sep 28 15:11 3.0.3
[root@izbp1gu22m7bc5n12j6cntz openvpn]# ll /etc/openvpn
total 12
drwxr-xr-x 2 root root 4096 Sep 28 15:11 auth
drwxr-x--- 2 root openvpn 4096 Apr 26 23:04 client
drwxr-x--- 2 root openvpn 4096 Apr 26 23:04 server

二、 生成客户端和服务器端签证文件

2.1、拷贝easy-rsa

拷贝easy-rsa到openvpn下的两个目录,以生成客户端和服务器端的签证。

cp -R /usr/share/easy-rsa/3.0.3/ /etc/openvpn/server/easy-rsa3
cp -R /usr/share/easy-rsa/3.0.3/ /etc/openvpn/client/easy-rsa3

2.2、生成服务端签证文件

首先下载一个vars.example,可以在这里找到。然后作对应的修改。
下载并修改vars文件:

cd /etc/openvpn
wget https://raw.githubusercontent.com/OpenVPN/easy-rsa/v3.0.5/easyrsa3/vars.example -O vars
cp vars server/easy-rsa3/
cp vars client/easy-rsa3/

创建服务端验证文件:

cd server/easy-rsa3/
./easyrsa init-pki #建立一个空的pki结构,生成一系列的文件和目录
./easyrsa build-ca #创建ca证书,记住密码 和 common name
./easyrsa gen-req server nopass #创建服务端证书 common name 不要跟前面的ca证书的 common name一样
./easyrsa sign server <自定义名字> #签约服务端证书, 生成crt文件
./easyrsa gen-dh #创建Diffie-Hellman,确保key穿越不安全网络

创建ta.key文件

cd /etc/openvpn/
openvpn --genkey --secret ta.key
cp ta.key server

完成后:

可以看到,当前目录下生成了pki文件夹,里面会有新生成的crt文件和key文件。

2.3、生成客户的签证文件

cd ../../client/easy-rsa3/
./easyrsa init-pki
./easyrsa gen-req <名字> #名字自己起

#在server端导入req
cd ../../server/easy-rsa3/
./easyrsa import-req ../../client/easy-rsa3/pki/reqs/<名字>.req <名字>
./easyrsa sign client <名字> # 这一部是在 server/easy-rsa3/ 中执行

2.4、拷贝创建的证书文件

把生成的客户端文件和服务器端文件分别放到集中的位置,方便使用

# 将server的签证文件拷贝到server根目录,方便启动配置
cd server
cp easy-rsa3/pki/ca.crt ./
cp easy-rsa3/pki/private/<自定义名字>.key ./
cp easy-rsa3/pki/reqs/<自定义名字>.req ./
cp easy-rsa3/pki/issued/<自定义名字>.crt ./
cp easy-rsa3/pki/dh.pem ./

# 将client的签证文件拷贝到一个指定文件夹,方便拷贝给客户端
cd client
mkdir cert_files
# 名字为上一步创建的文件的名字
cp easy-rsa3/pki/private/<名字>.key ./cert_files/
cp ../server/easy-rsa3/pki/issued/<名字>.crt ./cert_files/
cp ../server/easy-rsa3/pki/ca.crt ./cert_files/

三、配置并启动服务端vpn

3.1、拷贝server.conf文件到/etc/openvpn并编辑配置。

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

3.2、修改配置

#local a.b.c.d 这个注释掉,默认0.0.0.0
ca /etc/openvpn/server/ca.crt #全路径
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key # This file should be kept secret
dh /etc/openvpn/server/dh.pem
push "dhcp-option DNS 114.114.114.114" #dns
push "route 172.19.0.0 255.255.0.0" #这个是把内网的路由通知给客户端,不然不能访问内网,如果不需要访问内网的,就不用打开
log openvpn.log #日志文件
tls-auth /etc/openvpn/server/ta.key 0 # 客户端需要和服务保持一致

其他的保持不变,保存退出。然后启动。

3.3、启动IP转发功能

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf # 启动IP转发
sysctl -p # 使内核参数生效

防火墙配置

firewall-cmd --permanent --add-service openvpn
firewall-cmd --permanent --add-masquerade
DEV=$(ip route get 配置的dns | 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

使用命令检查firewall-cmd --list-all防火墙状态,输出如下:

public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client openvpn ssh
ports:
protocols:
masquerade: yes
forward-ports:
sourceports:
icmp-blocks:
rich rules:

添加防火墙端口

firewall-cmd --zone=public --add-port=1194/udp --permanent
firewall-cmd --reload # 添加端口后需要重新加载
systemctl enable firewalld.service # 开机启动防火墙

ps:阿里云服务器还需要在控制台打开规则
根据server.conf中定义的协议规则,在规则组创建TCP或UDP协议,需要注意的是,阿里云的TCP和UDP的定义的端口是不通用的。

3.4、测试

openvpn --config /etc/openvpn/server.conf

在另外一个终端中输入lsof -i:1194,如果没有lsof命令,执行yum install lsof便可
如果openvpn启动成功,那么将会输出以下内容:

3.5、启动openvpn

systemctl -f enable openvpn@server.service #设置启动文件
systemctl start openvpn@server.service #启动openvpn的命令

查看1194端口是否启动成功

netstat -ano | grep 1194

四、配置客户端VPN

客户端下载

4.1、拷贝文件

下载openvpn 2.3.4以上版本,下载安装,从服务器上拷贝出ca.crt<客户端证书名>.crt<客户端证书名>.key以及ta.key文件
其中ta.key文件,如果你没有开启tls-auth则不需要

4.2、客户端配置

client
dev tun
;proto tcp
proto udp # 必须和服务端配置一致
remote 服务端ip地址 openvpn端口
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt # ca证书路径
cert renwoleusers.crt # 客户端证书路径
key renwoleusers.key # 客户端key路径
tls-auth ta.key 1 # ta证书路径,如果服务端没有开启,则屏蔽
cipher AES-256-CBC # 加密方式。必须和服务端一致
comp-lzo # 必须和服务端配置一致
verb 3

五、常见问题

1、连接VPN后,提示IP地址未改变。

vim etc/openvpn/server.conf
push "redirect-gateway def1 bypass-dhcp" #打开下面的配置