やりたいこと

自宅でBitcoin Coreのフルノードを公開したい。

ただし、普通にv6プラス環境で自宅サーバーを公開しようとすると、IPv4のポート開放で制約が出る。

v6プラスはIPv6 IPoEを使うため、普段使いの回線としては高速で安定しやすい。
一方、IPv4通信はMAP-E方式で提供されるため、IPv4グローバルアドレスを複数ユーザーで共有する。そのため、自分が自由に使えるIPv4ポートは制限される。

Bitcoin CoreのP2P公開では、標準ポートである 8333/tcp を外部から受けられるのが望ましい。

そこで、以下のような構成にした。

ONU
HGW
 ├─ Wi-Fi / LAN
 │   └─ 普段使い端末
 │      └─ v6プラス / IPoE
 └─ NVR510
     ├─ PPPoE
     │   └─ IPv4グローバルアドレス
     └─ LAN
         └─ Proxmox
             └─ Bitcoin Core

本当はNVR510のONUポートを使いたかった

小型ONU接続の写真

今回の構成は、最初からHGW配下にNVR510を置くつもりだったわけではない。

自宅の回線は小型ONU構成だったので、本来はNVR510のONUポートに小型ONUを挿し、NVR510単体で収容したかった。

しかし、実際に試すとIPv6アドレスは取得できるものの、IPv4アドレスが降ってこなかった。

つまり、NVR510のONUポート側でIPv6は使えるが、期待していたIPv4接続までは成立しなかった。

先人たちの記事を調べたり、プロバイダに問い合わせたりしたが、現在契約しているプロバイダでは、ひかり電話を利用している場合はHGWを使ってほしい、という趣旨の回答だった。

そのため、NVR510単体でONUを収容する構成は諦めた。

残念ではあるが、今回は以下のように役割を分ける構成にした。

HGW:
  ひかり電話
  v6プラス
  IPv6 IPoE

NVR510:
  HGW配下でPPPoE
  公開用IPv4
  Proxmox / Bitcoin Core用ネットワーク

そのうち、プロバイダを変更すればNVR510のONUポートを直接使える構成にできるかもしれない。
ただ、現時点では「ひかり電話 + v6プラス + 公開IPv4」を同時に成立させるため、この構成が現実的だった。

目的

  • HGWでひかり電話を維持する
  • HGWでv6プラスを使う
  • 普段使い端末はHGW側に置く
  • NVR510でPPPoEを張る
  • Proxmox上のBitcoin Coreを公開する
  • IPv4はPPPoEで公開する
  • IPv6はHGW由来のグローバルIPv6で公開する

全体構成

                  ┌───────────────┐
                  │   Internet    │
                  └───────┬───────┘
              ┌───────────┴───────────┐
              │                       │
        v6プラス / IPoE             PPPoE IPv4
              │                       │
        ┌─────▼─────┐          ┌──────▼──────┐
        │    HGW    │          │   NVR510    │
        │ ひかり電話 │          │ PPPoE Router│
        │ v6プラス  │          └──────┬──────┘
        └─────┬─────┘                 │
              │                       │ 192.168.200.0/24
        普段使い端末                    ▼
     Wi-Fi(PCやスマホなど)        ┌──────────┐
                                │ Proxmox  │
                                └────┬─────┘
                              Bitcoin Core
                              tcp/8333 公開

HGWはひかり電話とv6プラスを担当する。
NVR510はPPPoEを担当し、公開用IPv4を取得する。
ProxmoxはNVR510配下に置き、その中のLXCでBitcoin Coreを動かす。

ルーティング方針

この構成のポイントは、IPv4とIPv6で経路を分けること。

NVR510では以下のようにする。

ip route default gateway pp 1
ipv6 route default gateway dhcp lan2

IPv4のデフォルトルートはPPPoEのpp 1に向ける。 IPv6のデフォルトルートはHGW側のlan2からDHCPv6で受け取る。

これにより、NVR510配下のProxmoxのLXCやVMは

  • IPv4: PPPoE経由
  • IPv6: HGW / v6プラス / IPoE経由

のようなデュアルスタック構成になる。

LAN側: Proxmox用セグメント

NVR510のLAN1をProxmox用ネットワークにした。

ip lan1 address 192.168.200.1/24
dhcp scope 1 192.168.200.2-192.168.200.191/24

今回、Bitcoin Coreを動かすLXCは192.168.200.100とした。

IPv6: HGW由来のプレフィックスをNVR510配下へ配る

NVR510のWANポート(config上ではlan2)はHGW配下に接続している。

ipv6 lan2 address dhcp
ipv6 lan2 dhcp service client
ipv6 route default gateway dhcp lan2

さらに、HGW側から受け取ったIPv6プレフィックスをLAN1側へ配る。

ipv6 prefix 1 dhcp-prefix@lan2::/64
ipv6 lan1 address dhcp-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server

これにより、NVR510配下のProxmox/LXCにもHGW由来のグローバルIPv6アドレスが付与される。

今回のBitcoin Core LXCでは、以下のようなIPv6アドレスで待ち受けできた。(伏せ字にしておくが、bitnodeとかでわかりそう…)

240b:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx

PPPoE設定

WebUIから設定を行って接続できた。 WANのWebUI設定

IPv4のポート開放: 8333/tcpをBitcoin Coreへ転送

PPPoEで取得したIPv4グローバルアドレスに対して、Bitcoinの8333/tcpだけをLXCへ転送する。

nat descriptor type 1000 masquerade
nat descriptor masquerade static 1000 1 192.168.200.100 tcp 8333

PPPoE側のIPv4フィルタ

PPPoEのinbound側では、Bitcoin Core向けの8333/tcpを許可する。

ip filter 200833 pass * 192.168.200.100 tcp * 8333
ip pp secure filter in 200003 200020 200021 200022 200023 200024 200025 200030 200032 200833

今回の構成では、この設定でPPPoE側のIPv4公開が通った。

IPv6で外部から到達させる

IPv6ではNATを使わず、 LXCに付与されたグローバルIPv6アドレスへ、外部から直接アクセスする。

NVR510側ではlan2のIPv6 inbound filterで8333/tcpを許可する。

ipv6 filter 101833 pass * 240b:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx tcp * 8333
ipv6 lan2 secure filter in 101000 101001 101002 101833

ただし、これだけでは足りない。

HGWがIPv6 IPoE側の入口になっているため、HGW側でもIPv6パケットフィルタを設定する必要がある。

HGW側のIPv6パケットフィルタ設定

HGWのIPv6パケットフィルタ設定(IPoE)で、IPv6アドレス宛8333/tcpを許可する。

HGWのIPv6パケットフィルタ設定

これにより、8333番でのIPv6アドレスへ外部からアクセスすることができる。

Bitcoin Coreで確認

bitcoin-cli getnetworkinfo

今回の環境では以下のようになった。

{
  "version": 310000,
  "subversion": "/Satoshi:31.0.0/",
  "protocolversion": 70016,
  "localservicesnames": [
    "NETWORK",
    "WITNESS",
    "NETWORK_LIMITED",
    "P2P_V2"
  ],
  "networkactive": true,
  "connections": 16,
  "connections_in": 6,
  "connections_out": 10
}

まとめ

今回の構成では、HGWでひかり電話とv6プラスを維持しつつ、HGW配下にNVR510を置いてPPPoE接続を張った。

その結果、NVR510側でIPv4グローバルアドレスを取得し、Proxmox上のBitcoin Coreを8333/tcpで外部公開できた。

さらに、IPv6についてはHGW由来のグローバルIPv6アドレスをNVR510配下のLXCへ配り、HGWとNVR510のIPv6フィルタを開けることで外部から到達できた。

フルノードの状態ページ