Как «ethereum block explorer» может безопасно подключиться к geth, который уже запущен на основном сервере?

Я работаю над частной сетью Ethereum. Я запускаю загрузочный узел Ethereum и Ethereum Block Explorerприложение ( https://github.com/etherparty/explorer (облегченный обозреватель блоков ethereum)) на главном сервере.

Внутри основного сервера, на котором я запускаю узел Ethereum, в браузере я могу подключиться к Ethereum Block Explorerfrom localhost:8000:

введите описание изображения здесь

Но с внешнего узла в браузере, когда я пытаюсь подключиться с IP-адреса основного сервера, < ip-address >:8000я столкнулся со следующим сообщением об ошибке. Основной причиной этого сообщения об ошибке было « web3не подключено» .

введите описание изображения здесь

var eth_node_url = 'http://localhost:8545'; // TODO: remote URL
web3.setProvider(new web3.providers.HttpProvider(eth_node_url));

if(!web3.isConnected()) {
    $('#connectwarning').modal({keyboard:false,backdrop:'static'}) //enters here
    $('#connectwarning').modal('show') //enters here
}

На внешнем узле, если я запускаю gethприложение в фоновом режиме, которое уже подключено к частной сети Ethereum, это решает проблему.

[В] Можно ли на внешнем узле без запуска gethприложения в фоновом режиме Ethereum Block Explorerподключиться к gethприложению, которое уже запущено на основном сервере? Если да, есть ли безопасный подход, который работает gethна --rpcaddr="localhost" --rpccorsdomain="*"основном сервере?

Спасибо за ваше драгоценное время и помощь.

Примечание:

=> Как я запускаю узел Ethereum:

geth --port 3000 --networkid 23422 --nodiscover --datadir="/home/MyEthereumEbloc" 
--rpc --rpcaddr="localhost" --rpccorsdomain="*" --maxpeers=6 --ipcapi 
"admin,eth,web3" --autodag

=> Чтобы установить Ethereum Block Explorer, я следовал руководству по установке на https://github.com/etherparty/explorer .

[~$] git clone https://github.com/etherparty/explorer 
[~$] cd explorer
[~/explorer$] npm start

> EthereumExplorer@0.1.0 prestart /home/netlab/explorer
> npm install


> EthereumExplorer@0.1.0 postinstall /home/netlab/explorer
> bower install


> EthereumExplorer@0.1.0 start /home/netlab/explorer
> http-server ./app -a 79.123.177.145 -p 8000 -c-1

Starting up http-server, serving ./app on port: 8000

=> Внутри файла package.json, который находится в папке проводника: приложение запускается следующим образом:

"start": "http-server ./app -a localhost -p 8000 -c-1"

Пожалуйста, знайте, что когда я изменил локальный хост на IP-адрес узла, это не помогло:

"start": "http-server ./app -a <ip-address> -p 8000 -c-1"

Итак, если я правильно понял, внешний узел не находится в той же сети, что и ваш основной узел, на котором вы работаете Ethereum Block Explorer. Я знаю, что это косвенное решение, но как насчет того, чтобы использовать собственный VPN и позволить им думать, что они находятся в той же сети? Или, может быть, просто ssh-туннеля может быть достаточно?
Извините, если мое объяснение непонятно. Да, внешний узел не находится в той же сети, что и мой основной узел. Это может быть любой, у кого есть ссылка. Например: когда я вошел в обозреватель блоков Ethereum для ETC « etherscan.io », мне не нужно запускать gethего ETHна моем локальном компьютере, и я по-прежнему могу видеть всю информацию на веб-сайте.
Может быть, это помогает? эфириум.stackexchange.com/questions/3163/…

Ответы (3)

!!Обратите внимание, что это решение работает только в том случае, если внешний узел и основной сервер находятся в одном и том же сетевом домене!!

Небезопасный подход:

Проблема заключалась в следующем: как я запускаю свой RPC.

Запустите gethна основном сервере следующим образом:

> admin.startRPC("0.0.0.0", 8545, "*")
true

или же

--rpc --rpcport 8545 --rpcaddr 0.0.0.0 --rpccorsdomain "*" --rpcapi "eth,web3"

Обновите explorer/app/app.js следующим образом:

    //var eth_node_url = 'http://localhost:8545'; //commented out. 
    var eth_node_url = 'http://<ip-address of the main server>:8545';         
    web3.setProvider(new web3.providers.HttpProvider(eth_node_url));
Насколько я знаю, это очень небезопасно, вы предоставляете доступ RPC всем. Когда , реальным решением было бы предоставить RPC только для веб-приложения, и это веб-приложение должно доставлять контент зрителю. Сама архитектура Block Explorer не предназначена для использования в качестве общедоступной службы, а только для одного пользователя для частных задач.
@Нулик Согласен. Но почему все (?) проводники, которые я вижу, предполагают, что вы работаете ТОЛЬКО на локальном хосте и запрашиваете RPC непосредственно со стороны браузера (и, следовательно, вам нужен RPC на 0.0.0.0, если вы хотите, чтобы проводник был общедоступным?). Это довольно ограниченный дизайн. Должен быть метод, позволяющий выполнять запрос RPC, но не разрешающий 0.0.0.0/public на RPC. Я просто не понимаю, почему они все так устроены?
@bshea, возможно, потому, что блокчейн — это общедоступные данные, и нет риска для безопасности, если вы публикуете что-то, о чем все уже знают. Угрозы безопасности нет, если вы не раскрываете свои кошельки, то есть личный модуль с разблокированными кошельками и не выполняете свои собственные денежные операции на этом узле.

Я использовал, Dockerчтобы преодолеть эту проблему. Установка докера . Из этого ответа на этот вопрос Как я могу открыть RPC-сервер Geth для внешних подключений? , я использовал Dockerв качестве сервера приложений, который на самом деле работает внутри моего Ethereum Node.

Я следил за установкой приложенияEthereum Block Explorer .

Чтобы преодолеть следующую проблему (завиток: (56) Recv failure: Connection reset by peer)внутри Docker, я заменил ключевое слово «localhost», которое существует в папке проводника, на «0.0.0.0»: https://stackoverflow.com/a/27818259/2402577

Предположим , что gethон работает по адресу remotehost.remotedomain.tld.

[~] git clone https://github.com/etherparty/explorer
[~] cd explorer
[~] dir="$PWD";
[~] find $dir -type f -exec sed -i 's/localhost/0.0.0.0/g' {} +
[~] emacs -nw  Dockerfile

Вставьте следующие строки в Dockerfile.

FROM node:boron

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

EXPOSE 8000
CMD [ "npm", "start" ]

-

[~] sudo docker build -t <your username>/node-web-app 
[~] sudo docker run -p 3002:8000 -d <your username>/node-web-app

Эта часть не является обязательной:

[~] sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
26c46398b20d        yo/node-web-app     "npm start"         7 seconds ago       Up 5 seconds        0.0.0.0:3002->8000/tcp   pedantic_knuth
[~] sudo docker exec -it 26c46398b20d /bin/bash
root@26c46398b20d:/usr/src/app# ssh -f -N -L 8545:localhost:8545 remoteUser@remotehost.remotedomain.tld

Теперь вы можете открыть Ethereum Block Explorerприложение с внешнего узла, используя host's_IP:port.

remotehost.remotedomain.tld:3002

Полезная ссылка для компиляции nodejsи docker: https://nodejs.org/en/docs/guides/nodejs-docker-webapp/

Как и во всех других ответах, все, что вы сделали, это добавили тот же небезопасный RPC. 0.0.0.0 легко добавить. Это легко, потому что это совершенно небезопасно.

Если внешний узел является вашим доверенным узлом, вы можете попробовать использовать туннелирование SSH. Выполните ssh -L 8545:localhost:8545 username@main-server-ip-address на удаленном узле, и вы получите открытый порт 8545 на удаленном узле, который будет безопасно (зашифрован) перенаправлен на main_server-ip-address:8545. Все соединения с удаленным узлом: 8545 будут интерпретироваться как соединения с ip-адресом основного сервера: 8545 с локального хоста.

Чтобы упростить процесс подключения, вы можете добавить открытый ключ удаленного узла в файл ~/.ssh/authorized_keys основного сервера, как описано здесь https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh- ключи--2

ЭТОТ ПОДХОД НЕ БЕЗОПАСЕН!!! Если вы просто хотите открыть порт rpc на своем основном сервере, вы также можете использовать для этого ssh. Выполните ssh -L main-server-external-ip-address:port-to-forward-rpc:localhost:8545 username@localhost на вашем основном сервере, и вы получите открытый порт port-to-forward-rpc на главном сервере . -внешний-ip-адрес , к которому можно получить доступ из любого места. Все подключения к этому порту будут интерпретироваться geth как подключения с локального хоста. После этого вы можете использовать

var eth_node_url = 'http://main-server-external-ip-address:port-to-forward-rpc '; web3.setProvider(new web3.providers.HttpProvider(eth_node_url));

без каких-либо ограничений доступа к домену\сети

Пожалуйста, не обобщайте ответы, которые вы получили на ethereum.stackexchange.com/a/3209/4575 @Alexey Barsuk
@Аватар, это было не обобщение, это был четкий ответ. К сожалению, я не видел ссылку, которую вы указали. Если вы посмотрите ближе ко второй части ответа, вы увидите, что я предлагаю другой подход - создать туннель ssh локально на сервере (а не от узла к серверу), чтобы перенаправить порт geth rpc на другой порт, доступный извне. для преодоления ограничений, упомянутых в ethereum.stackexchange.com/a/10083/6041 «!!Обратите внимание, что это решение работает, только если внешний узел и основной сервер находятся в одном сетевом домене!!»