#隧道 #TCP #客户端-服务器 #协议 #CLI #代理 #客户端连接

应用 tcp-warp-cli

两个主机之间的用户空间隧道,将客户端机器上的端口映射到服务器机器可访问的地址

2个不稳定版本

0.2.0 2019年12月24日
0.1.0 2019年12月22日

#20#客户端连接

Unlicense OR MIT

67KB
1K SLoC

两个主机之间的用户空间隧道,将客户端机器上的端口映射到服务器机器可访问的地址

Linux build status Windows build status Crates.io Packaging status

双重授权许可,受 MITUNLICENSE 框架保护。

功能

  1. 创建一个用户空间隧道,将客户端网络上的端口与服务器端可用的连接连接起来。
  2. 只使用单个端口。
  3. 客户端将地址推送到服务器以进行连接。

安装

使用 cargo

cargo install tcp-warp-cli

用法

要创建隧道,我们需要启动一个监听某个端口的服务器,然后用客户端连接到它。

Docker服务器部分的使用

docker run --rm -d -p 18000:18000 tcpwarp/tcpwarp

或使用自定义监听端口(例如:18234)

docker run --rm -d -p 18234:18234 tcpwarp/tcpwarp tcp-warp server --listen=0.0.0.0:18234

简单的本地端口映射器

  1. 启动服务器

    tcp-warp server
    
  2. 启动客户端

    tcp-warp client -c 8080:towel.blinkenlights.nl:23
    
  3. 享受展示

    nc 127.0.0.1 8080
    
  4. 此示例使用默认的监听和连接接口。在实际场景中,您至少需要向客户端提供-t / --tunnel参数

    tcp-warp client -t host:port ...
    

客户端和服务器都有监听传入连接的地址,客户端还有一个指定连接地址的参数。

接下来,我们将看到一个更具体的示例。

用例:在没有安装Docker守护进程的机器上运行Docker,Docker守护进程节点位于SSH后面

背景

  • 客户端:客户端机器运行Windows,安装了Windows版本的tcp-warp和Docker CLI。客户端无法运行Docker守护进程。
  • 公共:可通过SSH访问的主节点,可以从中访问Docker守护进程节点。
  • docker:可以通过SSH访问的Docker守护进程节点。

目标

在TCP传输上运行Docker,允许client构建和运行容器。环境应适用于每个开发人员,而不受其他开发人员的影响。

解决方案

docker机器上运行Docker-in-Docker容器(dind),使用TCP主机协议。在client上使用DOCKER_HOST环境变量连接到dinddind绑定到docker主机上的主机端口,并通过SSH端口转发通过public转发。

命令序列可以是以下内容

初始序列(安装)

  1. 转到docker节点并启动所需的容器

    user@client $ ssh user1@public
    user1@public $ ssh user2@docker
    user2@docker $ docker run --rm --privileged -p 2375:2375 -p 18000:18000 -d --name some-docker docker:dind dockerd --host=tcp://0.0.0.0:2375
    user2@docker $ DOCKER_HOST=tcp://127.0.0.1:2375 docker run --rm -p 18000:18000 -d --name some-docker-tcp-warp tcpwarp/tcpwarp
    
  2. dockerpublic节点断开连接。

正常序列(使用)

  1. 使用 ssh 连接到 public 节点,并转发 tcp-warp 的端口

    ssh -L 18000:docker:18000 user1@public
    
  2. client 机器上使用 tcp-warp 客户端 连接到 Docker 守护进程

    tcp-warp client -c 10001:172.18.0.1:2375
    

    172.18.0.1dind 中主机节点的地址。

  3. client 机器上导出 DOCKER_HOST 环境变量

    export DOCKER_HOST=tcp://127.0.0.1:10001
    
  4. client 运行 docker 命令

    docker ps
    docker run hello-world
    docker run -it alpine ash
    

附加服务

我们可以启动附加服务,并为这些服务使用附加的 -c 重新启动 tcp-warp 客户端

使用 whoami 服务的一个简单示例

  1. 创建用于主机名解析的网络。完成上述所有步骤后启动 whoami 服务。将 tcp-warp 容器连接到新网络

    docker network create our-network
    docker run --rm -d --net our-network --name whoami containous/whoami
    docker network connect our-network some-docker-tcp-warp
    
  2. 停止 tcp-warp 客户端。使用为 whoami 服务提供的附加端口映射启动它

    tcp-warp client -c 10001:172.18.0.1:2375 -c 8080:whoami:80
    
  3. 测试 whoami 服务

    $ curl https://127.0.0.1:8080/
    Hostname: 9fe704cf0e87
    IP: 127.0.0.1
    IP: 172.18.0.3
    IP: 172.19.0.3
    RemoteAddr: 172.19.0.2:44612
    GET / HTTP/1.1
    Host: localhost:8080
    User-Agent: curl/7.64.1
    Accept: */*
    

依赖关系

~10-19MB
~230K SLoC