利用Docker+Pritunl搭建一个企业VPN,解决员工远程办公和访问云服务器的问题

这篇文档是对https://github.com/jippi/docker-pritunl README的翻译,提交MR,已经被作者接受合并到master分支。

在 Docker 中运行 Pritunl

Pritunl是与专有商业VPN产品(如Aviatrix和Pulse Secure)相比最优秀的开源替代方案。通过Pritunl,您可以构建支持数千个并发用户的庞大云VPN网络,并且无需为每个用户支付额外费用,从而更好地掌控您的VPN服务器。

docker镜像

所有的Docker镜像都在下面表格中:

不同的规格和版本的镜像标签(tags)可以在下面的表格中找到

TagVersion系统 (Ubuntu)MongoDBWireguard
latestlatest †Jammy (22.04)✅ (6.x)
latest-minimallatest †Jammy (22.04)
latest-focallatest †Focal (20.04)✅ (5.x)
latest-focal-minimallatest †Focal (20.04)
$version$versionJammy (22.04)✅ (6.x)
$version-minimal$versionJammy (22.04)
$version-focal$versionFocal (20.04)✅ (5.x)
$version-focal-minimal$versionFocal (20.04)

† 每晚(欧洲中部夏令时,约凌晨3点),自动化程序会检查Pritunl是否有新版本发布,因此最新版本的发布可能会有一两天的延迟。

获取默认的用户名和密码

运行下面的命令获取默认的登录用户名和密码:

docker exec -it [container_name] pritunl default-password

Ex:

docker exec -it pritunl pritunl default-password

配置

可以通过在docker run后面添加--env / -e 来使用配置。

  • PRITUNL_DONT_WRITE_CONFIG 如果设置, /etc/pritunl.conf 容器启动时将不会自动被重写. Any value will stop modifying the configuration file.
  • PRITUNL_DEBUG 只能为 true 或者 false - 控制 debug配置项,在需要调试时使用.
  • PRITUNL_BIND_ADDR 只能是服务器的某个ip - defaults to 0.0.0.0 - 控制 bind_addr 配置项,用于指定绑定要监听的ip.
  • PRITUNL_MONGODB_URI MongoDB 实例的 URI,如果未指定,默认是在容器内部启动一个本地 MongoDB 实例。 Any value will stop this behavior.

使用内置的 MongoDB

我建议使用Docker的volumebind挂载来处理持久化数据,如下面的示例所示:

docker run (with mongo)

data_dir=$(pwd)/data

mkdir -p $(data_dir)/pritunl $(data_dir)/mongodb
touch $(data_dir)/pritunl.conf

docker run \
    --name pritunl \
    --privileged \
    --network=host \
    --dns 127.0.0.1 \
    --restart=unless-stopped \
    --detach \
    --volume $(data_dir)/pritunl.conf:/etc/pritunl.conf \
    --volume $(data_dir)/pritunl:/var/lib/pritunl \
    --volume $(data_dir)/mongodb:/var/lib/mongodb \
    ghcr.io/jippi/docker-pritunl

docker-compose (with mongo)

data_dir=$(pwd)/data

mkdir -p $(data_dir)/pritunl $(data_dir)/mongodb
touch $(data_dir)/pritunl.conf

and then the following docker-compose.yaml file in $(pwd) followed by docker-compose up -d

version: '3.3'
services:
    pritunl:
        container_name: pritunl
        image: ghcr.io/jippi/docker-pritunl
        restart: unless-stopped
        privileged: true
        network_mode: host
        dns:
            - 127.0.0.1
        volumes:
            - './data/pritunl.conf:/etc/pritunl.conf'
            - './data/pritunl:/var/lib/pritunl'
            - './data/mongodb:/var/lib/mongodb'

不使用内容的 MongoDB

我建议使用Docker的volumebind挂载来处理持久化数据,如下面的示例所示:

如果您想要使用其他地方运行的MongoDB,您可以通过设置PRITUNL_MONGODB_URI环境变量来实现,就像下面的示例中所展示的那样。

docker run (without mongo)

data_dir=$(pwd)/data

mkdir -p $(data_dir)/pritunl
touch $(data_dir)/pritunl.conf

docker run \
    --name pritunl \
    --privileged \
    --network=host \
    --dns 127.0.0.1 \
    --restart=unless-stopped \
    --detach \
    --volume $(data_dir)/pritunl.conf:/etc/pritunl.conf \
    --volume $(data_dir)/pritunl:/var/lib/pritunl \
    --env PRITUNL_MONGODB_URI=mongodb://some-mongo-host:27017/pritunl \
    ghcr.io/jippi/docker-pritunl

docker-compose (without mongo)

data_dir=$(pwd)/data

mkdir -p $(data_dir)/pritunl
touch $(data_dir)/pritunl.conf

在当前目录($(pwd))将下面内容添加到docker-compose.yaml文件中,然后执行docker-compose up -d

version: '3.3'
services:
    pritunl:
        container_name: pritunl
        image: ghcr.io/jippi/docker-pritunl
        restart: unless-stopped
        privileged: true
        network_mode: host
        dns:
            - 127.0.0.1
        environment:
            - PRITUNL_MONGODB_URI=mongodb://some-mongo-host:27017/pritunl
        volumes:
            - './data/pritunl.conf:/etc/pritunl.conf'
            - './data/pritunl:/var/lib/pritunl'

Network mode

如果您不想使用network=host,请将--network=host命令行选项 替换为以下端口加上您配置的Pritunl服务器所需的任何端口。

    --publish 80:80 \
    --publish 443:443 \
    --publish 1194:1194 \
    --publish 1194:1194/udp \

如果在使用的是 docker-compose,请将network_mode: host 替换为以下端口加上您配置的Pritunl服务器所需的任何端口。

         ports:
            - '80:80'
            - '443:443'
            - '1194:1194'
            - '1194:1194/udp'

升级 MongoDB

重要: 停止你的 pritunl docker 容器 (docker stop pritunl) 在执行下面步骤前

升级的模式基本相同,唯一的变化是MongoDB的版本号,文档可以在这里找到:

自动升级脚本

我制作了一个小脚本叫做 mongo-upgrade.sh ,您可以下载到您的服务器并运行它。它会尽力引导您完成升级所需的步骤。

# fetch the script
wget -O mongo-upgrade.sh https://raw.githubusercontent.com/jippi/docker-pritunl/master/mongo-upgrade.sh
# make it executable
chmod +x mongo-upgrade.sh
# edit settings
vi mongo-upgrade.sh
# run
./mongo-upgrade.sh

手动升级

假设你的版本是 3.2, 要升级的版不能是 3.6 你需要设置环境变量 $NEXT_VERSION_TO_UPGRADE_TO=3.6 并且运行下面命令。

您可以在上述脚本中查看您需要运行的版本列表。

从3.2版本升级到4.4版本的示例路径意味着需要按照以下值的每个NEXT_VERSION_TO_UPGRADE_TO运行脚本一次:

  • NEXT_VERSION_TO_UPGRADE_TO=3.2
  • NEXT_VERSION_TO_UPGRADE_TO=3.6
  • NEXT_VERSION_TO_UPGRADE_TO=4.0
  • NEXT_VERSION_TO_UPGRADE_TO=4.2
  • NEXT_VERSION_TO_UPGRADE_TO=4.4
NEXT_VERSION_TO_UPGRADE_TO=
MONGODB_DATA_PATH=$PATH_TO_YOUR_MONGODB_DB_FOLDER # must point to the directory where files like `mongod.lock` and `journal/` are on disk.

# Start MongoDB server
docker run -d --name temp-mongo-server --rm -it -v ${MONGODB_DATA_PATH}:/data/db mongo:${NEXT_VERSION_TO_UPGRADE_TO}

# Wait for server to start
sleep 5

# change setFeatureCompatibilityVersion to current version
docker exec temp-mongo-server mongo admin --quiet --eval "db.adminCommand( { setFeatureCompatibilityVersion: \"${NEXT_VERSION_TO_UPGRADE_TO}\" } );"

# stop the server gracefully
docker exec -it temp-mongo-server mongo admin --quiet --eval "db.shutdownServer()"

# Wait for the server to stop
sleep 5

# make sure container is stopped
docker stop temp-mongo-server

# remove container
docker rm -f temp-mongo-server

# repair / upgrade data
docker run --rm --volume ${MONGODB_DATA_PATH}:/data/db mongo:${NEXT_VERSION_TO_UPGRADE_TO} --repair

进一步的帮助和文档请参考以下内容:

如果需要有关Pritunl的特定帮助,请查看以下网址:http://pritunl.comhttps://github.com/pritunl/pritunl


广告
我编写了一个golang 依赖注入框架,写web服务超级方便:
github地址:https://github.com/gone-io/gone
文档地址:https://goner.fun/zh/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dapeng-大鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值