背景
最近公司的开发环境开启了openvpn
的访问,即如果要访问开发环境,则需要首先登录openvpn,通过openvpn来访问开发环境。由于公司的IT人员只提供Tunnelblick的客户端的接入,而我自己有一套本地的开发环境,使用的是ubuntu系统,而Tunnelblick不提供Linux版本,考虑到Tunnelblick其实就是openvpn的套壳,本质还是通过openvpn client进行的访问。
通过观察Tunnelblick的启动界面,可以看到其使用的openvpn版本是2.5.9,对应的OpenSSL使用的是v1.1.1v版本,为了与Tunnelblick的openvpn保持一致,因此决定手动构建一个openvpn-2.5.9-openSSLv1.1.1的版本。
构建环境
为了减少对宿主机环境的影响,选择在docker
中进行构建。为了尽可能的保持构建版本的兼容性,镜像版本选择与宿主机的os的版本保持一致Ubuntu-22.04。
构建步骤
由于对openssl的编译及构建不太熟悉,一开始并未直接通过Dockerfile的方式进行构建,而是pull基础镜像之后启动容器,通过在容器中手动执行相关编译命令得到最终的结果。最后通过docker命令将编译结果拷贝到宿主机上。
- 拉去并启动基础镜像:
arduino
docker run -d ubuntu:22.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"\n
以上命令通过在后台执行一个任务,确保容器在退出命令行之后不会自动退出。 2. 首先编译openssl
shell
apt updte
apt install -y wget make gcc zlib1g-dev
apt install --reinstall perl
wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
tar -zxvf openssl-1.1.1.tar.gz
cd openssl-1.1.1
./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib
make
make install
- 编译openvpn client
shell
export LDFLAGS="-L/usr/local/ssl/lib"
export CPPFLAGS="-I/usr/local/ssl/include"
apt install -y liblz4-dev libpam0g-dev libtool liblz4-dev python3-docutils git liblzo2-dev
git clone https://github.com/OpenVPN/openvpn.git
cd openvpn
git checkout v2.5.9
autoreconf -i -f
./configure --with-crypto-library=openssl
make
make install
在执行make install
命令之后,编译程序遇python-docutils
,这个包主要是用来生成openvpn文档,其对应的python3版本为python3-docutils。因此执行apt install python3-docutils
之后继续执行make install
命令,此时编译仍然提示缺少python-docutils依赖,其正确的做法是执行安装程序之后,需要重新执行 autoreconf -i
命令,该命令主要是用来重新生成configure
脚本。之后安装命令就可以正常执行了。
- 生成
.deb
包:生成deb包的方式有很多,这里选择了最简单的checkinstall
shell
apt install -y checkinstall
checkinstall --pkgname=openvpn-custom --pkgversion=1.0.0 --pkgarch=amd64 --nodoc --default
- 将生成的deb包拷贝到宿主机。
shell
docker cp ${containerId}:/root/openvpn-custom_1.0.0-1_amd64.deb ./
Dockerfile构建
在容器中完成openvpn的构建之后,希望将整个构建过程沉淀下来,使用Dockerfile是最好的方式,完整的Docker file如下:
Dockerfile
# 使用 Ubuntu 22.04 作为基础镜像
FROM ubuntu:22.04
# 设置工作目录
WORKDIR /root
# 安装必要的软件包
RUN apt update && \
apt install -y wget make gcc zlib1g-dev liblz4-dev libpam0g-dev libtool python3-docutils git liblzo2-dev checkinstall && \
apt install --reinstall perl && \
apt clean && \
rm -rf /var/lib/apt/lists/*
# 下载并安装 OpenSSL
RUN wget https://www.openssl.org/source/openssl-1.1.1.tar.gz && \
tar -zxvf openssl-1.1.1.tar.gz && \
cd openssl-1.1.1 && \
./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib && \
make && \
make install && \
cd ../ && \
rm -rf openssl-1.1.1.tar.gz openssl-1.1.1
# 设置环境变量以链接到 OpenSSL
ENV LDFLAGS="-L/usr/local/ssl/lib"
ENV CPPFLAGS="-I/usr/local/ssl/include"
# 克隆并安装 OpenVPN
RUN git clone https://github.com/OpenVPN/openvpn.git && \
cd openvpn && \
git checkout v2.5.9 && \
autoreconf -i -f && \
./configure --with-crypto-library=openssl && \
make && \
checkinstall --pkgname=openvpn-custom --pkgversion=1.0.0 --pkgarch=amd64 --nodoc --default
# 设置容器启动后执行的命令
CMD ["tail", "-f", "/dev/null"]
执行如下命令启动容器,然后使用docker cp命令将构建结果拷贝到宿主机。
ruby
docker run -d openvpn:v1
docker cp {containerId}:/root/openvpn/openvpn-custom_1.0.0-1_amd64.deb ./
小结
以上只是构建一个可以使用的openvpn,距离真正的openvpn访问还要好多坑要填平,敬请期待。