CentOSでOCNバーチャルコネクト

更新履歴

2023/02/19 CentOS8用のスクリプトを変更
2023/01/05 
CentOS8用のスクリプトを変更
2021/10/25 2.5 性能に UDP の SNAT の動作を追記
2020/12/10 
CentOS8.3で動作確認。CentOS8用のスクリプトを少し変更
2020/06/27 2.5 性能 を追加。CentOS8用のスクリプト注釈追記
2020/06/20 スクリプト修正、CentOS8用のスクリプト、ポートフォワード設定例追加等
2020/03/23 ポート数を間違っていたのでスクリプトを修正

 

まえおき

前回 IPv4(PPPoE) + IPv6(IPoE) の環境を作りました。今回はさらにIPv4 over IPv6を追加して、IPv4なインターネットもIPoEを使えるようにしたいと思います

 

Linuxの知識もネットワークの知識もセキュリティの知識もない素人なのでつっこみどころがあるのはご容赦ください

今回接続までできていますが、仕様が変わってこの記事通りにやっても接続できなくなるがあります。ご了承ください

 

OCNについて

私のプロバイダはOCNなのですが、OCNは仕様がちょっと特殊で、2種類の回線が使われているようです。IPv6のグローバルアドレスの先頭4桁が「2409」のものと、「2400」のものです

OCNバーチャルコネクトが使えるのは「2400」の場合だけのようです。「2409」の方は残念ながら使えないとのこと

v6アルファ(OCNバーチャルコネクト+ルーターレンタル+サポート / 月500円)に申し込めば「2409」の方も「2400」に変わるようです

 

元々「2400」な方は、OCNバーチャルコネクト対応のルーターを用意するか、今回の記事のように少しがんばればv6アルファに申し込まなくても無料で IPv4 over IPv6 が使えます。不公平だなあ><

「2409」な方は今回の記事の内容のことをしても多分使えません…。少しずつ「2409」の人も「2400」に切り替わっていってるという話もあるので、待ってれば変わるかもしれません

 

 

環境

  • 回線:フレッツ光ネクスト
  • プロバイダ:OCN
  • ひかり電話なし、HGWなし
  • IPv6グローバルアドレス先頭「2400」

 

 

目標

IPv4(PPPoE) + IPv6(IPoE) から IPv4(PPPoE) + IPv4 over IPv6(IPoE) + IPv6(IPoE) にします。

今回もセンスのない図。IPv4 と IPv4 over IPv6を両立させ、ほどほどに都合よく使い分けるルーターにします。LAN下のすべての端末が使い分けられるようにします。一応hostapdも使っていて、無線LANのAPとしても機能しています

 

 

手順

OCNバーチャルコネクトはv6プラスと同じくMAP-Eです。v6プラスは割り当てられるポート数が240個なのに対し、OCNバーチャルコネクトの場合は1024個?

 

参考サイト様

http://ipv4.web.fc2.com/map-e.html
https://gato.intaa.net/archives/13186
https://blog.babibubebo.org/archives/1269

 

必要な計算を自動でやってくれているサイト様、v6プラスの手順をわかりやすく解説してくれているサイト様、OCNバーチャルコネクトの仕様を解析してくれているサイト様、です

計算で得た情報とOCNの仕様をv6プラスの手順にあてはめるだけの簡単なお仕事です。感謝しながら進めていきたいと思います

BRのアドレスやマッピングの仕様なんかは簡単に変えられるようにできている気がしなくもないので、いつまで以下の方法が有効かは不安なところ…

 

 

計算

http://ipv4.web.fc2.com/map-e.html

にアクセスし、IPv6のグローバルアドレスをいれるだけです。いつの間にやらOCNバーチャルコネクトにも対応したようで、BRのアドレスも出してくれるようになりました

 

 

スクリプト

適当なお名前で

 

CentOS7の場合

CentOS7の場合、というかnftablesが導入されてない、firewalld+iptablesの環境の場合

https://gato.intaa.net/archives/13186

こちらの参考サイト様のを参考にfirewalld、OCNバーチャルコネクト向けに書き直したものです。CE、IP4、PSIDはさきほど調べたものをいれます。ダイレクトルールの優先度は適当に…

元は匿名掲示板の方のスクリプトだったようですが、たった数行で分割されて割り当てられるポート番号を偏りなく使われるようになってて、強い人は凄いなあって素直に思います。ありがたく使わせていただくとします

32行目でゾーンに突っ込んでますが、ゾーンに登録しない方は32行目をコメントアウトして33行目等を使ってLANからトンネルへのフォワードの設定を追加するなどしてください

OCNバーチャルコネクト以外の、v6プラスなどのMAP-Eの場合はloop数を15に、1024となっているところ4096にすれば対応できると思います

 

実行権限をつけて実行

 

確認します

 

勝手にできる「ip6tnl0@NONE」と「ip6tnl1@enp2s0」ができています。enp2s0は私のWAN側のデバイス名です

 

ゲートウェイの確認

 

デフォルトゲートウェイが今作ったトンネルになっているか確認します

 

 

CentOS8の場合

CentOS8の場合、というよりfirewalld+nftablesの環境の場合、firewalldのダイレクト設定から設定しようとしてもうまくいきません

firewalldのバックエンドをiptablesに変更すると、nftablesへの変換の担当がfirewalldからiptablesに変わりますが、それでも解決しません

どちらもmode nthを使う記述をnftablesでも問題なく運用できるように変換してくれないようです

 

たとえばfirewalldのダイレクトルールをこのように設定してみると

 

nftablesにはこのように変換されますが、これだと動作が不安定です。どうやらこの記述だと63回サイコロを振ってしまうようで、62/63の63乗の確率で全部すり抜けてしまうみたいで接続が安定しません(憶測)

nftablesの場合はmapを使って記述しないといけません

 

イメージとしてはこんな感じの設定にしないと、いけないようです。firewalldのダイレクトルールではこのように(多分)設定できないので、nftコマンドを使って直接nftablesを設定するか、別の方法を取る必要があります。

 

Ubuntu / Debian でIPv4 over IPv6 (OCNバーチャルコネクト, v6プラス), systemdによる設定, ルーター化, VPNおよび自宅サーバー可能な固定グローバルIPv4アドレス - Qiita
コメント(2024/07/27): 3年弱何も記述を更新していないが、以前から ニチバンベンチ には問題なく成功している。数行したのリンク先の systemd, nftablesだけでルーターを構成…

firewalldを使わず、nftablesを直接操作する方法は他の方がやっていらっしゃいます

 

※2023/01/05更新。firewalldのバックエンドはnftablesで動作確認済み

20行目のコマンドで100~163のマークを打って分岐させています。別のマーク値を使う場合は –hmark-offset の値と24行目のマークの初期値を変更します。nftablesだとmarkでもoffsetとmodが使えるので簡単にマークを打ち分けられるのですが、iptablesやfirewalldではhmark?を使わないとダメなようです

最後の方でとりあえずexternalゾーンにいれてますが、別の方法を取る場合は適宜かえてください。

こちらもv6プラス等のMAP-Eの場合は、loopを15に、1024となっているところを4096にすれば対応できると思います

もうCentOS7の環境が手元にないので確認できませんが、CentOS7でもこのスクリプトで機能するような気がします

 

 

確認

OCN | 接続環境確認
NTTコミュニケーションズが提供するインターネットプロバイダ「OCN」のIPv6確認サイトです。IPv6確認サイトではお客様のIPv6通信の情報が確認できます。

OCNの公式サイトで確認できます。IPv4とIPv6の両方がIPoEになっていたら成功です

 

ニチバン株式会社:製品情報サイト|ぴったり技術で明日をつくる
ぴったり技術で明日をつくるニチバンの「製品情報サイト」です。セロテープ®をはじめ、文具、医療用テープ、産業用テープまで。粘着技術を活かして、将来にわたって快適で健康な生活に貢献していきます。

ニチバンのサイトがスムーズに閲覧できるのであれば問題ありません。安定しない場合はポート数が枯渇したか、うまく割り振れてないかです

 

IPv4がつながらない

先ほどのスクリプトではexternalゾーンに登録するようにしたので、externalゾーンのマスカレードの設定がされているかどうか、ゾーンに入れない場合はLANからトンネルデバイスへのフォワードの設定がされているか、確認します

 

原因がよくわからないならひとまずゲートウェイを戻してゆっくり原因を探します

 

 

IPv6がつながらない

接続できていたはずのIPv6がつながらなくなっている場合は、IPv6のルートを確認します

2400からはじまるアドレス宛にWAN側デバイスからのメトリックが小さいルートができてしまっていたら削除します

 

削除したら再確認

OCNバーチャルコネクトの設定はここでおしまい

 

 

IPマスカレードの確認

iptables

CentOS7の場合。またはCentOS8でfirewalldのバックエンドをiptablesにしている場合。Chain POSTROUTING_directの部分で、各ポートブロックにパケットが振り分けられているのを確認できます

 

nftables

CentOS8の場合

 

conntrack

conntrackコマンドでIPマスカレードの様子を確認できます

 

インストール

 

IPv4のアドレスはさっき調べた奴を。IPv4 over IPv6のグローバルIPになります。webブラウザで新しいページを開いてみたりすれば増えていきます。dportを見れば割り当てられたポート番号だけ使っているのも確認できます

 

 

性能

NATにも複数種類があることを今回知ったくらいの素人なので、的外れな見解になってしまうかもしれませんが、動作を詳細に確認してみます

 

TCP

先日500MB超の動画(mp4)をトップページに配置して話題になったニチバンのサイトですが、セッションバカ食いサイトとしても有名だそうで、MAP-Eのパフォーマンスを確認するベンチマークサイトとしても定評があるようです

 

先のスクリプトのループ数を1にして、ポートを16個しか使えない状態にします(私の場合1680番~1695番)

その状態でニチバン様のサイトを数ページまわってみたときの様子を見てみました

 

16個のポートがすぐにもっていかれ、たちまちニチバンのサイトが開けなくなりました。すごい…。1684番が1回重複してるのが気になりますが、よくわからないのでスルーします

 

ニチバンのサイトは開けなくなりましたが、すぐ他のサイトにアクセスしてみるとアクセスできました

宛先が違えばすでに使ってるポート番号を重複利用できるようです

 

YAMAHAの古いルーターでMAP-Eをやるとすぐポートが枯渇してしまうのでポートセービングIPマスカレードがないと実質使えない、という話を聞きます。YAMAHAの場合

動作タイプ1 では、基本的に異なるセッションについてはそれぞれ異なる外側ポート番号を順に割り当てていくため、IPマスカレードで管理可能なセッション数は、ほぼ使用できる外側ポート番号の個数で頭打ちになります。

一方、動作タイプ2 のときはポートセービングIPマスカレードで外側ポートが割り当てられるため、使用している外側ポート番号の個数が少ない場合でも合計のセッション数は非常に多くなる可能性があります。

ポートセービングIPマスカレード仕様でポートを割り当てる動作タイプ2 のTCPセッションについては、この特殊なポート番号割り当てポリシーは適用されず、 単純にそれぞれの宛先ホストに対して使える外側ポート番号を順に割り当てていきます。

とのことです。今回動作タイプ2(ポートセービングIPマスカレード)のようにぞれぞれの宛先ホストに対してポート番号を割り当てて、ポート数以上のセッションを張れることを確認できたので、ポートの枯渇に関しては気にしなくてよさそうです

それにOCNバーチャルコネクトなら、ポート数も他サービスの240個ではなく1008個と多く割り当てられますしね

 

UDP

QUICだとUDPのNATテーブルを占有するのでMAP-Eと相性が悪いという話を聞きます。先ほどあげたYAMAHAのルーターも、UDPについてはポートセービングマスカレードは動作しないと記載されています

今回の設定でTCPはポートセービングマスカレード同様の動作がされることを確認しましたが、UDPではどうなのか、追加で確認してみました

※確認環境は CentOS 8.4 です

 

クライアントPCのIPv6を無効にし、Googleのいろんなサービスを短時間で開きまくってみました

 

UDPでもTCP同様宛先が違えばすでに使ってるポート番号を重複利用できるようです。1681番も3回使われていますね。(1回目と2回目は頭3桁は同じ172ですが、別のアドレスです)

ということでUDPでも枯渇に困ることはそうそうないでしょう

 

 

ポートフォワード

OCNバーチャルコネクト側のグローバルIPでサーバーが立てる手順を確認します

http://ipv4.web.fc2.com/map-e.html

ポート番号はこちらでも確認できます

 

例えば、私の場合は最初のブロックが1680-1695です

OCNバーチャルコネクトのグローバルIPアドレスのポート番号1680へのアクセスを、192.168.1.10の80(Webサーバー)に転送する設定例です

 

ポートチェック【外部からポート開放確認】
サーバー管理者用の支援ページです。管理中のサーバーが外部からPortアクセス可能かをリアルタイムにチェック確認できます。

OCNバーチャルコネクトの方のグローバルIPとポート番号を組み合わせて確認

 

 

使い分け

ここからは IPv4(PPPoE) と IPv4(IPoE) と IPv6(IPoE) の使い分けについて考えます。IPv6についてはIPv6のアドレスとのやり取りになったら自動で使い分けられるのでIPv4の使い分けについて考えます

1つのルーターで両方出してる環境向けの話なので、そうじゃない方には参考にならないと思います

 

高速なIPoE、自分専用のPPPoEの2つ。こんなことできたらいいな、と思いつたことをちょっとやってみました

デフォルトゲートウェイをIPoEの方にして、条件によって一部PPPoE側からパケットを流していく、なんてことをしてみましょう

 

私の例ではインターフェイス名は

ppp0:PPPoE用のIF  ip6tnl1:IPv4(IPoE)用のIF  br0:ルーターのLAN側のIF

とします

 

 

下準備

ゲートウェイを条件によって変える場合はまずrp_filterの設定を変更します

 

この1行を追加

 

反映させます。これやっておかないとiptablesの挙動がぐちゃぐちゃになります。ドハマりしてしまいました。マークうつだけでフォワードしなくなるとかとにかく色々おかしなことになります

 

 

デフォルトゲートウェイをPPPoE側に設定したサブルートテーブルを作っておきます

 

ppp0をデフォルトゲートウェイとする10番テーブルを作りました

 

一応確認。条件を満たしたパケットだけこの10番テーブルを使わせてppp0からパケットを流す、という方針です

 

 

マーク値が1000だったら10番テーブルを使うよ、というルールを作ります。マーク値は後でiptablesで使います。MAP-Eのポート割り当てのときも使っていましたね

 

一応確認

 

マーク値が16進数になってますがまぁ気にしない気にしない

 

 

PPPoEのグローバルアドレスでサーバーをたてる

普段のネットサーフィンはIPoEの方で、だけどサーバーはポート番号を自由に使えるPPPoEで建てたい、なんてこともあると思います

 

たとえばポート8080番でWebサーバーをたてたとします。

http://<PPPoEのIPv4アドレス>:8080/

とアクセスしてもアクセスできません。デフォルトゲートウェイがIPoE側なので、PPPoEの方にアクセスがあってもIPoEから返事が出されてしまいます

NG例

 

図でいうとこんな感じになってしまうんですね。PPPoE側とIPoE側でIPv4のグローバルアドレスが違うので、別の人から返事が出されてる!ってことになって届きません

 

ということで、外部からPPPoEの方にアクセスがあった場合は、PPPoEの方から返事を出すようにします

 

この例では優先度は適当に100にしました。マーク値はさっき作ったルールに合わせた1000です。ppp0は私のPPPoE用の、br0は私のLAN側のIF名。適宜直してください

 

私はど素人なので解説なんてものはまったくできないのですが、雑に言語化します

1行目は、ppp0から入ってきたパケットはルーティング判断の前にコネクションマーク1000をうつよ!って感じだと思います

2行目は、このルーターのアプリケーションで処理したパケットについてるコネクションマークを普通のマークに戻すよ!って感じだと思います。ppp0から入ってきたパケットだけコネクションマーク1000がついてるので、ppp0からのアクセスのみマーク1000が立ちます。ルーティングテーブルが通常のものから10番テーブルのものに変わるので戻りはppp0から戻ります

3行目は、LANから流れてきたパケットについてるコネクションマークを普通のマークに戻すよ!って感じだと思います。ppp0から入ってきて、LANにある別のサーバーに転送されて、戻ってきたものがこれでマーク1000が立ち、10番テーブルを使うようになります

2行目はルーターにあるサーバーアプリ用、3行目はLANにある別のサーバー用の記述ってことですね。ルーターでサーバーを立てていなければ2行目は不要です。これでppp0側の<PPPoEのIPv4アドレス>へのアクセスに正しくppp0から返信できるようになります

 

コネクションマークとマークはどう違うんだとかそういうのはぐぐってください。私もわからないのです

 

こんなイメージでしょうか。赤のPPPoEは外部からサーバーへのアクセスの専用回線になります。赤の戻りもppp0から出てるようにした方が正しい図なんですが、見た目が不格好になるので…

 

 

ポートチェック【外部からポート開放確認】
サーバー管理者用の支援ページです。管理中のサーバーが外部からPortアクセス可能かをリアルタイムにチェック確認できます。

PPPoEの方のグローバルIPとポート番号を組み合わせて確認

 

 

特定の端末だけPPPoEを使わせる

そもそもサーバーだから受信しか考慮しないPPPoEだけで十分だ、ゲーム機なので一部のポート番号しか使えないMAP-Eじゃ困る、とかそんなときはIPアドレス指定でして割り振っちゃいましょう

 

LAN側の192.168.1.55からのパケットはマーク1000を打ってsubテーブル使うようにします=PPPoEを使いますよってことですね

 

試しにNintendo Switchに対してやってみましたが、接続テスト結果の「NATタイプ」がDからBに変わりました。オンラインゲームはしないので実際のゲームに問題があるかどうかまではチェックしてません

PS4もMAP-Eとは相性が悪いと聞いたことがあるので、ゲーム機はオンラインプレイをするならとりあえずPPPoE側にまわしてしまってもいいんじゃないでしょうか

 

余談ですが、Nintendo SwitchのNATタイプは、PPPoE側を使うようにした上で

このようにUDPをSwitchに転送するように設定すればAになります

 

 

iptablesがわかればもっと自在に振り分けられるようになると思います。私はわかりません

http://www.asahi-net.or.jp/~aa4t-nngk/ipttut/output/index.html
http://www.asahi-net.or.jp/~aa4t-nngk/ipttut/output/traversinggeneral.html

 

 

感想

PPPoE用とIPoE用でルーターを2台用意する必要もなく、PPPoEしか使えない端末がIPoEしか使えない端末かの2択、にもならないですし、もちろんIPv6(IPoE)はLAN下のものはすべて使える状態になりました。とりあえず大体やりたいことはできたので満足です。無線の強度以外は家庭用の無線LANルーターよりよいものになった気がします

 

ただ、私のPPPoE環境は、ありがたいことになぜか休日やゴールデンタイムでも安定環境なのでOCNバーチャルコネクトの恩恵がほとんどなかったります。ここまでやっといてなんですが、IPv4(PPPoE) と IPv6(IPoE)だけの環境に戻すかもしれません…

 

 

コメント

タイトルとURLをコピーしました