如何使用SSH隧道和MetaMask来使用远程以太坊节点

设置SSH隧道

设置什么?这是我之前提到的令人困惑的过程。我不会在这里详细介绍,但实际上它允许将对本地计算机的请求自动转发到另一台计算机,在这种情况下是运行geth节点的VPS 。当我们稍后设置MetaMask时,我们会明白为什么需要这个。

获取VPS的IP地址

为了将请求转发到您的VPS,您需要知道其IP地址。这是通过返回您的Linode仪表板并转到左侧的Linodes选项卡来确定的。您应该在右侧看到您的节点的IP地址,就在您的VPS的地理位置下方。它看起来像这样:172.16.389.54。记下该IP; 我们很快就会使用它。

Windows上的SSH

截至2018年4月更新,Windows 10默认安装了OpenSSH。这提供ssh.exe了以及其他几个SSH实用程序。在撰写本文时,为了检查Windows上的SSH状态,我下载了最新的Windows 10 ISO并将其安装到虚拟机中。OpenSSH已经安装并可以从中获得cmd.exe。如果您安装了Windows 10但未安装OpenSSH,请按照此Microsoft文章中的说明进行操作。如果您使用的是旧版本的Windows,则可以使用多种实用程序来提供SSH功能。

启动隧道

我们假设您拥有对ssh客户端的命令行访问权限。以下命令设置SSH隧道。这个命令在所有三个平台上都是相同的。

ssh -N -v user@172.16.389.54 -L 8545:localhost:8545

-N开关通知ssh不执行远程命令。我们想要一个连续的连接或隧道到我们的节点。此时没有远程执行命令。该-v开关使ssh输出一些日志信息,因为它执行。然后我们提供用户名和IP地址以登录我们的VPS。其余部分设置隧道本身,指定本地计算机8545在端口上接收的任何内容(节点正在侦听RPC请求的端口)应通过隧道安全地转发到节点上的同一端口。这是最重要的一点:除了你,没有其他人能做到这一点。由于暴露的RPC端口,您的节点不会受到攻击。

配置MetaMask

这是整个隧道粗糙的最简单的部分。我假设你离开了SSH隧道,你可以看到它的日志输出。在浏览器中,单击浏览器窗口右上角的狐狸头来激活MetaMask。在MetaMask窗口的顶部是当前选择的以太坊网络。如果你一直在使用beta dApps,它可能会说像Rinkeby Test Network。单击该名称,您会看到一个下拉菜单。顶部是Main Ethereum Network。这是我们的最终目的地,但我们不想使用该菜单项。如果你这样做,MetaMask会连接到Infura节点,从而打败这个漫长旅程的全部目的。在列表的下方,您会看到Localhost 8545。单击它,观察SSH隧道的输出。您应该看到与此类似的行:

debug1: Connection to port 8545 forwarding to localhost port 8545 requested.
debug1: channel 1: new [direct-tcpip]

MetaMask现在应该在顶部有Localhost 8545,你应该在中间看到存款发送按钮。如果是这样,您现在已将远程geth节点连接到MetaMask,尽管MetaMask认为它已连接到本地计算机。

使永久永久

您现在拥有一个功能齐全的geth节点,并且能够通过MetaMask和SSH隧道远程安全地连接到该节点。恭喜当然,计算机崩盘或故意关闭。为了避免在重新启动时再次设置所有内容,我们需要做两件事:一,设置我们的geth节点在VPS上自动启动,两个,不知怎的,对我们本地机器上的SSH隧道做同样的事情。

远程持久性

相对而言,这是永久性过程的简单部分。我们只需处理一个操作系统Linux,并且已经建立了自动启动任务的方法:systemd。除了Linux政治之外,让我们开始吧。

systemd处理大多数Linux系统上的进程,Ubuntu也不例外。为此,它会读取.service文件。要让我们的geth节点在启动时自动启动,我们需要提供一个geth.service文件。返回并从Linodes选项卡启动控制台。如果您的geth节点仍在运行,则必须将其关闭。和以前一样,键入以下内容以重新连接到您的geth节点:

$tmux attach -t 0

停止你的geth节点ctrl-c。再次,等到你处于命令提示符,然后键入ctrl-d退出tmux。请在命令行下,代替userUser=user你之前提供的用户名:

$cat > geth.service <8545

[Install]
WantedBy=default.target
EOF

这将geth.service在当前目录中创建一个文件。您需要做一些事情才能使其可用于systemd

$sudo mv geth.service /etc/systemd/system/
$sudo systemctl daemon-reload
$sudo systemctl enable geth.service
$sudo systemctl start geth.service

要检查服务的状态,请使用以下命令:

$sudo systemctl status geth.service

在输出开头附近的某处你会看到active (running)。如果不这样做,将在下面显示错误消息。祝好运要查看连续输出geth,请键入以下内容:

$sudo journalctl -f -u geth.service

如果一切顺利,您将看到包含导入的新链段的行流。键入ctrl-c以停止输出。别担心,这不会关闭您的geth节点。它只停止显示systemd日志输出。

从现在开始,当您的VPS因任何原因重新geth启动时会自动重新启动。

当地的永久性

您已在计算机上成功启动了SSH隧道,但只要关闭终端或让笔记本电脑进入休眠状态,隧道就会断开连接并断开连接。这显然是次优的。必须启动终端会话并重新激活隧道有点拖累。问题是,三个主要的操作系统有三种不同的方式来设置像SSH隧道这样的永久服务。

SSH密钥对

要使以下任何一项自动运行,您需要拥有SSH私钥和公钥。如果您经常ssh进入远程计算机而无需提供密码,那么您已经设置好了。即使在这种情况下,您也需要将公钥发送到正在运行的远程计算机geth。有关如何执行此操作的说明 – 以及如何在需要时首先生成SSH密钥对 – 来自Linode的这篇文章来自Atlassian的这篇文章解释得非常好。这些文章已经很长,技术性很强; 使用SSH密钥进行修改是一个众所周知的过程,因此不必在此重复这些说明。如果你可以输入:

$ssh user@172.16.389.54

提供您自己的用户名和远程geth节点的IP ,并且您无需提供密码即可登录,您很高兴。如果不是这种情况,则以下任何一种都不起作用。

Linux的

使SSH隧道永久化的过程与我们在VPS上的过程类似。我们安装一个persistent.ssh.tunnel.service文件并进行设置,以便服务从系统开始。除了必然不同的ExecStart一行之外,唯一的主要区别是我们需要在该行之前加上一条指定轻微启动延迟的行,以确保在服务启动之前网络已准备就绪。请记住,当然,替换userUser=user用自己的台式机的用户名和user@172.16.389.54您的用户名在远程系统上,其IP地址。

$cat > persistent.ssh.tunnel.service <10
ExecStart=/usr/bin/ssh -N -v user@172.16.389.54 -L 8545:localhost:8545

[Install]
WantedBy=default.target
EOF

这将persistent.ssh.tunnel.service在当前目录中创建一个文件。和以前一样,您需要做一些事情才能使它可用systemd,这次是在您的本地系统上:

$sudo mv persistent.ssh.tunnel.service /etc/systemd/system/
$sudo systemctl daemon-reload
$sudo systemctl enable persistent.ssh.tunnel.service
$sudo systemctl start persistent.ssh.tunnel.service

要检查服务是否已成功启动,请键入以下内容:

$sudo systemctl status persistent.ssh.tunnel.service

苹果系统

Apple的macOS有自己的方式来设置持久服务launchctl。与systemdLinux 类似,您提供配置文件 – 这次是以XML文档而不是INI文件的形式 – 然后使用该XML文档安装和激活服务。首先,我们创建此文件,像往常一样提供我们的VPS的用户名和IP地址user@172.16.389.54。同样,请提供您的macOS用户名UserName

$cat > com.persistent.ssh.tunnel.plist <"1.0" encoding="UTF-8"?>
"-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
"1.0">

  Label
  <string>com.persistent.ssh.tunnelstring>
  UserName
  <string>userstring>
  StandardErrorPath
  <string>/tmp/persistent.ssh.tunnel.errstring>
  ProgramArguments
  
    <string>/usr/bin/sshstring>
    <string>-Nstring>
    <string>-vstring>
    <string>user@172.16.389.54string>
    <string>-Lstring>
    <string>8545:localhost:8545string>
  
  KeepAlive
  <true/>


EOF

创建com.persistent.ssh.tunnel.plist文件后,将其移动到launchctl期望这些文件驻留的位置。最后,命令将其安装到系统中并启动后台运行的进程。

$sudo mv com.persistent.ssh.tunnel.plist /Library/LaunchDaemons/
$sudo launchctl load /Library/LaunchDaemons/com.persistent.ssh.tunnel.plist

安装.plist文件/Library/LaunchDaemons/使其可供系统上的任何用户使用; 它不依赖于您登录以使隧道处于活动状态。

视窗

要在Windows中设置持久性服务,您需要下载提供此功能的实用程序。我使用的是免费,开源和公共域NSSM,因此您需要在继续之前安装它

以下步骤创建persistent-ssh-tunnel服务并设置各种参数,以便您可以使用它将MetaMask连接到您的geth节点。nssm为了清楚起见,我提供了命令以及响应。要执行这些命令,您需要以Windows管理员身份启动终端会话。您可以通过打开开始菜单并键入来完成此操作cmd。这应该会突出显示命令提示符最佳匹配菜单。在右侧选择以管理员身份运行。单击是以允许此应用程序进行更改。如果一切顺利,您会看到使用命令提示符打开黑色终端窗口。请仔细键入以下命令,确保不要C:\Windows\system32>输入命令提示符确保每个命令都获得类似于此处提供的响应。用Windows用户名替换.\user(保留.\)和Windows登录密码password。还提供您的用户名和远程geth节点的IP地址user@172.16.389.54

C:\Windows\system32>nssm install persistent-ssh-tunnel "C:\Windows\System32\OpenSSH\ssh.exe" "-N -v user@172.16.389.54 -L 8545:localhost:8545"
Service "persistent-ssh-tunnel" installed successfully!

C:\Windows\system32>nssm set persistent-ssh-tunnel ObjectName ".\user" "password"
Set parameter "ObjectName" for service "persistent-ssh-tunnel".

C:\Windows\system32>nssm set persistent-ssh-tunnel DisplayName "Persistent SSH Tunnel"
Set parameter "DisplayName" for service "persistent-ssh-tunnel".

C:\Windows\system32>nssm set persistent-ssh-tunnel Description "Establishes a persistent SSH tunnel between a remote server and the local computer."
Set parameter "Description" for service "persistent-ssh-tunnel".

C:\Windows\system32>nssm start persistent-ssh-tunnel
persistent-ssh-tunnel: START: The operation completed successfully.

测试持久性SSH隧道

假设一切顺利,您现在可以在Windows,Linux或macOS上运行在后台运行的系统服务,并在每次本地计算机重新启动时启动。要测试它,请打开安装了MetaMask的浏览器,然后按照上面的配置MetaMask中的说明进行操作。MetaMask应该再次连接到Localhost 8545,但这次它使用后台服务将请求隧道传送到您的gethVPS。您不必再考虑建立与远程以太坊节点的连接。

结论

为了方便起见,我在这些文章中做了具体选择。例如,我选择为我们的以太坊节点使用VPS,实际上是特定的VPS提供程序。如上所述,这需要花钱。从项目中获得收入的dApp开发者应该考虑这条路线。另一方面,一个只是好奇并且想要遵循所概述的步骤的人可以设置VPS,遵循教程,并在测试之后学习所有知识,关闭和删除VPS。这最终只花费几美分:如果花费你两个小时来完成本教程,那么假设一个Linode 16GB VPS ,你就要24美元。即使考虑到同步时间,你仍然只有几美元。

您也可以自由选择其他VPS提供商。Digital Ocean的Droplets价格极具竞争力。这里的过程应该在Droplet上同样有效。亚马逊的AWS也是可能的。使用您自己的硬件可以节省每月的成本,但是这个过程会变得更加复杂,并且不适合针对中等技术人员的文章。

我做的另一个选择是使用Ubuntu Linux发行版作为我们geth节点的操作系统。Ubuntu是最受欢迎的发行版之一,但我们可以说,您可以选择其他几个 Linux发行版。如果您对另一个发行版更熟悉,那么您应该能够处理您的选择与上面基于Ubuntu的指令之间的差异。

我为Windows选择了一个系统服务实用程序,没有提供替代方案,并且在该操作系统上掩盖了SSH方面。同样,如果我要进入所有平台上所有软件的各个方面,这些文章将会涉及中篇小说。我向那些想要更多细节的人道歉。如果您对这些事情有疑问,请发表评论。

这绝对是一段​​漫长的旅程。我知道这一切都有点雄心勃勃,特别是那些技术含量较低的人。我希望您能够遵循这些说明并最终得到您自己的远程以太坊节点,通过安全的SSH隧道与MetaMask连接。如果您对此过程有任何疑问或需要任何帮助,请在此处发表评论。我很乐意提供帮助。

原文:https://kauri.io/article/348d6c66da2949978c85bf2cd913d0ac/v5/make-use-of-your-remote-ethereum-node-using-an-ssh-tunnel-and-metamask

提示:投资有风险,入市需谨慎,本资讯不作为投资理财建议。请理性投资,切实提高风险防范意识;如有发现的违法犯罪线索,可积极向有关部门举报反映。
你可能还喜欢