IPv6 DS-Lite環境下で特定のポートのサーバを公開する
IPv6が普及しだしている現在ですが、皆様のご自宅のネットはIPv6に変更しましたでしょうか。
我が家のネット環境も今更ながらついこの間IPv6 DS-Liteに変更しました。
IPv6への移行に二の足を踏んでいた理由として、サーバの公開がIPv4に比べて圧倒的にめんどくさい or 不可能な可能性があるという点でした。
我が家では御存知の通り、サーバをいくつか運用しており、ただただ回線を変更するだけでは済まないことがわかっていました。
しかしながら、いつまでもIPv4を利用するわけにも行かず、サーバ公開の記事を書いている以上さっさと移行してしまおうと思ってやっとのことで踏ん切りがついて導入にいたりました。

さて、そんな面倒なIPv6環境下でのサーバ公開をここでは紹介しようと思います。
なお、当環境ではIPv6 DS-Lite (IPv4 over IPv6)のみ提供されており、MAP-Eなどその他のIPv4 over IPv6技術を採用しているプロバイダとは契約していないので不明です。
しかしながら、特定のポートでサーバを公開する場合はどの技術でも有効な方法だと思います。
また、今回は7 Days to DieやLeft 4 Dead 2に絞った内容ではないので、ゲーム用に閲覧された方は仕組みを理解した上で応用してください。

なお、最終的にはPPPoEでのサーバ公開となるので実際のところIPv6での公開ではない点は要注意です。

最終更新日: 2021/10/19



はじめに

IPv4とIPv6におけるサーバ公開の違い

まずIPv4環境下でのサーバ公開ですが、IPv4では一契約ごとに一つのIPアドレスを割り当てる形を取っており、基本的にはルータを配置してそこにグローバルIPアドレスを割り当てます
そのルータにスマートフォンやPC、サーバを繋いで利用するのですが、そこで問題になるのがルータへ来たパケットをどの端末に送ればよいのかです。
そこで登場するのがNATポートフォワーディングです。
NATはLAN内からWANへデータを送信する時に行われる変換で、ローカルIPアドレスとグローバルIPアドレスを相互に変換して特定の端末との通信が可能となります。
しかしながら、この機能が使えるのはLAN内からWANへ飛んだパケットに対してのみであり、WANからLANへの通信を正しくサーバへ伝える場合はNATは使えません。そこでポートフォワーディング(ポート転送)の出番です。
ポートフォワーディングの詳しい話はこちらの記事を参照していだだくとして、IPアドレスとポートを紐付けておくことでWANからの通信が正しくサーバへ届けられるようになります。
つまり、IPv4でサーバを運用するにはポートフォワーディングが重要になってくるわけですね。
現在多くのルータではNATではなくNAPT(IPアドレスに加えてポートも変換する)が採用されています。
ではIPv6でもそのままポートフォワーディングで...と考えたくなりますが、IPv6では端末一つ一つに異なるグローバルIPアドレスが割り当てられるためポートフォワーディングが必要ありません
なのでインターネットに繋ぐだけでもう既にサーバは公開されています。
実際にはフィルタやファイアウォールで防がれることになりますが、ルータさえ対応していればフィルタの設定を行うだけで公開できちゃうんですね。

なんだ簡単じゃないかー、と思ったらお次はIPv4環境向けにサーバを公開する必要が出てきます。
IPv6が普及しだしたとは言え、まだ大半のネット環境はIPv4で、IPv6とIPv4は互換性が無いため不特定多数にサーバを公開する場合はIPv4でも公開しないといけないんです。
ここで問題になるのが、IPv4 over IPv6 (IPv6環境下でIPv4通信を行う技術) です。
IPv4 over IPv6にはDS-Lite, MAP-Eなどいくつかの種類がありますが、基本的にどれもポート開放を自由に行うことができません
MAP-EはIPv6 IPアドレスに応じた一部のポートの開放が可能ですが、例えば80番などの特定のポートは開放できません。
また、DS-Liteでは仕組み上どのポートも開放できません。

じゃあどうするんだよ!っていうのが後回しになりましたが今回の記事の趣旨です。


ルータを2つ繋ぐ

ネットワーク構成と特徴

ネットワーク構成は簡単にですが、こんな感じに構成しました。
正直いきなり面倒な構成にしたくなかったのですが、これしか方法がないのでどうしようもなかった。

まず、ONUとIPv4ルータを接続し、次にIPv4ルータとIPv6ルータを接続します。
PCやスマートフォンなどの端末は基本的にIPv6ルータに接続しますが、外部へ公開したいサーバはIPv4ルータへ接続し、従来どおりポートフォワーディングで公開を行います。

この構成はデスクトップPCやスマートフォンなどの通常利用においてはIPv6 / IPv4 over IPv6の高速回線が利用できるのでゴールデンタイムなどの混雑しやすい時間帯でも安定した通信品質が維持できます
しかしながら、ルータが2つ必要なことやルータの設定、配線などが複雑になってしまう問題があります。
IPv6 DS-Liteや80番などの特定のポートで公開したい場合は必然とこの形式になってしまいますが、MAP-Eなどの一部ポート開放が可能な方式でポートにこだわりがないならそれに応じた方法でやるほうが圧倒的に楽です。
また、IPv6 DS-Liteでは後述しますが、デスクトップPC上でゲームサーバを動かす、みたいなIPv6環境下で同時にIPv4サーバを公開する場合がかなり面倒になります。

検証環境


ルータ
項目 詳細
IPv4ルータ TP-Link Archer C7 *1
IPv6ルータ TP-Link Archer A2600 *2 *3

回線
項目 詳細
プロバイダ 楽天ひかり *4

  1. IPv4ルータは何でも構いませんが、IPv6パススルー (IPv6 ブリッジ) の機能が必要です
  2. IPv6ルータはプロバイダ契約に合わせて購入してください。楽天ひかりではIPv6 DS-Liteの対応が必要です。
  3. 現状A2600ではフィルタ機能がないのでIPv6で公開したい場合はIPv4ルータに繋ぐ(実際はIPv6パススルー)か別のルータを探す必要があります。
  4. プロバイダ契約でIPv6とIPv4 PPPoEの両方が使える必要があります。

IPv4ルータの設定

まずはIPv4ルータ環境下でPPPoEの設定を行います。
ルータによって若干表示が異なりますが、だいたい一緒です。
設定を行うには何らかの端末を繋ぐ必要があるので、一時的にでもコンピュータを接続してください。

設定ができてインターネットへ接続できればOKです。

次にLANのIPアドレスを設定します。
後にIPv6ルータでも設定するので被らないように設定します
今回は「192.168.0.1/24」でいきましょう。
末尾の「24」はサブネット「255.255.255.0」の意味です。
サブネットマスクに応じて「xxx.xxx.xxx.1」のx部分を変更します。
詳細な計算や予約済みアドレスの説明は割愛しますが、とりあえず「255.255.255.0」なら「192.168.xxx.1」のxxxを変更すればOK。

最後にIPv6の項目でパススルーを設定します。
機種によればブリッジになってるかもしれません。
これを設定することでこのルータではIPv6パケットを処理せずに素通りさせて次のルータや端末へそのまま送り届けます
逆にこれがないと今回の構成ができなくなるので必須項目です。
ちなみに、後述しますがIPv6パケットを処理しないのでフィルタやファイアウォールもこのルータではスルーされます

サーバのIPv4ネットワークへの接続と設定

接続と設定

ルータの設定ができれば次にサーバ類をIPv4ルータのLANへ接続します。
接続できたらインターネットへの接続テストを行います。
この当たりはOSなどによって異なるので割愛します。

問題がなければサーバの起動を行ってポートフォワーディングを行います。
ポートフォワーディングの詳しい話はこちらの記事をどうぞ。

特に今までの手順で問題がなければ外部からのアクセステストもクリアできるはずです。

IPv6ネットワーク

忘れてはいけないのが、IPv4ルータで「パススルー」を設定していたことです。
パススルーしているので当然のことながらサーバなどの接続する端末がIPv6に対応していればIPv6接続ができちゃいます。
これは便利だ...と思った方は少し考えてください。フィルタはどこにあるのでしょうか

そうです、ルータという防御壁がないのですべての稼働しているポートに対して外部からアクセスが可能なんですね。
試しにサーバのファイアウォールを一時的に切って(もしくは許可しているポートへアクセス)から、割り当てられたIPv6アドレスに対してポートアクセスチェックをしてみてください。アクセスできますよね。

ソフトウェアファイアウォールが対応していなかったり、そもそも無かったりすると非常に危険なので、IPv6を無効化してしまうか別途セキュリティを考慮する必要があります
本題ではないのでセキュリティ考慮については触れませんが、とりあえずここではIPv6は無効化してしまいます。
Wi-FiルータならWi-Fiも無効化してしまったほうが良いかと思います。

UbuntuはNetplanだとか色々混在しててめんどくさいのでWindowsでいっちゃいます。

設定の「ネットワークとインターネット」から「アダプタ のオプションを変更する」を開きます。

するとNIC一覧が表示されるので、該当するNICのプロパティを開きます。

インターネット プロトコル バージョン 6 (TCP/IPv6)」があるのでチェックを外して無効化します。
あとはOKで保存し、コンピュータを再起動するかNICを無効化して有効化するなどでネットワークをリセットします。

念の為IPv6でサーバへ接続できるかどうか確認して、アクセスできなければOKです。

IPv6ルータの設定

続いてIPv6ルータをIPv4ルータのLANへ接続します。
ただ、もしかするとIPv4ルータと同じLAN IPアドレスが割り当てられる可能性があるため、もし管理画面にアクセスできなかったらONUと直に接続して以降の設定を行ってください。

IPv6 IPoEはPPPoEのようにIDとパスワードの入力が不要で、ONにするだけで設定完了です。

IPv4側の設定ではプロバイダに合わせて選択します。
今回は「DS-Lite」を選択します。
DS-LiteではAFTRのアドレスが必要で、楽天ひかりの場合A2600では手動での設定が必要なようです。
ルータによって異なるので参考程度に。

最後にLANのIPアドレスをIPv4ルータと同様に設定します。
IPv4ルータと被らないように設定してください
今回は「192.168.1.1/24」とします。

デスクトップPCやスマートフォンなど

デスクトップPCやスマートフォンなどの普段利用する端末はIPv6ルータ直下のネットワークへ接続します。
これにより、普段はIPv6の高速なネットワークが利用できるので、ゴールデンタイムでも著しい速度低下を回避することができます

しかしながら、この環境でゲーム用サーバを建てたい、みたいな願望が出てくるとIPv6環境下でIPv4サーバを動かす (ゲームサーバなど)で説明するような少々面倒な構成が必要になってきます。
MAP-Eなどのポート開放が可能な方式ならMAP-Eの方法に従ったほうが楽ですが、DS-Liteの場合はサーバマシンを別で用意するか、諦めるか、上記の方法を用いましょう。


IPv6環境からIPv4環境へ接続する

ネットワーク構成

上記のルータを2つ繋ぐでは一つ欠点があります。
同じ家のマシンなのにローカルIPでアクセスできないのです。そのため、管理画面へアクセスできなかったり、できたとしてもグローバルからのアクセスとなるためかなり不便です。
そこで、構成を少し変更し、デスクトップPCにNICを追加することで対応します。
このNICは外部へ接続するためのものではなく、IPv4 ローカルエリアネットワークのみアクセス可能にします。

NICの増設

NICは色々ありますが、今回はIntelのGigabit CT Desktop Adapterを増設しました。

取り付けは簡単で、コンピュータを止めてPCIeレーンにNICを刺すだけ。
PCIe x1がなければx4, x8, x16などの大きなところに刺しても大丈夫です。

NICを増設したらIPv4のケーブルを刺さないでコンピュータを起動します。
刺してもおそらく問題ないんですが、インターネットに繋がらなくなる可能性があり、調べたりできなくなるかもしれないのでひとまず刺さずにいきます。

NICの設定

設定の「ネットワークとインターネット」から「アダプタ のオプションを変更する」を開きます。

するとNIC一覧が表示されるので、該当するNICのプロパティを開きます。

プロパティを開いたら、まずは赤枠の通りIPv6を無効化します。
理由は前述しましたが、IPv6パススルーで素通りしてくるIPv6なのとそもそもIPv4でローカルネットへアクセスするためのNICなので不必要です。

次に、青枠の通りIPv4のプロパティを開きます。

IPアドレスを被らないように適当に割り当てます。
割り当てるアドレスは環境によって異なるので、参考程度で。

そして大事なのがデフォルトゲートウェイです
デフォルトゲートウェイがあるとインターネット接続できてしまうので空にしておきます

ここまできたらLANケーブルを刺してSSHでもなんでもいいのでローカルIPアドレスでサーバへ接続できればOKです。
今回はpingを送ってみました。
通らない場合はIPアドレスなどを誤っている可能性が高いので設定を見直してみましょう。


IPv6環境下でIPv4サーバを動かす (ゲームサーバなど)

ネットワーク構成

IPv6環境からIPv4環境へ接続するを少し変更し、デフォルトゲートウェイを追加します。
また、仮想マシンを利用して追加したNICでのみ通信を行わせることでIPv6環境下でIPv4サーバを動かしてみます
この構成が必要となるのはゲームPCでゲームサーバを建てたい場合で、IPv4 over IPv6技術がDS-Liteだったり、MAP-Eでも何らかの理由でポート開放ができない場合に有効です。

NICの設定

メトリックの確認

NICの設定と行きたいところですが、その前に必要なメトリックを確認しておきます。 コマンドプロンプトを開き、「route print」コマンドを実行します。 すると上の方に「IPv4 ルート テーブル」があるので、IPv6 NICのメトリックを控えておきます。
> route print

...

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
0.0.0.0                0.0.0.0              192.168.1.1       192.168.1.101    25
127.0.0.0              255.0.0.0            リンク上           127.0.0.1        331

...
                    
今回は25でした。

デフォルトゲートウェイの設定

IPv4のプロパティより、「詳細設定」を開きます。
そこにデフォルトゲートウェイの項目があるので「デフォルトゲートウェイ」を追加します。
この時、予め調べておいたIPv6 NICのメトリックよりも大きな値を設定します

メトリック値は要するにデフォルトゲートウェイの優先順位のことで、標準だと自動算出されるのですが、同じ値が設定されるとどちらへ転送されるかわかりません。
そのため、基本的にデフォルトゲートウェイは一つのみ設定するものですが、メトリック値により優先順位を付けることで必ず優先順位の高い一つが利用されるようになるため、複数のデフォルトゲートウェイの設定が可能となります。
これはゲートウェイの冗長化のための機能なのですが、この特徴を利用して仮想マシンだけで使えるようにします。

値としては小さい方が優先度が高く、大きいほうが優先度が低くなります
今回は値が大きいので優先度が低く、通常の通信はIPv6 DS-Liteを使用することになります。
メトリックの設定はデフォルトゲートウェイとNIC自体の2つありますが、どちらでも構いません。
どちらも設定した場合は双方が加算された値になります。

最後にIPv6 NICのIPv4のプロパティでメトリック値を予め調べた値にしておきます。
今回はデフォルトゲートウェイではなく、NIC自体のメトリック値としました。
これで必ず決まった値になるので、自動計算により値が変わる可能性がなくなります。

あとは念の為IPアドレスとホスト名(FQDN)を外部サイトなどで確認してPPPoEのアドレスでなければOKです。

VMware Workstation Playerによるサーバ構築

サーバアプリケーションによって変わりますが、ゲームサーバレベルだと特定のNICを指定して構築できないものがほとんどです。(っていうか多分全部無理)
現状ではサーバを構築して公開しようとしてもIPv6 DS-Lite環境下で通信しようとするためサーバ公開はできません

そこで、当サイトでおなじみのVMware Workstation Playerを用いて、増設したNICだけを利用できるようにしていきます。

仮想マシンの設定でネットワークアダプタをブリッジにし、アダプタの設定でIPv4 NICのみを指定します。
この設定は他のマシンとも共通になってしまうので既にブリッジネットワークを利用している場合は個別に設定する必要があるかもしれません。
ただ、Workstation Playerにはないので必要に応じてProから引っ張ってくるなど工夫が必要です。

あとは仮想マシンを立ち上げ、仮想マシン上でゲームサーバなどのサーバを構築し、ポートフォワーディングを行えばサーバの公開が可能です。


一つのルータでIPv6とIPv4 PPPoEを両立させる (非推奨)

ネットワーク構成と特徴

こちらは単純にIPv6ルータでIPv6の開通を行った後に、IPv4機能をIPv4 over IPv6からPPPoEに変更して従来どおりのIPv4回線を利用します。

非常に単純で、ルータの追加やNICの追加が必要ないため低コストかつ楽にサーバ公開ができるメリットがありますが、サーバ以外のスマートフォンやPCまでIPv4の通信がPPPoE経由になってしまいます。
IPv4 PPPoEでは仕組み上輻輳が起こりやすいためプロバイダによってはゴールデンタイムの通信速度が著しく低下し、まともにインターネット接続ができなくなるのでおすすめしません。
ちなみに、楽天ひかりのマンションタイプでは20時位になると2mbpsくらいにまで落ちることがよくありました。
ここまで落ちると体感で画像表示だけで数十秒かかることがよくあります。
IPv6に対応しているサーバは案外多くないので、ほとんどIPv4通信となります。
大手のサービスでも対応してないなんてザラなのでほとんど遅くなります。

検証環境


ルータ
項目 詳細
ルータ TP-Link Archer A2600 *1

回線
項目 詳細
プロバイダ 楽天ひかり *2

  1. IPv6ルータはプロバイダ契約に合わせて購入してください。楽天ひかりではIPv6 DS-Liteの対応が必要です。
  2. プロバイダ契約でIPv6とIPv4 PPPoEの両方が使える必要があります。

PPPoEの設定

IPv6を有効にした上でIPv4をDS-LiteからPPPoEに変更します。
あとはプロバイダから送られたIDとパスを入力して接続すれば完了です。

これでIPv6対応のサーバ(IPv6アドレスへのアクセス)はIPv6ネットワークを通過し、IPv4サーバへのアクセスはPPPoEが使用されます。
ポートフォワーディングの設定なども今まで通り行えばサーバ公開ができます。


(番外) IPv6環境下からIPv4環境へ接続する時はローカル or グローバルアクセス?どっち?

ここまで設定してきて困ったことが一つあります。
NIC追加によりローカルアクセスが可能なら問題ないんですが、その設定をしていない場合のアクセスはどのようにすればよいのでしょうか。
例えば、IPv4ネットワークでゲームサーバを建てたとします。そしてそのサーバへIPv6ネットワークのデスクトップPCからアクセスしたいとします。
この時のIPアドレスは何を指定すれば良いでしょうか。

...

グローバルIPアドレスです。
IPv6ネットワークからサーバへ接続する場合は一度外に出てからIPv4ルータへ帰ってきます。
そのため、自宅ネットとはいえ扱いは外部からアクセスしている扱いになります。
当然NICを増設してローカルアクセス可能でもグローバルIPでサーバへアクセスする時はIPv6を通って外部からアクセス扱いになるので、アクセス時のIPアドレスには注意しましょう。