在OpenWRT上部署OpenVPN服务端
QQ805447391
20170128
转载请注明出处
1、部署一个可以在OpenWRT上稳定运行的OpenVPN Server,对连入虚拟专用网的外界用户提供内网的访问(诸如路由器管理,内网客户端之间互相通信,内网穿透,代理服务器,网络架设等服务)
2、用户可以通过用户名和密码以及相关的配置文件通过OpenVPN Client软件连入虚拟网络,也可以通过自登录配置一键连入网络。
3、支持proxy,用户可以自定义虚拟专用网络使用的端口号,可以有效的解决运营商的端口封杀。
4、用户在线状态控制,精确记录用户名及上线、离线的时间。用户的管理。
5、服务端防DDos攻击。
6、虚拟专用网内部通信。
7、(附属)利用frp技术跳出frp server,实现流量的点对点传输。进而实现内网无运营商或内网代理控制OpenVPN服务。
准备条件
1、OpenWRT 环境,可以利用手头闲置的路由,或者使用虚拟机,OpenWRT x86 等等。
2、OpenSSL环境,也可以使用PolarSSL,EasyRsa等等。这里我采用EasyRsa以及OpenSSL。
3、必要的网络环境,内外网即可,我们的目的是学会如何搭建服务,这里只需要提供简单的网络环境即可。
4、SSH客户端一台(我使用的是xShell+WinScp)
5、必要的准备文件(后文会提供)
开始
(提供luci配置法和conf配置法,最好都弄懂,因为luci对OpenVPN 的特性支持的不好)
1、更新软件源以及安装必要的组件
opkg update
opkg install openvpn-openssl luci-app-openvpn openvpn-easy-rsa libopenssl
可能会出现找不到组件的问题,文章附后部分提供我使用的软件源,请自行切换可用的软件源以安装或更新组件。
以上步骤完成之后,luci界面即可出现
新手建议使用luci配置,我会一步步的截图,老鸟建议别看我的文章了,没啥用~
2、OpenVPN准备
a、生成CA证书,cert,key,ta,pem
定位到/etc/easy-rsa/vars文件,将以下字段改成自己的值。(非必须,但是学过加密就会知道ca就相当于证书颁发机构,把ca的信息配置成自己的会符合规范)
ssh下:
cd /etc/easy-rsa #进入工作目录,这是我的工作目录 = =
./clean-all #清除以前生成的证书(非必须,弹药理解作用)
source ./vars #将vars配置的环境变量读入
./build-ca #构建CA
./build-key-server server #构建server.csr
./build-key client #构建client.csr
./build-dh #构建2048位大质数pem,生成的时间会很长,如果嫌长,在vars中改或更小值即可,我使用的是1024,在我的mt7620a性能下,2分钟即可生成dh???.pem。
./sign-req –server server #使用CA签名server.csr生成server.crt,一路y即可,注意,OpenWRT的easyrsa对server签名的时候存在bug,需要加—server参数才能正常的对server.csr签名。
./sign-req client #使用CA签名client.csr生成client.crt,一路y即可
./openvpn --genkey --secret ./keys/ta.key #生成ta.key,用来进行tls_auth
出错的话,把每条命令前面的./去掉试试。
执行成功的话,此时在/etc/easy-rsa/keys文件夹里面即可出现以下文件:
b、配置准备
netstat –apn查看端口是否与自己想使用的端口有冲突,并且加以解决。
3、开始搭建
在luci中新建一个多用户服务器,使用tun(routed),点击add按钮。
依照下图配置各个属性。
(*)或者使用conf配置,配置单如下:
配置好之后保存自己的配置,在luci中的oepnvpn界面手动启动这个vpn并执行即可。
运行成功之后是介个样纸的:
运行netstat –apn查看当前端口的使用情况,可见1198已启动。
这时候就可以使用ovpn配置文件连接到改OpenVPN服务器了。
ovpn 的配置方式我不做详细阐述,只提供我自己使用的ovpn。(附后)
4、密码认证功能(*)
有的同学想通过用户名以及密码连接OpenVPN怎么办呢?
首先需要配置luci或者conf:
对应的conf:
之后编写login.sh
#!/bin/sh
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman <[email protected]>
#
# This script will authenticate OpenVPN users against
# a plain text file. The passfile should simply contain
# one row per user with the username first followed by
# one or more space(s) or tab(s) and then the password.
PASSFILE="/etc/openvpn/password"
LOG_FILE="/var/log/openvpn-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`
###########################################################
if [ ! -r "${PASSFILE}" ]; then
echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
exit 1
fi
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
if [ "${CORRECT_PASSWORD}" = "" ]; then
echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
fi
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
exit 0
fi
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
然后配置密码文件password:
最后在客户机ovpn配置文件里面添加:auth-user-pass即可。当然也可以实现用户的自动登录,这个知识点自己去研究吧,我就不说了,手好累= =
此时通过客户端连入OpenVPN服务器,就会出现输入密码的界面:
可能出现的错误以及解决方案
1、Authenticate/Decrypt packet error: packet HMAC authentication failed
检查ca,cert,key,ta是否对应。
检查auth算法和cipher算法。
检查服务端tls_auth中的0字段。
写在后面
0、这里需要说明一下为何不用client_cert_not_request参数,其实openvpn二进制是支持该参数的,但是如果我们使用luci配置的话,是无法使用的,因为luci并没有提供给我们这个参数的选项== ,所以这里我采用了cs双重认证的方式搭建server。
1、软件源(个人自用的,需要自己配置)
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
option force_checksum 0
arch all 100
arch ralink 200
arch ramips 300
arch ramips_24kec 400
# src/gz pdr_mt7620_base http://downloads.pandorabox.com.cn/pandorabox/packages/mt7620/packages/base
# src/gz pdr_mt7620_luci http://downloads.pandorabox.com.cn/pandorabox/packages/mt7620/packages/luci
# src/gz pdr_mt7620_packages http://downloads.pandorabox.com.cn/pandorabox/packages/mt7620/packages/packages
src/gz pdr_compat_base http://downloads.pandorabox.com.cn/pandorabox/packages/mipsel_24kec_dsp/base
src/gz pdr_compat_luci http://downloads.pandorabox.com.cn/pandorabox/packages/mipsel_24kec_dsp/luci
src/gz pdr_compat_packages http://downloads.pandorabox.com.cn/pandorabox/packages/mipsel_24kec_dsp/packages
src/gz pdr_compat_lafite http://downloads.pandorabox.com.cn/pandorabox/packages/mipsel_24kec_dsp/lafite
src/gz pdr_compat_mtkdrv http://downloads.pandorabox.com.cn/pandorabox/packages/mipsel_24kec_dsp/mtkdrv
#src/gz op_b0_base http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/base
#src/gz op_b0_luci http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/luci
#src/gz op_b0_management http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/management
#src/gz op_b0_packages http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/packages
#src/gz op_b0_old http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/oldpackages
#src/gz op_b0_routing http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/routing
#src/gz op_b0_telephony http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/telephony
2、我自己的ovpn文件。
client
dev tun
proto tcp-client
remote 192.168.2.1 1198 #我的网关的ip,端口
resolv-retry infinite
;float
nobind
persist-key
persist-tun
#auth SHA256
#cipher BF-CBC
nice 0
verb 3
mute 10
#auth-user-pass
ns-cert-type server
comp-lzo
<ca>
xxx
</ca>
<cert>
xxx
</cert>
<key>
xxx
</key>
key-direction 1
<tls-auth>
xxx
</tls-auth>
####################### 带密码的ovpn ##################
client
dev tun
proto tcp-client
remote 192.168.2.1 1195
resolv-retry infinite
;float
nobind
persist-key
persist-tun
#auth SHA256
#cipher BF-CBC
nice 0
verb 3
mute 10
auth-user-pass
ns-cert-type server
comp-lzo
<ca>
xxx
</ca>
<cert>
xxx
</cert>
<key>
xxx
</key>
key-direction 1
<tls-auth>
xxx
</tls-auth>