自宅サーバの問題
グローバルIP問題
Symbolに限らず,サーバを公開しようとするとグローバルIPが必要になります.しかし住まいの環境やインターネットのプロバイダによってはグローバルIPを付与してくれないことがあります.また,取れたとしても固定IPの費用が非常に高額だったりして使えなかったりします.この場合外部からアクセスすることができないのでサーバを公開することは困難です(固定できないグローバルIPの場合はドメインのIPを変更することで対応可能,最近ノードのパブリックキーで委任判定を行う修正がされると聞いたことがあるのでIPが変動しても問題なしかもしれません)
国内サーバは高い
自宅サーバが使えない場合は日本のサーバ業者を利用する以外に選択肢はありませんが,日本のサーバ業者は料金が海外の物に比べて高額になりがちです.これはSymbolに限らずスペックの求められるサーバを運用する場合は同じ問題に直面すると思います.そこで今回は国内の激安VPS(最低スペックVPS)を利用して自宅とのVPNをつなぎ,自宅ノードを構築してみました.おそらく他の仮想通貨のノードや自宅のPCに接続したい場合の手段としても使えると思います.
今回利用するVPS
今回利用するはこちらです
こちらの349円のVPSを利用します.
#WireguardでVPNをつなぐ
今回は簡単にVPNの構築ができるWireguardを利用します.自宅とVPSが通信できれば良いのでOpenVPNなどでも大丈夫です.
VPSの設定
sudo apt install wireguard
インストール後.秘密鍵を生成し秘密鍵から公開鍵も生成します.
wg genkey | sudo tee /etc/wireguard/server.key
sudo chmod 600 /etc/wireguard/server.key
sudo cat /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub
sudo chmod 600 /etc/wireguard/server.pub
ネットワークインターフェイスを確認します
ip a
表示された結果の中からグローバルIPが表示されているインターフェイス名を覚えます(eth0などの表示があると思います)
Wireguardの設定を書き込みます.eth0の部分は各自ご利用の環境によってご自身のインターフェイスに変更してください.利用するポートもご自身の環境に合った空いているポートをご利用ください.
[Interface]
PrivateKey = (サーバーの秘密鍵)
Address = 10.0.0.1
ListenPort = (利用するポート)
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = (クライアントの公開鍵)
AllowedIPs = 10.0.0.2/32
パケットのフォワーディングを許可します./etc/sysctl.confを開きnet.ipv4.ip_forward=1を探してコメントアウトを解除します
net.ipv4.ip_forward=1
有効化します
sudo sysctl -p
これでVPSの設定は完了です.
ノード(クライアント)の設定
VPSと同様,wireguardをインストールします
sudo apt install wireguard
鍵類を生成します
wg genkey | sudo tee /etc/wireguard/client.key
sudo chmod 600 /etc/wireguard/client.key
sudo cat /etc/wireguard/client.key | wg pubkey | sudo tee /etc/wireguard/client.pub
sudo chmod 600 /etc/wireguard/client.pub
Wireguardの設定を書き込みます
[Interface]
PrivateKey = (クライアントの秘密鍵)
Address = 10.0.0.2 (クライアントのIPアドレス)
[Peer]
PublicKey = (サーバーの公開鍵)
EndPoint = (サーバーのIPアドレス):(ポート)
AllowedIPs = 0.0.0.0/0,::/0
PersistentKeepAlive = 30
クライアントはVPSと異なるので注意してください
接続
ファイヤーウォールがある場合はポートを開けます.wireguard(自分で決めたもの)とノードのポート(3000,7900)の許可を行ってください.
VPSでwireguardを起動します
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
続いてクライアントでも起動します
sudo wg-quick up wg0
pingをクライアントからサーバに打ってみましょう.返ってくれば成功です
ping 10.0.0.1
Nginxでリバースプロキシする
VPSにNginxを入れ,VPNからリバースプロキシで情報を取得します.
sudo apt install nginx
/etc/nginx/sites-available/defaultに以下の設定を追記し,リバースプロキシの設定をします
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 3000;
server_name (踏み台サーバのIP);
location / {
proxy_pass http://10.0.0.2:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
反映させます
sudo systemctl reload nginx
ブラウザを開き,http://(VPSのIP):3000/node/infoにアクセスして外部から接続できれば完了です.
SSL化
ドメインがあればSSL化も可能です.certbotをインストールします
sudo apt install certbot python3-certbot-nginx
/etc/nginx/sites-available/defaultを開き,既に記述されている80番ポートのサーバー名を使用するドメインに置き換えます
server_name hogehoge.com;
nginxをリロードします
sudo systemctl reload nginx
ファイヤーウォールの設定でポート80,3001,443を開けます(ご自身の環境のファイヤウォールソフトで設定してください)
ファイヤーウォールのポートを開けたらSSLを取得します
sudo certbot --nginx -d hogehoge.com
すると初めに期限切れ通知のメールアドレスの入力を求められます.受信するメールアドレスを入力してください.
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):
規約同意が求められます.同意する場合はAを押してください
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
お知らせをしてよいか確認されます.不要な場合はNで大丈夫です.
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
選択するとSSLの取得が開始されます.失敗する場合はポートが開いているか確認してください
成功すると80番ポートのアクセスをリダイレクトするか聞かれます.こちらはしてもしなくても大丈夫です.2を選択するとリダイレクトの設定をNginxに書いてくれます.
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
3001番のアクセス(HTTPSアクセス)をリバースプロキシします./etc/nginx/sites-available/defaultに以下の設定を追記します.
server {
listen [::]:3001 ssl ipv6only=on;
listen 3001 ssl;
ssl_certificate /etc/letsencrypt/live/(ドメイン)/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/(ドメイン)/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
server_name (ドメイン);
location / {
proxy_pass http://10.0.0.2:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
おそらくssl_certificate~ ssl_dhparamの部分はcertbotが443番用に追記しているのでそちらを見つけてコピペしてください.
編集出来たらnginxをリロードします
sudo systemctl reload nginx
ブラウザでhttps://(ドメイン):3001/node/infoにアクセスできれば完了です.SSL証明書はcertbotが自動更新してくれます.
良い点
・グローバルIPが要らない
・自宅のIPアドレスを隠してノードを構築できる(VPSが落ちた際に自宅のIPを晒さないよう,対策が必要です)
・アクセスが非常に速い
・安くて高性能なノードを国内における
悪い点
・自宅,VPSのどちらかが落ちるとノードにアクセスできなくなる(VPSのみの場合はノードのみ生きてる場合もあります,ハーベストも可能です)
・部屋が暑くなる(冬はいいかもしれません)
・サーバがうるさい
その他
nginxを入れているのでnodeSetting.jsonの配置が可能です.あひきさんのノードリストに登録したい場合はnodeSetting.jsonを置いてください.ポートを開けておけばVPS経由で自宅にSSHもできちゃいます.