openvpn☞安装

阅读量: zyh 2018-03-22 09:34:44
Categories: Tags:

前言

openvpn 一般用于小公司远程连接公司办公网络环境,此脚本需要一个linux系统的主机。
至于土豪公司,可以无视。
文档包含安装脚本,创建用户脚本,删除用户脚本。使用的时候,安装脚本和创建用户脚本,需要自行修改一些变量。

需要注意的是,发现移动网络连接其它运营商网络的时候,不稳定。
比如我这边,移动网络连接电信网络(openvpn所在网络),就容易丢包。

安装

💥以下命令需逐行执行,不能复制批量执行,因为中间需要自行添加变量,以及手动输入一些信息

yum install docker
docker pull kylemanna/openvpn
OVPN_DATA="/root/ovpn-data"
IP="服务器主网卡ip"  # 自行修改
PORT=  # 容器映射的宿主机端口
mkdir ${OVPN_DATA}
docker run -v ${OVPN_DATA}:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u tcp://${IP}
docker run -v ${OVPN_DATA}:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki
# 输入组织机构名以及密码
docker run -v ${OVPN_DATA}:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.d/99-sysctl.conf && sysctl -p
docker run -v ${OVPN_DATA}:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > ${OVPN_DATA}/CLIENTNAME.ovpn
docker run --name openvpn -v ${OVPN_DATA}:/etc/openvpn -d -p ${PORT}:1194 --privileged kylemanna/openvpn

容器生成的服务器主配置

/root/ovpn-data/openvpn.conf

下面是一个改后的示例配置

server 192.168.255.0 255.255.255.0
verb 3
# 变更为容器里默认生成的
key /etc/openvpn/pki/private/<修改我>.key
ca /etc/openvpn/pki/ca.crt
# 变更为容器里默认生成的
cert /etc/openvpn/pki/issued/<修改我>.crt
dh /etc/openvpn/pki/dh.pem
tls-auth /etc/openvpn/pki/ta.key
key-direction 0
keepalive 10 60
persist-key
persist-tun

proto tcp
# Rely on Docker to do port mapping, internally always 1194
port 1194
dev tun0
status /tmp/openvpn-status.log

user nobody
group nogroup
comp-lzo no

### Route Configurations Below
route 192.168.254.0 255.255.255.0

### Push Configurations Below
push "block-outside-dns"
push "comp-lzo no"
### 开启 DNS 推送
push "dhcp-option DNS 223.5.5.5"
push "dhcp-option DNS 114.114.114.114"
### 添加 DNS 的路由
push "route 223.5.5.5 255.255.255.255"
push "route 114.114.114.114 255.255.255.255"
### 添加客户端需要通过openvpn访问的网络
push "route 10.100.0.0 255.255.0.0"

服务端dns推送与客户端全局路由的关系

如果客户端删除了全局路由 redirect-gateway def1;则服务端要么关闭 dns 推送,要么开启 dns 推送的同时,开启 dns 的相关路由。

如果客户端开启了全局路由 redirect-gateway def1;则服务端最好开启 dns 推送,但无需开启 dns 路由。

示例,客户仅部分网络需要走openvpn,其余网络走本地,且需要通过公司dns解析域名。

服务端配置:开启 dns 推送和 dns 路由

push "dhcp-option DNS 公司dns地址"
push "dhcp-option DNS 114.114.114.114"
push "route 公司dns地址 255.255.255.255"
push "route 114.114.114.114 255.255.255.255"
push "route 需要走openvpn的网段和掩码"

客户端配置:关闭全局路由

# redirect-gateway def1

创建用户脚本

https://github.com/kylemanna/docker-openvpn/blob/master/docs/clients.md#revoking-client-certificates

👙需要注意的是,下列脚本中,有两个 sed 命令是需要自行修改ip的。

sed -i "s/1194/<外网端口>/" ${OVPN_DATA}/${CLIENTNAME}.ovpn # 修改我
sed -i "s/<服务器内网IP>/<客户端连接的外网IP>/" ${OVPN_DATA}/${CLIENTNAME}.ovpn  # 修改我
#!/bin/bash
# 如果是nat后的内网ip,则需要修改配置文件里的ip为外网ip
# bash xxx.sh <用户名>
[[ -z $1 ]] && exit
CLIENTNAME=$1
OVPN_DATA="/root/ovpn-data"
docker run -v ${OVPN_DATA}:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full ${CLIENTNAME} nopass
docker run -v ${OVPN_DATA}:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient $CLIENTNAME > ${OVPN_DATA}/${CLIENTNAME}.ovpn
sed -i '1a comp-lzo' ${OVPN_DATA}/${CLIENTNAME}.ovpn
sed -i '2a tun-mtu 1500' ${OVPN_DATA}/${CLIENTNAME}.ovpn
sed -i '3a auth-nocache' ${OVPN_DATA}/${CLIENTNAME}.ovpn
sed -i "s/1194/<外网端口>/" ${OVPN_DATA}/${CLIENTNAME}.ovpn                   # 修改我
sed -i "s/<服务器内网IP>/<客户端连接的外网IP>/" ${OVPN_DATA}/${CLIENTNAME}.ovpn  # 修改我
read -p '是否关闭全局路由,(y)关闭全局路由,仅当客户端匹配下发路由时才走openvpn.[确保服务端没有开启DNS推送,若开启则添加对应的DNS路由];(n)开启全局路由,客户端所有流量均走openvpn.[确保服务端开启了DNS推送]:' yn
[[ $yn == 'y' ]] && sed -i '/redirect-gateway def1/d' ${OVPN_DATA}/${CLIENTNAME}.ovpn
mkdir -pv /root/users/${CLIENTNAME}
cp ${OVPN_DATA}/pki/private/${CLIENTNAME}.key /root/users/${CLIENTNAME}
cp ${OVPN_DATA}/pki/issued/${CLIENTNAME}.crt /root/users/${CLIENTNAME}
cp ${OVPN_DATA}/${CLIENTNAME}.ovpn /root/users/${CLIENTNAME}
cd /root/users/
tar zcf ${CLIENTNAME}.tar.gz ${CLIENTNAME}
echo "`pwd`/${CLIENTNAME}.tar.gz"
echo "################################################"
cat /root/users/${CLIENTNAME}/${CLIENTNAME}.ovpn
#sz ${CLIENTNAME}.tar.gz

删除用户脚本

#!/bin/bash
# bash xxx.sh <用户名>
[[ -z $1 ]] && exit
CLIENTNAME=$1
OVPN_DATA="/root/ovpn-data"
docker run --rm -it -v $OVPN_DATA:/etc/openvpn kylemanna/openvpn ovpn_revokeclient ${CLIENTNAME} remove
cd /root/users
rm -rf ${CLIENTNAME}
rm -f ${CLIENTNAME}.tar.gz

列出用户

#!/bin/bash
OVPN_DATA="/root/ovpn-data"
docker run --rm -it -v $OVPN_DATA:/etc/openvpn kylemanna/openvpn ovpn_listclients