使用OpenVPN对校园网内网穿透

目标: 搭建完成之后,可以在服务器(外网)上直接输入校园网(内网)地址进行访问。

#00 前言

最近对穿透学校的内网有需求,于是决定搭建环境。
网上的教程大多都是客户端访问服务器的内网,
但这个教程是,穿透客户端所在内网,由服务器访问客户端的内网。

服务器IP:x.x.x.x
客户端IP:192.168.1.1 所在网段 192.168.1.0/24
学校内网网段:10.20.208.0/24

路由器通过学校内网IP上网,此处省去路由端802.1X的认证过程,假设直接就能通过学校的认证并且获取到一个ip。

在路由器上是可以直接访问10.20.208.0/24网段的,但是10.20.208.x是一个内网的地址,服务器所在环境是外网无法访问。

如果是对内网的某一个某个网站进行穿透,建议使用ngrok,这里是对整个网段的穿透。

#01 OpenVPN Server和Client所用的环境

  • OpenVpn Sever使用的服务器(CentOS 7.0)
  • OpenVpn Client放在Openwrt(Pandorabox 16.10 stable, Openwrt 17.01)路由器上运行

#02 安装OpenVPN(服务器端)

登录服务器端,输入以下命令进行openvpn的安装

1
yum install -y openvpn

或者是到openvpn的官方网站下载源码 https://openvpn.net/index.php/open-source/downloads.html

1
wget https://swupdate.openvpn.org/community/releases/openvpn-2.4.1.tar.gz

然后按照下面的命令进行安装

1
2
3
4
5
tar -zxf openvpn-2.4.1.tar.gz
cd openvpn-2.4.1
./configure
make
make install

安装完成openvpn之后,输入以下命令就可看到版本信息

1
2
3
4
5
6
openvpn --version
OpenVPN 2.4.1 x86_64-redhat-linux-gnu [Fedora EPEL patched] [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Apr 3 2017
library versions: OpenSSL 1.0.1e-fips 11 Feb 2013, LZO 2.06
Originally developed by James Yonan
Copyright (C) 2002-2017 OpenVPN Technologies, Inc. <sales@openvpn.net>
......

#03 下载easy-rsa

1
2
3
4
5
6
7
wget -c https://github.com/OpenVPN/easy-rsa/archive/master.zip
unzip master.zip
mv easy-rsa-master easy-rsa
cp -rf easy-rsa /etc/openvpn
cd /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa/easyrsa3
mv vars.example vars

解除注释之后,修改如下内容(填写自己的信息):

1
2
3
4
5
6
7
vi vars
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Guangdong"
set_var EASYRSA_REQ_CITY "Dongguan"
set_var EASYRSA_REQ_ORG "DotTimes Co"
set_var EASYRSA_REQ_EMAIL "xxx@xxxx.com"
set_var EASYRSA_REQ_OU "Zeyes"

修改完之后,按下ESC,然后输入:wq保存

#04 配置证书文件

1. 初始化配置

1
./easyrsa init-pki

如果成功的话,会在当前目录下创建pki/{reqs,private}目录,用于保存证书文件。

2. 创建根证书

1
./easyrsa build-ca

创建过程中需要输入根证书的密码以及Common Name。如果创建成功,则会在pki/private/目录下创建ca.key私钥文件以及pki/目录下创建ca.crt证书文件。

3. 创建服务器证书

1
./easyrsa build-server-full server nopass

创建过程和根证书创建类似,需要输入证书的密码以及上一个步骤创建根证书的密码。
如果创建成功,则会在pki/private目录创建server.key私钥文件。在pki/issued目录创建server.crt证书文件。

4. 创建dh证书

1
./easyrsa gen-dh

DH parameters of size 2048 created at /usr/local/easy-rsa-master/easyrsa3/pki/dh.pem

5. 创建客户端证书

./easyrsa build-client-full openwrt nopass # openwrt是用户名,也可以输入其他的, nopass表示不需要密码
创建过程要输入ca证书的密码(第2步的密码)

6. server端的文件,复制到/etc/openvpn/下

1
2
3
4
5
cd /etc/openvpn/
cp /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt .
cp /etc/openvpn/easy-rsa/easyrsa3/pki/issued/server.crt .
cp /etc/openvpn/easy-rsa/easyrsa3/pki/private/server.key .
cp /etc/openvpn/easy-rsa/easyrsa3/pki/dh.pem ./dh2048.pem

7. client端的文件, 然后下载 (放到一个可以下载的地方,注意权限)

1
2
3
4
5
6
7
cd /data/wwwroot/default/
mkdir client
cp /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt ./client/
cp /etc/openvpn/easy-rsa/easyrsa3/pki/issued/openwrt.crt ./client/
cp /etc/openvpn/easy-rsa/easyrsa3/pki/private/openwrt.key ./client/
chown -R www.www client
chmod 644 ./client/*

我这里是放在服务器网站目录下,如果有其他选择,可以选择其他方便进行下载的地方

#05 配置OpenVPN Server

1
cd /etc/openvpn

1. 将server配置模板复制到/etc/openvpn下

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

2. 编辑server.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
vi server.conf

local xxx.xxx.xxx.xxx   # 这里填服务器的外网ip
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-config-dir ccd
route 10.20.208.0 255.255.255.0 # 学校内网网段
route 192.168.1.0 255.255.255.0 # 路由器网段
client-to-client
keepalive 10 120
;tls-auth ta.key 0
cipher AES-256-CBC # 加密方式
comp-lzo
;user nobody
;group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
explicit-exit-notify 1

#06 配置ccd文件夹

1
2
3
4
5
6
7
cd /etc/openvpn
mkdir ccd
cd ccd
vi openwrt   # 填你的生成的客户端证书名
iroute 10.20.208.0 255.255.255.0 # 学校内网网段
iroute 192.168.1.0 255.255.255.0 # 路由器网段
ifconfig-push 10.8.0.2 10.8.0.1

#07 iptables 设置(根据实际情况)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
yum install -y iptables-services
systemctl enable iptables
systemctl stop firewalld
systemctl start iptables
iptables -L -n
iptables -P INPUT ACCEPT
iptables -F
iptables -X
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o tun+ -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.20.208.0/24 -o tun+ -j MASQUERADE
iptables -A FORWARD -d 10.20.208.0/24 -o tun+ -j ACCEPT
service iptables save
service iptables restart

#08 服务器设置

1. 设置允许转发

1
2
3
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p  # 立即生效

2. 设置openvpn开机启动

1
2
3
systemctl -f enable openvpn@server.service
systemctl start openvpn@server.service
systemctl restart openvpn@server.service

#09 下载证书

总共有三个文件

  • ca.crt
  • openwrt.crt
  • openwrt.key

#10 客户端设置(Pandorabox, Openwrt 17.01)

1. 安装openvpn以及luci web配置界面还有中文

1
2
3
4
opkg update
opkg install openvpn-openssl
opkg install luci-app-openvpn
opkg install luci-i18n-openvpn-zh-cn

2. 设置允许转发

默认情况下,防火墙是禁止转发的。
所以登录路由器的web设置界面luci, 找到网络-防火墙-一般设置,
可以看到转发是拒绝的,把转发设置成接受,然后点击保存并应用。

#11 测试OpenVPN(客户端)能否正常运行(此步可以省略)

1. 预先编辑好文件client.conf,然后传到/tmp目录,文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
client
;dev tap
dev tun
;dev-node MyTap
;proto tcp
proto udp
remote x.x.x.x 1194 # 这里修改为你的服务器ip
;remote my-server-2 1194
;remote-random
resolv-retry infinite
nobind
;user nobody
;group nobody
persist-key
persist-tun
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
;mute-replay-warnings
ca ca.crt
cert openwrt.crt
key openwrt.key
remote-cert-tls server
;tls-auth ta.key 1
cipher AES-256-CBC
comp-lzo
verb 3
;mute 20

2. 测试运行,如果不成功会有提示

1
openvpn --config client.conf

3. 在服务器端输入以下命令测试

1
2
3
ping 10.8.0.2 -c 4
ping 192.168.1.1 -c 4
ping 10.20.208.12 -c 4

如果能够正常运行,说明客户端和配置都没有问题

#11 配置OpenVPN Client

1. 使用scp,把证书传到/etc/luci-uploads/文件夹(没有就创建), 传好后目录内容如下:

1
2
3
/etc/luci-uploads/ca.crt
/etc/luci-uploads/openwrt.crt
/etc/luci-uploads/openwrt.key

2. 登录ssh,编辑openvpn配置文件

1
vi /etc/config/openvpn

把以下内容添加到最后面,并保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
config openvpn 'openwrt'
option enabled '1'
option float '1'
option client '1'
option nobind '1'
option comp_lzo 'yes'
option reneg_sec '0'
option dev 'tun'
option verb '3'
option persist_tun '1'
option persist_key '1'
option remote_cert_tls 'server'
list remote 'x.x.x.x 1194' # 此处要设置成服务器的地址
option ca '/etc/luci-uploads/ca.crt'
option cert '/etc/luci-uploads/openwrt.crt'
option key '/etc/luci-uploads/openwrt.key'
option resolv_retry 'infinite'
option keepalive '10 120'
option log '/tmp/openvpn.log'
option log_append '/tmp/openvpn.log'
option cipher 'AES-256-CBC'

#12 启动Openvpn Client

登录openwrt的Web设置界面,找到openvpn,点击启用,然后再点start就可以了。
如果有配置问题,可以输入命令查看日志

1
cat /tmp/openvpn.log

到此,服务端和客户端都已经搭建完成。如果有需要可以再测试一下连通。

#13 参考文章

ECS服务器OPENVPN搭建,方便管理所有内网服务器
阿里云CentOS服务器上搭建openvpn
通过OpenWrt路由器和OpenVPN实现两地局域网互联

坚持原创技术分享,您的支持将鼓励我继续创作!