使用 @nwtgck 的管道服务器作为中继的安全、多路复用 TCP/UDP 端口转发器。主要设计用于(多个)NAT/防火墙后面的对等点之间的 p2p 连接。
对于IPFS的特殊情况,请参阅下面的#examples。
ID:每个节点都有一个唯一的(base64)ID -
tunnel -i
ID 与硬件(MAC 地址)和环境变量 USER、HOME 和 HOSTNAME 绑定。与您的同行一劳永逸地分享。注意:同一台机器上的两个用户被赋予不同的节点 ID,因为他们的 USER 和 HOME 变量不同。
服务器模式:向与您共享任何秘密字符串的对等方公开您的本地端口 -
tunnel [options] [-u] [-k < shared-secret > ] < local-port >
客户端模式:将您的本地端口转发到对等方公开的本地端口 -
tunnel [options] [-u] [-k < shared-secret > ] [-b < local-port > ] [-I < IP > ] < peer-ID:peer-port >
如果使用-b
选项未提供本地端口,则tunnel
将使用随机未使用的端口。使用的端口始终在标准输出中报告。
当客户端在笔记本电脑上运行且偶尔连接到服务器所在的 LAN 时, -I
选项非常方便。当可以在 LAN 上找到服务器且私有 IP = <IP>
时, tunnel
将通过 LAN 进行连接。
客户端和服务器必须使用相同的密钥才能相互连接。也可以使用环境变量TUNNEL_KEY
传递秘密字符串。使用-k
传递的秘密优先。
-u
标志表示使用 UDP 而不是默认的 TCP。如果使用,则必须由双方使用。
默认情况下,所有日志都位于 stderr。然而,使用-l <logfile>
选项,可以在后台(守护进程模式)启动tunnel
,并将日志转储到<logfile>
。守护进程进程 ID 在启动期间向用户显示,以便他可以随时终止守护进程
tunnel -K < procID >
选项:
有关选项的完整列表,请参阅: tunnel -h
下载:
curl -LO https://raw.githubusercontent.com/SomajitDey/tunnel/main/tunnel
使其可执行:
chmod +rx ./tunnel
然后在系统范围内安装:
./tunnel -c install
如果您没有sudo
权限,您可以本地安装:
./tunnel -c install -l
安装后随时更新:
tunnel -c update
该程序只是一个可执行的bash
脚本,依赖于标准GNU工具,包括socat
、 openssl
、 curl
、 mktemp
、 cut
、 awk
、 sed
、 flock
、 pkill
、 dd
、 xxd
、 base64
等,这些工具在标准Linux发行版上很容易获得。
如果您的系统缺少任何这些工具,并且您没有从本机软件包存储库安装它所需的sudo
权限(例如sudo apt-get install <package>
),请尝试下载便携式二进制文件并在本地安装它${HOME}/.bin
。
SSH :
对等点 A 公开本地 SSH 端口 -
tunnel -k " ${secret} " 22
对等点 B 连接 -
tunnel -b 67868 -k " ${secret} " -l /dev/null " ${peerA_ID} :22 " # Daemon due to -l
ssh -l " ${login_name} " -p 67868 localhost
IPFS :
让对等点 A 具有 IPFS-peer-ID: 12orQmAlphanumeric
。她的 IPFS 守护进程侦听默认 TCP 端口 4001。她使用 - 公开它
tunnel -k " ${swarm_key} " ipfs
swarm_key
只是对等点 A 可以用来控制谁可以使用tunnel
swarm 连接到她的任何秘密字符串。
对等点 B 现在与对等点 A 连接以进行文件共享、pubsub 或 p2p -
tunnel -k " ${swarm_key} " 12orQmAlphanumeric
最后一个命令 swarm 通过管道服务器中继连接到对等点 A,并在后台每隔几秒保持 swarm 连接以保持连接处于活动状态。
tunnel
会在后台启动 IPFS 守护进程(如果尚未激活)。
IPFS 存储库的路径可以使用选项-r
传递。否则,照常使用环境变量IPFS_PATH
或默认路径~/.ipfs
。示例: tunnel -r ~/.ipfs -i
给出 IPFS 对等 ID。
远程外壳:
假设您经常需要从家用计算机在工作场所的 Linux 机器上启动命令。由于某种原因,您不想/不能通过tunnel
使用 SSH。
在工作场所计算机上,公开一些随机的本地 TCP 端口,例如 49090 并将 shell 连接到该端口:
tunnel -l " /tmp/tunnel.log " -k " your secret " 49090 # Note the base64 node id emitted
socat TCP-LISTEN:49090,reuseaddr,fork SYSTEM: ' bash 2>&1 '
回到你家:
tunnel -l " /dev/null " -b 5000 -k " your secret " " node_id_of_workplace:49090 "
rlwrap nc localhost 5000
使用 rlwrap 不是必需的。但它确实让体验更加甜蜜,因为它使用 GNU Readline 并记住输入历史记录(可以使用向上/向下箭头键访问,类似于本地 bash 会话)。
雷迪斯:
需要连接到由同行或您自己托管的远程 Redis 实例?在远程主机上,使用tunnel
公开redis-server
运行的TCP端口(默认:6379)。
在本地计算机上,使用tunnel
将 TCP 端口转发到远程端口。将您的redis-cli
指向转发的本地端口。
以下是我能想到的一些tunnel
的随机用例。从广义上讲,任何涉及 NAT/防火墙穿越(例如不带 TURN 的 WebRTC)或加入远程 LAN 的内容都应该发现tunnel
很有用。以下一些想法相当粗略,根本没有经过测试,并且可能行不通,但至少暂时记录在这里,只是为了获得灵感。如果您发现这些有用或无用,或者您发现了tunnel
的全新应用程序,请在讨论中发帖。我测试过的那些案例被标记为“工作”。
tunnel
从办公室内的节点转发到的本地端口。tunnel
(免费)并将存储在环境变量PORT
中的端口转发到您想要公开的本地端口。您的公共 URL 为:https://your-app-name.herokuapp.com。tunnel
连接服务器和客户端即可。如果中继使用 https, tunnel
会使用 TLS 加密对等方与中继之间的所有流量。对等点之间本身不存在端到端加密。然而,管道服务器中继据称是无存储的。
仅当客户端使用相同的密钥 (TUNNEL_KEY) 时,客户端才能与服务对等点连接。密钥主要用于中继阶段的对等发现。对于转发的本地端口的每个新连接,客户端都会向服务对等方发送随机会话密钥。然后,对等方基于此随机密钥在另一个中继点形成新连接,以进行实际的数据传输。局外人,即。不知道 TUNNEL_KEY 的坏人应该无法破坏此流程。
但是,恶意对等方可以执行以下操作。因为他知道服务对等体的 TUNNEL_KEY 和节点 ID,所以他可以模拟后者。因此,来自毫无戒心的连接对等方的数据将被转发给模仿者,从而使真正的服务器陷入饥饿。 tunnel
的未来更新/实现应该使用公钥加密来处理这种威胁。 [在这种情况下,为每个要转发的新连接生成的随机会话密钥将可由真正的服务器单独解密]。
鉴于tunnel
本质上是传输层,以上几点不应令人沮丧,因为大多数应用程序(例如 SSH 和 IPFS)都是在应用层加密数据。对所有数据传输进行端到端加密tunnel
只会增加延迟。但是,如果您选择的话,您始终可以在使用tunnel
建立低级对等互连后创建 SSH 隧道。
tunnel
使用的默认中继是 https://ppg.io。您还可以使用此列表中的其他一些公共中继,或者在免费服务(例如 Heroku 提供的服务)上托管您自己的实例。不用说,要连接,两个对等点必须使用相同的中继。
如果您愿意,您还可以使用 sertain 等简单工具编写自己的中继以供tunnel
使用。只需确保您的中继服务具有与管道服务器相同的 API。如果您的中继代码是开源的,非常欢迎您在讨论中介绍它。
gsocket;启用电路中继的 ipfs p2p ; go-管道-双工;管道.me;上行链路;本地主机.运行;恩格罗克;本地隧道; sshreach.me(仅限限时免费试用);更多的
笔记:
tunnel
和管道服务器,您可以简单地部署自己的中继实例,一劳永逸地与您的同行共享其公共 URL, export
与.bashrc
内的TUNNEL_RELAY
相同的内容,然后就可以开始了。此外,多个公共管道服务器可用于冗余。IPFS(完成):
连接到 IPFS 会简单得多:
tunnel -k <secret> ipfs
用于公开, tunnel -k <secret> <IPFS_peerID>
用于连接。
如果离线,它们将自行启动 IPFS 守护进程。后一个命令将以 30 秒的间隔重复集群连接到给定的对等点。 IPFS-peer-ID 将用作节点 ID,因此对等点不再需要单独共享其节点 ID。非默认 IPFS 存储库路径可以使用选项-r
传递。或IPFS_PATH
。
SSH:
在本地端口和对等端口之间创建 SSH 隧道非常简单:
tunnel -k <secret> ssh
公开 &
tunnel -sk <secret> -b <local-port> <peerID>:<peer-port>
创建。
请注意,连接时不再需要提供登录名。默认以服务节点的${USER}
作为登录名。但是,如果需要,始终可以使用环境变量或选项传递非默认登录名。
GPG:
虚拟机(例如云外壳和测功机使用的虚拟机)没有持久的、唯一的硬件地址。因此,对于此类 VM,节点 ID 在会话之间不断变化。未来的tunnel
将有一个-g
选项,它将 GPG 私钥传递给tunnel
。节点 ID 将从该密钥的指纹生成,类似于 IPFS 的做法。这也将使tunnel
更加安全。
氩气2:
选项 [ -a
] 在使用前使用 argon2 对 TUNNEL_KEY 进行哈希处理,这样较弱的秘密就不会太容易受到攻击。
请报告问题中的错误。在讨论中发表您的想法、评论、想法、用例和功能请求。如果有的话,请告诉我这对您有什么帮助。
也请随时直接写信给我有关该项目的任何信息。
如果这个小脚本对您有任何用处,一颗星星对我来说将是极大的鼓励。
谢谢 ! ?