이타인클럽

라즈베리파이를 Private Blockchain의 Geth 클라이언트 노드로 만들기 2

토픽 이타인클럽 > Blockchain > Embedded Blockchain

이전글에서 라즈베리 파이 짝퉁인 오렌지 파이 보드에 geth를 설치하고 계정 생성하는 것 까지 진행했습니다. 이번에는 이것을 외부에서 접속할 수 있는 노드로 만들어 보겠습니다.

지금 해보려는 것은 집에서 공유기를 사용하고, 그 공유기에 라즈베리 파이가 연결되어 있는 상황을 가정합니다.

외부에서 집에 있는 공유기에 연결된 라즈베리 파이에 접속하기 위해서는 포트 포워딩 (Port Forwarding)이 필요합니다.

오픈 튜토리얼스에 포트 포워딩 개념에 대해서 자세히 설명되어 있으니 참고하시면 되는데, 여기서는 간략히 요약을 해보겠습니다.

https://opentutorials.org/course/228/6040

1. 공유기 아이피 IIP) 확인

외부에서 집에 있는 컴퓨터에 바로 접속할 수는 없습니다. 왜냐하면 공유기에 컴퓨터나 라즈베리 파이가 물려 있기 때문이죠. 집 내부에서는 공유기에 의해 사설 네트워크까 꾸며져 있기 때문입니다.

외부에서 집으로 접속하도록 주어지는 아이피는 공유기 아이피 뿐입니다.

아래와 같은 사이트에서 자신의 아이피를 검색해 볼 수 있습니다.
https://whatismyipaddress.com/

myip.png

사설 아이피는 192.168.xxx.xxx로 표시되는 반면 공유기 아이피는 외부에서도 구별되는 유일한 아이피입니다. 제 건 39.117.xxx.xxx로 나타나는군요.

2. 포트포워딩

외부에서 집에 공유기에 연결된 라즈베리 파이에 접속하게 해주는 방법 중에 하나가 포트포워딩입니다.

간단히 설명드리면, 외부에서 공유기 IP와 특정 포트 번호로 접속하게 되면 공유기에 미리 설정해 놓은 컴퓨터로 연결을 포워딩해주는 것입니다. 즉 특정 포트로 들어온 연결을 미리 지정된 IP로 포워딩 시키는 것이죠. 이 때는 사설 아이피가 사용됩니다.

공유기에 관리자로 접속하면 아래와 같이 NAT/라우터 관리 메뉴가 있습니다. 저는 iptime 공유기를 사용하여 iptime 공유기 기준으로 설명드리겠습니다.

포트포워드 설정 메뉴에 들어가서 아래와 같이 입력합니다.

  • 규칙이름: 적당히 규칙 이름을 입력합니다. 저는 geth_node로 입력했습니다.
  • 내부 IP주소: 공유기로 특정 포트의 접속이 발생하면, 공유기가 연결을 전달할 IP 주소입니다. 즉 여기서는 라즈베리 파이의 IP가 되겠죠. 제 경우는 192.168.0.4입니다.
  • 프로토콜: 연결에 사용되는 프로토콜입니다. 여기서는 TCP를 선택합니다.
  • 외부포트: 여기가 중요합니다. 외부포트에 설정된 포트로 외부에서 접속하면 공유기가 이 연결을 내부 IP로 연결시켜줍니다. 라즈베리 파이의 geth 노드 접속 연결은 기본적으로 30303 포트를 사용하고, JSON-RPC 연결을 허용하기 위해서는 8545 포트를 사용합니다. 여기서는 JSON-RPC 연결을 위해 8545로 입력합니다.
  • 내부포트: 내부포트도 외부포트와 동일하게 입력합니다.

geth 노드의 기본 연결 포트는 30303입니다. 이것을 별도의 규칙으로 해서 포트포워딩 규칙을 위와 같이 만들어 줍니다.

3. DDNS

한가지가 더 남았습니다. 아쉽게도 집에 있는 공유기의 아이피는 통신업체에 의해서 임의로 변경될 수 있습니다. 매번 사용자가 변경된 아이피를 반영하기란 쉽지 않죠. 그래서 필요한 것이 바로 Dynamic Domain Name Server (DDNS) 입니다. iptime 공유기에는 DDNS를 제공합니다.
즉, 공유기의 domain name을 등록시켜 놓으면, iptime domain namer server가 변경된 IP 주소를 자동으로 업데이트 해줍니다. 즉 우리는 그냥 도메인 주소만 알고 이 주소를 사용하면 아이피가 변경되더라도 문제없이 연결할 수 있습니다.

제 경우는 이렇게 설정했습니다. 공유기의 관리자로 접속하여 특수기능 밑에 DDNS 메뉴를 클릭하여 아래와 유사하게 입력합니다.

호스트이름은 등록하고자 하는 도메인 이름입니다. 그 다음은 사용자 ID입니다. 사용자 ID는 이메일을 입력해야 합니다.
제 경우는 이렇습니다.

  • 호스트 이름: 적당한 이름을 입력합니다.
  • 사용자 ID: etainclub@gmail.com

호스트 이름뒤에 iptime.org는 자동으로 붙습니다. 즉 iptime에서 운영하는 도메인 서버에 도메인을 등록하는 것이죠.
등록 버튼을 누르면 잠시 후 등록이 완료됩니다.

4. geth 노드에 접속

그럼 라즈베리 파이의 geth 노드에 접속하는 방법을 살펴보겠습니다.

먼저 라즈베리 파이에서 geth를 실행할 때, JSON-RPC 접속을 허용하도록 설정합니다.

 $ nohup geth --networkid 4649 --nodiscover --maxpeers 0 --datadir ~/Blockchain/data_testnet --mine --minerthreads 1 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpccorsdomain "*" --rpcapi "admin,db,eth,debug,miner,net,shh,txpool,personal,web3" --unlock 0,1 --password ~/Blockchain/data_testnet/passwd --verbosity 6 2>> ~/Blockchain/data_testnet/geth.log &

geth 노드에 접속할 수 있는지, 다른 컴퓨터에서 아래와 같이 geth 콘솔에 접속해 봅니다. hostname은 위의 ddns에서 설정한 호스트 이름을 입력합니다.

$ geth attach rpc:http://hostname.iptime.org:8545

그럼 remix 브라우저에서 web3 provider 설정도 해보겠습니다.
한가지 주의할 점은 remix 사이트 접속할 때 https://http://remix.ethereum.org 사이트가 아닌 http://remix.ethereum.org 사이트로 접속해야 합니다.

http://remix.ethereum.org 으로 접속합니다.

  • 접속 후 오른쪽 메뉴에서 "run" 탭을 선택
  • Environment에서 "Web3 Provider" 선택
  • 확인 후 "http://hostname.iptime.org:8545" 입력 (hostname은 설정한 이름으로 대체)

그러면 아래와 같이 Web3 Provider가 정상적으로 접속된 것을 확인할 수 있습니다.

댓글

댓글 본문