Docker实战CentOS7下基于密码认证的OpenVPN搭建与使用

OpenVPN

测试环境描述

  • 模拟外网: 172.25.1.0/24
  • 模拟内网: 172.25.2.0/24
  • 服务端双网卡,外网为 172.25.1.2, 内网为 127.25.2.2
  • 内网一主机为 172.25.2.3
  • 客户端在外网,ip 设为 172.25.1.3

Docker搭建测试环境

  • 创建测试网络
# 创建外网
docker network create --driver bridge --subnet 172.25.1.0/24 --gateway 172.25.1.1 test_bridge_1
# 创建内网
docker network create --driver bridge --subnet 172.25.2.0/24 --gateway 172.25.2.1 test_bridge_2
  • 创建测试容器
# 创建服务端,命名为 centos7_vpn_server1,连接两个网络,外网为 172.25.1.2, 内网为 127.25.2.2
docker run -itd --privileged --name centos7_vpn_server1 --network test_bridge_1 --ip 172.25.1.2 centos:7.9.2009 /usr/sbin/init
docker network connect test_bridge_2 --ip 172.25.2.2 centos7_vpn_server1

# 创建一外网客户端,命名为 centos7_vpn_client1,ip 为 172.25.1.3
docker run -itd --privileged --name centos7_vpn_client1 --network test_bridge_1 --ip 172.25.1.3 centos:7.9.2009 /usr/sbin/init

# 创建一内网主机,命名为 centos7_252_inet1,ip 为 172.25.2.3
docker run -itd --privileged --name centos7_252_inet1 --network test_bridge_2 --ip 172.25.2.3 centos:7.9.2009 /usr/sbin/init
创建与启动容器
  • 分别用新窗口进入容器
# 进入服务端
docker exec -it centos7_vpn_server1 bash
# 进入客户端
docker exec -it centos7_vpn_client1 bash
# 进入内网主机
docker exec -it centos7_252_inet1 bash
  • 全都安装 net-tools ,然后进行 ping 测试;内网主机什么事都不用干,启动就行
yum -y install net-tools
服务端连接测试

客户端连接测试

内网主机IP地址

CentOS7下基于密码认证的OpenVPN服务端搭建与客户端的使用

服务端搭建

在本例中,服务端搭建将在 centos7_vpn_server1 中进行

服务端

安装 openvpn 与 easy-rsa

yum -y install epel-release
yum -y install openvpn easy-rsa

# 创建一个日志目录,后面我们会设置让 openvpn 直接以 root 用户运行
mkdir -p /var/log/openvpn

配置证书

  • 创建根证书与服务器证书
# copy easy-rsa 至 openvpn 目录下, easy-rsa版本(3.0.8)可以不一样,用 3.0 以上的就行
cp -r /usr/share/easy-rsa/3.0.8 /etc/openvpn/server/easy-rsa
cd /etc/openvpn/server/easy-rsa

# 初始化PKI目录
./easyrsa init-pki
# 根证书, 不设密码,(会被要求输入 Common Name,测试时随便输一个后按回车即可)
./easyrsa build-ca nopass
# 服务器证书,本例创建一个并命名为 server1,不设密码
./easyrsa build-server-full server1 nopass
# 创建Diffie-Hellman
./easyrsa gen-dh
  • 在 server 目录下生成 ta.key
cd /etc/openvpn/server
openvpn --genkey --secret ta.key
配置证书

用户管理

  • 创建目录
mkdir /etc/openvpn/server/user
  • 创建用户与密码文件, 本例定义为 users.txt, 格式为每一用户占一行,[用户名][空格或tab][密码]
touch /etc/openvpn/server/user/users.txt
# 创建一个测试用户,方便测试
echo "chongwen wen" >> /etc/openvpn/server/user/users.txt
  • 创建用户验证脚本,本例简单做下用户名密码判断,记下访问日志
touch /etc/openvpn/server/user/user_velify.sh
chmod +x /etc/openvpn/server/user/user_velify.sh
vi /etc/openvpn/server/user/user_velify.sh
#!/bin/bash

PASSFILE="/etc/openvpn/server/user/users.txt" # 用户文件
LOG_FILE="/var/log/openvpn/user_velify.log"

TIME_STAMP=`date "+%F %T"`

if [ ! -r "$PASSFILE" ]; then
    echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >>  $LOG_FILE
    exit 1
fi

CORRECT=`awk -v username="$username" -v password="$password" '$1==username && $2==password{print $0; exit}' "$PASSFILE"`

if [ -n "$CORRECT" ]; 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
:wq # vim 中保存退出
用户验证脚本

创建服务端配置文件

  • 服务端启动的命令为 systemctl start openvpn-server@.service.service,服务将读取 /etc/openvpn/server/.service.conf 为配置文件,即与@后面的.service是对应的。为了方便管理,我们可以创建任意名文件,然后复制份配置就行,比如本例创建server1
touch /etc/openvpn/server/server1.conf
cp /usr/lib/systemd/system/openvpn-server\@.service  /usr/lib/systemd/system/openvpn-server\@server1.service
vi /etc/openvpn/server/server1.conf
port 1194
proto tcp
dev tun
#dev tap0

# 运行用户与组,直接以root用户运行
user root
group root

# 配置证书信息
ca /etc/openvpn/server/easy-rsa/pki/ca.crt
cert /etc/openvpn/server/easy-rsa/pki/issued/server1.crt
key /etc/openvpn/server/easy-rsa/pki/private/server1.key
dh /etc/openvpn/server/easy-rsa/pki/dh.pem
tls-auth /etc/openvpn/server/ta.key 0

# 配置账号密码的认证方式
script-security 3
auth-user-pass-verify "/etc/openvpn/server/user/user_velify.sh" via-env  # 认证脚本
verify-client-cert none
username-as-common-name
client-to-client
duplicate-cn

# 配置网络信息
server 10.8.0.0 255.255.255.0
#server-bridge
client-to-client
# push "dhcp-option DNS 10.24.11.250"
# push "dhcp-option DNS 114.114.114.114"
# 这里开始配置你要连接的内网,本例要开的内网为 172.25.2.0/24,可以开多个,本例只开一个
push "route 172.25.2.0 255.255.255.0"

compress lzo
cipher AES-256-CBC
keepalive 10 120
persist-key
persist-tun
verb 3

# 日志
log /var/log/openvpn/server.log
log-append /var/log/openvpn/server.log
status /var/log/openvpn/status.log
:wq # vim 保存退出
服务端配置

启动 openvpn 服务端

  • 配置防火墙
# 如果没有安装防火墙,必须安装
yum -y install firewalld
systemctl start firewalld
systemctl enable firewalld

# 允许地址伪装SNAT
firewall-cmd --permanent --add-masquerade
# 添加1194端口(上面开放什么这里就开什么,本例配置的为 port 1194)
firewall-cmd --permanent --add-port=1194/tcp
# 防火墙重新加载配置
systemctl restart firewalld
# 或 firewall-cmd --reload
  • 启动与关闭
# 启动刚刚创建的 server1 服务
systemctl start openvpn-server@server1
# 开机启动(可选)
systemctl enable openvpn-server@server1
  • 查看
systemctl status openvpn-server@server1
netstat -ntpl | grep 1194
查看OpenVPN Server 状态
  • 关闭请使用 systemctl stop openvpn-server@server1 ,本例无需关闭,为下面的客户端提供服务。

客户端使用

在本例中,客户端搭建将在 centos7_vpn_client1 中进行

服务端

安装 openvpn

yum -y install epel-release
yum -y install openvpn

配置

  • 我们可以为不同服务器创建不同文件夹,用来存放对应服务器配置文件,方便管理,本例便为 server1 创建一个文件夹
mkdir /etc/openvpn/client/server1
  • 将服务端生成的一列文件复制到客户端中,本例用docker cp命令在宿主机中操作
    • cp 服务器的/etc/openvpn/server/easy-rsa/pki/ca.crt 到 客户端的/etc/openvpn/client/server1/ca.crt 下
    • cp 服务器的/etc/openvpn/server/ta.key 到 客户端的/etc/openvpn/client/server1/ta.key 下
    docker cp centos7_vpn_server1:/etc/openvpn/server/easy-rsa/pki/ca.crt ./
    docker cp centos7_vpn_server1:/etc/openvpn/server/ta.key ./
    docker cp ./ca.crt centos7_vpn_client1:/etc/openvpn/client/server1/
    docker cp ./ta.key centos7_vpn_client1:/etc/openvpn/client/server1/
    
    复制ca文件
  • 创建配置文件, 名字随意,本例使用 client
  • 客户端启动的命令为 systemctl start openvpn-client@.service,原理和上面服务器的差不多。为了方便管理,我们可以创建任意名文件,然后复制份配置就行,比如本例创建 client_for_server1.conf
touch /etc/openvpn/client/server1/client.conf
ln -sf /etc/openvpn/client/server1/client.conf /etc/openvpn/client/client_for_server1.conf
cp /usr/lib/systemd/system/openvpn-client\@.service /usr/lib/systemd/system/openvpn-client\@client_for_server1.service
vi /etc/openvpn/client/server1/client.conf
client

proto tcp
dev tun
auth-user-pass

remote 172.25.1.2 1194  # 写服务器的ip及端口,本例的服务器为 172.25.1.2

ca /etc/openvpn/client/server1/ca.crt
tls-auth /etc/openvpn/client/server1/ta.key 1

remote-cert-tls server
cipher AES-256-CBC
auth-nocache
persist-tun
persist-key
comp-lzo
verb 3
mute 10
:wq  # vim 保存退出
OpenVPN 客户端配置

启动与关闭

  • 启动时会要求输入用户名和密码,输入刚刚服务器搭建时设置的测试号 (panchongwen wen)
# 启动刚刚创建的 client_for_server1
systemctl start openvpn-client@client_for_server1
# 自己判断是否需要开机启动
# systemctl enable openvpn-client@client_for_server1
客户端启动与登录
  • 查看
systemctl status openvpn-client@client_for_server1
ps -ef | grep openvpn | grep -v grep
查看客户端状态
  • 启动成功后会网卡设置也就变了
ifconfig
查看客户端状态
  • 这时就可以 ping 通内网主机了
ping -c1 172.25.2.3 &> /dev/null && echo "yes" || echo "no"
ping 172.25.2.3
客户端连接内网
  • 关闭命令
systemctl stop openvpn-client@client_for_server1
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容