每日分享- 基于 Docker 如何搭建内网穿透服务

每日分享- 基于 Docker 如何搭建内网穿透服务

解决方案goocz2025-01-22 15:04:4711A+A-

内网穿透是指将内网中的计算机或者设备通过公网的方式暴露出去,使得公网中的设备可以访问到内网中的设备,从而达到远程访问的目的。在 Docker 中,可以通过搭建内网穿透服务来实现这一目的,常用的工具包括 frp 和 ngrok 等。

我们第一个以 frp 为例,介绍如何在 Docker 中搭建 frp 内网穿透服务。

第一步:安装 Docker

首先需要在服务器上安装 Docker,可以通过以下命令进行安装:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

第二步:创建配置文件

在 Docker 中使用 frp,需要先创建配置文件,这个配置文件需要包含以下信息:

  1. 服务器地址和端口:指定 frp 服务器监听的地址和端口。
  2. 远程访问地址和端口:指定内网中的设备的地址和端口。
  3. 认证信息:指定客户端连接时需要使用的用户名和密码。

创建配置文件的命令如下:

mkdir -p /opt/frp/conf && \
touch /opt/frp/conf/frps.ini && \
touch /opt/frp/conf/frpc.ini

在 frps.ini 中添加以下配置:

[common]
bind_port = 7000

在 frpc.ini 中添加以下配置:

[common]
server_addr = 服务器IP
server_port = 7000
token = 密码

[ssh]
type = tcp
local_ip = 内网IP
local_port = 22
remote_port = 6000

其中,[common] 部分为通用配置,包括服务器地址和端口以及认证信息;[ssh] 部分为具体需要暴露的内网设备的信息,包括设备类型、内网 IP 和端口以及需要映射到公网的端口号。

第三步:启动 frp 服务

在 Docker 中启动 frp 服务的命令如下:

docker run -d --name frps -p 7000:7000 -v /opt/frp/conf/frps.ini:/etc/frp/frps.ini sorahub/frps:0.34.3
docker run -d --name frpc -v /opt/frp/conf/frpc.ini:/etc/frp/frpc.ini sorahub/frpc:0.34.3

其中,frps 启动的是服务器端的 frp 服务,需要映射服务器端口 7000 到 Docker 容器端口 7000;frpc 启动的是客户端的 frp 服务,需要挂载客户端配置文件到 Docker 容器内。

第四步:测试 frp 服务

启动 frp 服务后,可以使用 ssh 命令测试是否可以访问内网设备:

ssh -p 6000 用户名@服务器IP

如果可以正常连接,则说明内网穿透服务已经搭建成功。

另外一个关于frp的例子:使用 frp 实现远程桌面访问

除了上述例子中的简单 TCP 连接,frp 还支持更加复杂的应用场景,例如远程桌面访问。在这种情况下,需要使用 frp 的 http 协议代理功能来转发远程桌面协议(如 RDP)的流量。

以下是具体步骤:

  1. 修改 frpc.ini 配置文件,添加如下配置:
[rdp]
type = tcp
local_ip = 内网IP
local_port = 3389
remote_port = 3389
use_encryption = true

[rdp_http]
type = http
local_ip = 内网IP
local_port = 3389
custom_domains = 远程访问域名
use_encryption = true
subdomain_host = true

其中,[rdp] 部分用于将 RDP 流量映射到公网端口 3389;[rdp_http] 部分用于将 http 流量映射到公网,实现代理转发功能。注意,需要在域名解析中添加远程访问域名的解析记录,将域名解析到服务器的 IP 地址上。

2 启动 frp 服务:

docker run -d --name frps -p 7000:7000 -v /opt/frp/conf/frps.ini:/etc/frp/frps.ini sorahub/frps:0.34.3
docker run -d --name frpc -v /opt/frp/conf/frpc.ini:/etc/frp/frpc.ini sorahub/frpc:0.34.3

3 在客户端上使用 RDP 客户端访问远程访问域名,即可实现远程桌面访问。

在这个例子中,frp 使用了 http 协议代理功能将 RDP 流量转发到公网,从而实现了远程桌面访问。这种方式相对于简单的 TCP 映射,具有更高的安全性和灵活性。当然,如果需要实现其他的应用场景,也可以根据具体情况进行配置。


接下来,我以ngrok为例再简单说一点:

ngrok 是一款开源的内网穿透工具,它可以让我们在公网上访问内网的服务器或应用。与 frp 不同的是,ngrok 不仅支持 TCP 和 UDP 端口转发,还支持 HTTP 和 HTTPS 流量转发,因此可以用于将内网的 web 应用程序暴露到公网。

下面是在 Docker 中使用 ngrok 搭建内网穿透服务的具体步骤:

1 创建一个 ngrok 配置文件 ngrok.yml,内容如下:

authtoken: YOUR_AUTH_TOKEN
tunnels:
  ssh:
    proto: tcp
    addr: 22
    hostname: ssh.example.com
  http:
    proto: http
    addr: 80
    hostname: http.example.com
  https:
    proto: http
    addr: 443
    hostname: https.example.com

这里的 YOUR_AUTH_TOKEN 是在 ngrok 官网上注册账号后获取到的认证 token,用于验证用户身份。在 tunnels 部分,我们定义了三个隧道:ssh、http 和 https。ssh 隧道用于转发内网的 SSH 服务,http 和 https 隧道用于转发内网的 web 应用程序。注意,这里的 hostname 需要是一个已经解析到公网 IP 的域名。

2 创建一个 Dockerfile 文件,用于构建 ngrok 的镜像,内容如下:

FROM golang:1.16-alpine as build
RUN apk add --no-cache git build-base
WORKDIR /go/src/github.com/inconshreveable/ngrok
RUN git clone https://github.com/inconshreveable/ngrok.git .
RUN make release-server

FROM alpine:3.14
COPY --from=build /go/src/github.com/inconshreveable/ngrok/bin/* /usr/local/bin/
RUN apk add --no-cache openssl
COPY ngrok.yml /etc/ngrok/ngrok.yml
CMD [ "ngrokd", "-tlsKey=/etc/ngrok/server.key", "-tlsCrt=/etc/ngrok/server.crt", "-domain=example.com", "-httpAddr=:80", "-httpsAddr=:443", "-tunnelAddr=:4443", "-log=stdout", "-config=/etc/ngrok/ngrok.yml" ]

这里我们使用了 Golang 1.16 和 Alpine 3.14 作为基础镜像,通过 git 和 make 构建 ngrok 服务器,并在最终的镜像中添加了 ngrok 配置文件和启动命令。

3 构建并运行 Docker 镜像:

# 构建镜像
docker build -t ngrok .
# 运行容器
docker run -d --name ngrok --restart always \
  -p 80:80 -p 443:443 -p 4443:4443 \
  -v /opt/ngrok/ngrok.yml:/etc/ngrok/ngrok.yml \
  -v /opt/ngrok/server.crt:/etc/ngrok/server.crt \
  -v /opt/ngrok/server.key:/etc/ngrok/server.key \
  ngrok

这里我们将本地的 ngrok.yml、server.crt 和 server.key 文件挂载到容器内部,并在 ngrok 镜像中启动 ngrokd 服务器,同时将容器内部的 80、443 和 4443 端口映射到主机的对应端口上。通过 -v 参数将 ngrok.yml、server.crt 和 server.key 文件挂载到容器内部的 /etc/ngrok 目录中,使得 ngrokd 可以读取到这些文件并进行配置。

这样,我们就成功地在 Docker 中搭建了一个 ngrok 内网穿透服务。通过访问公网 IP,即可访问内网的 web 应用程序和 SSH 服务。同时,由于 ngrok 支持 HTTPS 流量转发,因此我们的 web 应用程序可以获得更高的安全性。

举一个复杂的例子,假设我们有一个内网中运行的 Django Web 应用程序,需要暴露给外部用户访问。首先,在 Django 中启用 HTTPS,生成证书文件 server.crt 和 server.key,并将这两个文件放置到 /opt/django 目录中。

然后,我们在本地机器上使用 ngrok 命令行工具,将内网的 8000 端口转发到公网上,并使用自己的域名 http://example.com:

ngrok http -subdomain=example 8000

这样,我们就可以通过访问 https://example.ngrok.io 访问内网中运行的 Django Web 应用程序了。

接着,我们使用上面提到的 Dockerfile 和 ngrok.yml 文件,在 Docker 中构建和运行 ngrok 镜像。注意,在 ngrok.yml 文件中,我们需要将 http 和 https 的 hostname 配置为 http://example.com,这与上面使用 ngrok 命令行工具时设置的子域名相对应。

最后,我们将公网 IP 的 80 和 443 端口映射到 Docker 容器的对应端口上,并将 /opt/django/server.crt 和 /opt/django/server.key 文件挂载到 Docker 容器的 /etc/ngrok 目录中,使得 ngrokd 可以读取到这些文件并进行配置。启动 Docker 容器后,我们就可以通过访问 https://example.com 访问内网中运行的 Django Web 应用程序了。

ngrok 是一款功能强大的内网穿透工具,通过使用 Docker 构建 ngrok 镜像,我们可以快速搭建一个内网穿透服务,并将内网的 web 应用程序暴露到公网。

点击这里复制本文地址 以上内容由goocz整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

果子教程网 © All Rights Reserved.  蜀ICP备2024111239号-5