2026/07/06(月)ConoHa VPSからIPv4のアクセスを自宅サーバーにリバースプロキシするときにやったこと
ログを取っていないので記憶で書いているし、順序は効率よくなるように変えているため、上手くいかない可能性がある。
前提
- IPv4接続だけをConoHa VPSに移し、IPv4はConoHa VPSに立てたリバプロから受ける
- ConoHa VPSから自宅サーバーへはIPv6でリバースプロキシする
- ConoHa VPSから自宅サーバーへはHTTP通信で接続する
- つまりIPv4側のTLS終端はConoHaVPS、IPv6側は自宅サーバーという構成
- ConoHa VPSのIPv6アドレスは
2400:8500:2002:3175:160:251:206:248
1. ConoHa VPS側でSSH接続できるようにする
この時点ではSSHで繋げないためWeb画面からすべて行う。
- SSHとICMPが繋がるようにする
- SSHDの設定方法
- 秘密鍵を作成し、公開鍵を取り出し
.ssh/authorized_keysに追加- rootユーザーに追加した
2. ConoHa VPS側でnginxの設定
ここからはSSHで快適操作!
nginxをインストールして証明書置き場を作る
apt update apt upgrade -y apt install -y nginx mkdir /etc/nginx/cert証明書をSFTPで移す
自宅サーバーへのリバプロ設定の作成
cat <<'EOF' | tee /etc/nginx/conf.d/lycolia-info.conf map $http_upgrade $connection_upgrade { default upgrade; '' close; } upstream backend { server [2400:4153:8f01:c800:c14b:3f7a:2b54:353a]; } server { http2 on; listen 443 ssl; server_name lycolia.info *.lycolia.info; ssl_certificate /etc/nginx/cert/lycolia.info/fullchain1.pem; ssl_certificate_key /etc/nginx/cert/lycolia.info/privkey1.pem; client_max_body_size 500m; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } } EOF # enbaleは勝手にやってくれた気がする systemctl enable nginx systemctl restart nginx
3. 自宅サーバー側で疎通可能にする
- OpenWrtで
80番ポートを開く- LuCIを開き、Network→Firewall→Traffic Rulesで
443を開けてるところに80を追加
- LuCIを開き、Network→Firewall→Traffic Rulesで
- ufwにある既存の設定からIPv4で443に繋ぐ設定を消す
ufwに新しい設定を足す
# IPv6のみ許可する sudo ufw allow to ::/0 port 443 # ConoHa VPSからの接続のみ80で受けられるようにする sudo ufw allow from 2400:8500:2002:3175:160:251:206:248 to any port 80- nginx側でConoHa VPSを信頼するようにする
set_real_ip_from 2400:8500:2002:3175:160:251:206:248; real_ip_header X-Real-IP; - ConoHa VPSから来た
X-Forwarded-Protoがhttpsならhttps、それ以外なら$schemeと解釈できるようなmapを書く
これはConoHa→自宅サーバーがhttpで結ばれており、標準ではスキーマがhttpになってしまうが、それを回避しつつ、IPv6からの自作場への直アクセスがhttpないしhttpsだった場合は、そちらを取れるように変換するためであるmap "$realip_remote_addr:$http_x_forwarded_proto" $real_scheme { default $scheme; "2400:8500:2002:3175:160:251:206:248:https" "https"; } - 対応するスキーマのバインドを全部変更する。以下はMastodonの例(4.5.4では二箇所ある)
CGIであればCGIヘッダを書き換えるとよいと思うが、今回は該当がなかった+ proxy_set_header X-Forwarded-Proto $real_scheme; - proxy_set_header X-Forwarded-Proto $scheme;
4. DNSの切り替えをする
- AレコードをすべてConoHa VPSのIPv4に変更
5. nginxの設定を再読み込みする
DNSレコードが伝播するまでの間に粉うことでダウンタイムを最小化できる!
- nginxの設定を再読み込みする
sudo systemctl reload nginx
6. 疎通確認
- 現時点で一般公開しているサイトに対し疎通するかどうか確認する
curl -4 https://lycolia.info curl -4 https://blog.lycolia.info curl -4 https://mstdn.lycolia.info curl -4 https://eco.lycolia.info/wiki/ - 落ちてたら設定を見直し再試行
7. 掃除
- OpenWrtでIPv4向けの443を閉じる
- LuCIを開き、Network→Firewall→Traffic Rulesで
443を開けてるところを消す
- LuCIを開き、Network→Firewall→Traffic Rulesで
- OpenWrtのDDNSスクリプトを無効化
- nginxの設定でIPv4で
443をlistenしてるところを全部消す
あとがき
やるだけやったが、結果的に現時点では全部撤回したので実証実験みたいになってしまった。
元々はフレッツ光クロスに切り替えてIPv4が失われることを想定して行ったが、よくよく考えたら切り替えたところで、今使っているルーターであるR86S U1のSFP+ポートが片方不安定で現状活用できないことや、IPv4のポート枯渇のためレスポンスが返せなくなる恐れを考えると、今やることではないなと思い、全撤回することにした。
ただまぁせっかくだしログを残していれば将来役に立つこともあるだろうというので残したが、色々あり構築時のログが消え去っていたので記憶を頼りに書くことになってしまったのは反省点である。
しかしR86S U1のSFP+が片側死んでいるのはどうしたものか。最近は何もかもすべてが高いのでおいそれと買い替えなどできないし…。まぁ現状困ってないし、IPv4は無料で手に入るし、別にクロスに変えなくてもいい気はした。
ところで全然関係ないけどWiFi 7を入れようと思ったもののSFP+の口が付いてるWiFiルーターは価格が高く、そうでなくとも、まともに速度が出る奴はどれもこれもデカく場所も取るので難しいね…。ひとまずやるとしたら1WくらいのトランシーバーでRJ45に変換するのが無難そうだと思った。その場合、10GtekのASF-10G-T80辺りはいい選択肢になりそうだ。
ルーターも最低でもトライバンドないと速度が出ないっぽいのでWXR18000BE10P辺りが5万円程度で、比較的小さいので無難だろう。この製品は過去に設置したことがあるのでサイズ的には問題ないことは確認済みである。今は手放しているので持っていない。経緯としてはかつてクロスを入れようとして導入したが、結局入れなかったし、デカくて邪魔だったので売った。
とはいえWiFiの速度には大きな不満があるので再導入を検討するのはありかもしれない。トランシーバーとセットで6万とかになるので眩暈がしそうだが…w