构建特定版本的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 小时前
推荐 12 款开源美观、简单易用的 WPF UI 控件库,让 WPF 应用界面焕然一新!
后端·.net
Jagger_1 小时前
敏捷开发流程-精简版
前端·后端
苏打水com2 小时前
数据库进阶实战:从性能优化到分布式架构的核心突破
数据库·后端
间彧3 小时前
Spring Cloud Gateway与Kong或Nginx等API网关相比有哪些优劣势?
后端
间彧3 小时前
如何基于Spring Cloud Gateway实现灰度发布的具体配置示例?
后端
间彧3 小时前
在实际项目中如何设计一个高可用的Spring Cloud Gateway集群?
后端
间彧3 小时前
如何为Spring Cloud Gateway配置具体的负载均衡策略?
后端
间彧3 小时前
Spring Cloud Gateway详解与应用实战
后端
EnCi Zheng5 小时前
SpringBoot 配置文件完全指南-从入门到精通
java·spring boot·后端
烙印6015 小时前
Spring容器的心脏:深度解析refresh()方法(上)
java·后端·spring