构建特定版本的openvpn

背景

最近公司的开发环境开启了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命令将编译结果拷贝到宿主机上。

  1. 拉去并启动基础镜像:
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
  1. 编译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脚本。之后安装命令就可以正常执行了。

  1. 生成.deb包:生成deb包的方式有很多,这里选择了最简单的checkinstall
shell 复制代码
apt install -y checkinstall
checkinstall --pkgname=openvpn-custom --pkgversion=1.0.0 --pkgarch=amd64 --nodoc --default
  1. 将生成的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访问还要好多坑要填平,敬请期待。

相关推荐
武子康1 小时前
Java-72 深入浅出 RPC Dubbo 上手 生产者模块详解
java·spring boot·分布式·后端·rpc·dubbo·nio
椰椰椰耶3 小时前
【Spring】拦截器详解
java·后端·spring
brzhang4 小时前
我操,终于有人把 AI 大佬们 PUA 程序员的套路给讲明白了!
前端·后端·架构
wan_da_ren6 小时前
JVM监控及诊断工具-GUI篇
java·开发语言·jvm·后端
【本人】6 小时前
Django基础(一)———创建与启动
后端·python·django
lifallen6 小时前
Kafka 时间轮深度解析:如何O(1)处理定时任务
java·数据结构·分布式·后端·算法·kafka
你的人类朋友7 小时前
【✈️速通】什么是SIT,什么是UAT?
后端·单元测试·测试
程序无bug9 小时前
后端3行代码写出8个接口!
java·后端
绝无仅有9 小时前
使用LNMP一键安装包安装PHP、Nginx、Redis、Swoole、OPcache
后端·面试·github
他日若遂凌云志9 小时前
C++ 与 Lua 交互全链路解析:基于Lua5.4.8的源码剖析
后端