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

相关推荐
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng1 小时前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
paopaokaka_luck5 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
码农小旋风7 小时前
详解K8S--声明式API
后端
Peter_chq7 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml47 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~7 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616887 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
睡觉谁叫~~~9 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust