构建特定版本的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访问还要好多坑要填平,敬请期待。

相关推荐
bcbnb14 分钟前
iOS App混淆实战案例:如何用多工具组合提高App安全性
后端
柠檬树上柠檬果15 分钟前
回溯算法总结
后端
真夜19 分钟前
个人spring-boot问题记录
java·后端
程序员小奕20 分钟前
springboot 百货中心供应链管理系统小程序
java·spring boot·后端
刘白Live30 分钟前
【Java】为什么有时候执行countDownLatch+线程池查询列表会丢失数据?
java·后端
梁凌锐1 小时前
重构手法——代码健壮性增强类 | 防御性编程 | 引入特殊情况类
后端
蒋蜀黍1 小时前
Go + open ai 实现一个 mini manus
后端
及丫丫1 小时前
SpringBoot集成MQTT客户端
后端
用户28988180666421 小时前
Sarama消费组初始化阻塞问题排查
后端·go
Java中文社群1 小时前
超实用!手把手教你Dify版本升级
人工智能·后端