1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

FreeBSDでルーターを作る その2:IPv4 over IPv6(OCNバーチャルコネクト)対応失敗編

Posted at

FreeBSDでIPv4 over IPv6(OCNバーチャルコネクト)対応できるか?

えー、結論から言うと失敗しました。
タイトルは失敗編と書いてありますが、成功編の執筆予定はありません...

失敗したのをそのまま書くのも何ですが、前回続きを書くと書いた手前、とりあえず試したことを書いておきます。どなたかが完成させてくれることを期待して...

前回の記事 (https://qiita.com/yshdsnd/items/51db16214dc8202baa71) で、IPv6ブリッジ+PPPoEのルーターは作れており、実際この設定でしばらく運用していました。
そして、FreeBSDは長らくMAP-Eのポートをうまいこと割り当てる方法がなかったのですが、先日12.2-STABLE,13.0-STABLEのpfにMAP-E対応が入ったことからこれを使ってOCNバーチャルコネクト対応できるのでは?と考えたのがそもそもの始まりです。

とりあえず、やったこと

まずは、IPv4 over IPv6のトンネルを作ることから始めます。
現在の環境は、光電話なしの契約なので、IPv6に関してはIPoEでRAが流れてきてアドレスが割り当てられるので、IPv6での通信は簡単にできます。

そこで、トンネル先となるBE(Border Relay)のアドレスに向けて、トンネルを作成します。ここではgifデバイスを使います。

BEのアドレスは、以下のページで調べることができます。
割り当てられているIPv6アドレスのプレフィックスを入力すると、自分のアドレス情報が出てきます。本来は自分で計算するかAPIで入手するみたいですが、そのあたりの情報があんまりないので、誰が作ったか謎なのですが、以下のサイトを使わせてもらいます。

スクリーンショット 2021-07-02 230630_修正.png

peeraddrがBEのアドレス、CEがルーターのアドレスです。


# ifconfig bridge0 inet6 2400:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx prefixlen 64 alias
# ifconfig gif0 create
# ifconfig gif0 inet6 tunnel <CEアドレス> <BRアドレス> prefixlen 64 mtu 1460
# ifconfig gif0 inet <CEのv4アドレス> <CEのv4アドレス> netmask 255.255.255.255 alias
# route add default -iface gif0

トンネル自体はこれでOKのはずですが...そもそもgifって単純にアドレスaliasで付けられないので、inet <CEのv4アドレス> <CEのv4アドレス> という指定の仕方をしたのですが、そもそもこれ同じアドレスへのトンネルという状態になって正しくない気がします...

MAP-Eのポートの設定ですが、MAP-E対応は2021/5月頭に-STABLEに入ったので、今のところ、-RELEASE版では対応していません。使う場合は-STABLEにアップデートしましょう。

設定方法ですが、man pf.confによると、

 map-e-portset ⟨psid-offset⟩ / ⟨psid-len⟩ / ⟨psid⟩
 With nat rules, the map-e-portset option enables the source port
 translation of MAP-E (RFC 7597) Customer Edge.  In order to make
 the host act as a MAP-E Customer Edge, setting up a tunneling
 interface and pass rules for encapsulated packets are required in
 addition to the map-e-portset nat rule.

 For example:

 nat on $gif_mape_if from $int_if:network to any \
           -> $ipv4_mape_src map-e-portset 6/8/0x34

 sets PSID offset 6, PSID length 8, PSID 0x34.

という事らしいので、アドレス先ほどのアドレス計算ページの結果から以下の様にすれば良さそうです。


ext_if="gif0"
...
nat on $ext_if from $int_if:network to any -> ($ext_if) map-e-portset 6/6/0x13

というところまでやってみたのですが、そもそもトンネルがうまくいってないようで、外部のIPv4アドレスにはpingが通りませんでした。

色々調べたけど分からず、これ調べている間、IPv4アドレス使えなくて色々困ったので、もう諦めて市販ルーターを買ってしまいましたw

さようなら、FreeBSDの自作ルーター。20年位ずっと歴代FreeBSDでルーター作ってきたけど、ついに市販品の軍門に降りました。
これで私も一般人の仲間入りです。
# 買ったのはYamahaのルーターなので、やっぱり逸般人じゃないかという話もある。

おわりに

私は諦めてしまいましたが、こうすればうまくいったよという人がいれば教えて欲しいです。

#よく考えたらpfでgif0の通信塞がったままの気がする...

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?