やりたいこと
自宅で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ポートを使いたかった

今回の構成は、最初から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から設定を行って接続できた。

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を許可する。

これにより、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フィルタを開けることで外部から到達できた。