IPv6, 趣味

メリークリスマスです。ライトノベル好きのツチノコです。路地裏バトルプリンセスは読んでいるものとして以下の話をすすめます。

前回の記事でIPv4 Linuxルータを作成するところまで紹介しました。これで6000万回線くらいにLinuxルータを普及できたように思います。

今回の記事ではIPv6対応の部分について進めていきます。内容はこんな感じです。
・Router Advertisementふりかえり
・デザインをどうするか考える
・パッケージのインストールと設定
設定の部分は前回の記事と同じく設定ファイルを貼り付けてあるので以下長いです。

Router Advertisementふりかえり

以降の説明で必要になるので、デザインの前にRouter Advertisementを雑にふりかえります。
router-advertisement

図1 Router Advertisement

上の図1のように、ルータはRouter Advertisementを用いて、各クライアント(PC1, PC2)にIPv6 prefixを配ります。今回作るルータでも当然Router Advertisementを配りたいです。

また、Flets回線においてもRouter Advertisementを用いて各家庭にIPv6 prefixを配布しています。

デザイン

IPv6対応ルータの方式は色々考えることができます。思いついたのは以下の3つでした。
構成A: IPv6パススルーを行う
構成B: IPルーティングを行う
構成C: NAPTを行う

構成A: IPv6パススルーを行う

多くのルータには、IPv4とICMPに対してはrouter(L3)として動作し、IPv6とICMPv6に対してはbridge(L2)として動作する、いわゆるIPv6パススルーが実装されています。
IPv6パススルー

図2 IPv6パススルー

上の図2では、ISPのルータ(Router@ISP)からのRouter Advertisement(RA)が、家庭のルータ(Router@home)を通って、各クライアント(PC1, PC2)に届いています。

Linuxではebtablesを利用すると同様の動作が実現できます。しかし今回は以下の理由により見送ることとしました。
・Router Advertisementを自分で出したいという気持ち!(そういうお勉強のためにLinuxルータを使っている)
・IPv4とIPv6でL2セグメントの範囲が異なってしまうこと
・L2セグメントを大きくしてしまうこと(c.f. VLANで大きいL2 networkを組むことに問題があったのでNVO3技術が出てきた)
・単に他とは違うことがしたいという気持ち

ちなみに、bridgeするのではなく、Neighbor Discovery Proxyを使うという手もあります。Neighbor Discovery ProxyはRFC4389で定義されています。しかしこれもRouter Advertisementを自分で出せるわけではないので一緒です。

構成B: IPルーティングを行う

IPv6でもIPv4と同様にIPルーティングできます。
ip-routing

図3 IPルーティングする

上の図3では、家庭のルータ(Router@home)がRouter Advertisementを受け取り、同じprefix(w:x:y:z::/64)をRouter Advertisementで各クライアントに配布しています(radvdはRouter Advertisementを出すためのLinuxのデーモンです)。あとはeth0とeth1の間で適当にルーティングしてやればうまくいくはずです。

しかし、意外な盲点がありました。radvdの設定ファイルにはRouter Advertisementで配るべきprefixを書かないといけません。しかし、ISPから振られるIPv6 prefixは完全に固定ではないということです(参考: フレッツ・v6オプション について(NTT東日本の場合))。
Prefixが変わる機会はそうそうなさそうですが、とりあえず今回は見送ることにします。

構成C: NAPTを行う

IPv6に対しても、IPv4と同様にNAPT(or NAT or IP masquerade)することができます。
napt

図4 NAPTする

ネットワークをフラグメント化させるので、オープンでセキュアなIPv6対応とは言い難いです。
しかし、上の2つの方式の課題は解決できます。
・自分でRouter Advertisementを出せる
・eth1のアドレスを固定にできる

何か負けた気もしますが、今回はこの実装を使います。
ごちうさのじゃんけんと同じく負けるべき時もあります。

その他考慮すべきことにDHCPv6があります。
WAN側については必須ではないもののDHCPv6 client動作することにします。
LAN側についてはIPv4と同じくDHCPv6 server動作することにします。

パッケージのインストール

今回のルータでは以下のような動作をすることになりました。
・WAN側: Router Advertisementを受信する、DHCPv6 client動作する
・LAN側: Router Advertisementを出す、DHCPv6 server動作する
・WAN側とLAN側の間はNAPTする。

パッケージをインストールします。

・wide-dhcpv6-client: WAN側でDHCPv6 client動作するためのデーモン
・radvd: LAN側でRouter Advertisementを出すためのデーモン
・git-core: DebianだとLAN側でDHCPv6 server動作するためのデーモンがパッケージ化されてないので、git経由で入れる
ちなみにWAN側でRouter Advertisementを受け取るためには特にパッケージは不要です。

設定

それでは頑張って設定していきましょう。
なお、日本語でコメント入れてあるところについて、環境によってエラーになるようなら取ってください。

kernel parameterの設定(/etc/sysctl.conf)

ご参考: accept_ra は以下のような設定値を取ります。
0: そのインターフェースでRouter Advertisementを受信しない。
1: そのインターフェースでforwardingが無効なら、Router Advertisementを受信する。
2: そのインターフェースでforwardingが有効でも、Router Advertisementを受信する。

ご参考: 2.2.10. ソースルーティングの無効化

インターフェースの設定(/etc/network/interfaces)

WAN側はRouter AdvertisementでIPv6アドレスを設定されるのでここに記述することはありません。
LAN側(eth1)にはIPv6アドレスを設定します。設定するアドレスはユニークローカルIPv6ユニキャストアドレス(ULA)を利用します(参考: インターネット10分講座:IPv6アドレス~技術解説~)。今回の例ではfd00:1fe::1/64としています。ご利用の際はランダムに生成してください(参考: Unique Local IPv6 Generator)。

DHCPv6 clientの設定(/etc/wide-dhcpv6/dhcp6c.conf)

eth0からPrefix Delegation(参考: 書いて覚えるDHCPv6-PD)を要求します。不要な気もしていますが、eth0が受信しているRouter AdvertisementにOther Flagが立っているので念のため。

Router Advertisement Daemonの設定(/etc/radvd.conf)

eth1からRouter Advertisementを送信します。配布するprefixはfd00:01fe::/64です。

DHCPv6 serverの設定(/etc/dhcp/dhcpd6.conf)

Debianのisc-dhcp-serverパッケージはDHCP serverをインストールしてくれるものの、IPv4用のサービス登録や設定のみなので、IPv6用のサービス登録や設定を行う必要があります。設定ファイルと簡単なスクリプトを作成してありますのでそれを使います。

これでisc-dhcp-server6というサービスが登録されます。あとは設定を入れるだけです。

DNS resolverの設定(/etc/unbound/unbound.conf)

LAN側(fd00:1fe::/64)からの問い合わせに応答します。

FirewallとIP masqueradeの設定(ip6tables)

IPv4と同じようにIPv6でもシェルスクリプトを作って、アクセス制限やmasqueradeの設定をします。

設定の反映

問題なく設定されていたら、これでデュアルスタックなルータとして動作するはずです。

result
わーい。IPv6はいいぞ。

(12/26 追記) カメもはっきりくっきり踊っています。

おわりに

これで家庭用ルータのIPv6対応が出来ました。
世間一般の実装とは違いますが、副次的なメリットとして今回の実装は概ねIPv4と同様の動作をしています。
IPv6の勉強の一歩としてもわかりやすいのではないかと思います。
年末年始の自由工作にいかがでしょうか。

p.s. 転生従者の悪政改革録よいです。

IPv6, 趣味

おはようございます。ライトノベル好きのツチノコです。異世界居酒屋「のぶ」 4杯目はもうみなさん読まれていることと思います。

IPv6が最近盛り上がっているようです(今世紀最高の出来)。ツチノコの巣でもIPv6勉強会が開かれましたスライドによると現状のユーザー側のIPv6接続環境はほぼデュアルスタックとのことです。

ツチノコのひとりとして世間一般に遅れてはいけないと思いましたので、自宅のLinuxルータをIPv6対応にしました。正確には新規にIPv4・IPv6両対応のLinuxルータを新規に作成して切り替えました。
せっかくなので手順をシェアします。といいつつ、今回の記事はIPv4でPPPoE接続するところまでです。
次回はIPv6対応部分のデザインとインストールをします。

なお、ご利用は自己責任でお願いします。また、(特にIPv4部分の)解説はある程度適当です。ツチノコブログの読者なら許してくれるはずです。
以下、設定ファイルを直接貼り付けているので大分長いです。

前提条件とハードウェア

前提条件は以下です。利用環境であるwataken家がこの条件というだけです。
・IPv4はPPPoE方式のプロバイダを利用していること
・IPv6はネイティブ方式のプロバイダを利用しており、IPv6オプションを契約していること
・ひかり電話を利用していないこと

ハードウェアはNICが2portあるPC・サーバが必要です。WAN側・LAN側で1portずつ使います。

作業の流れ

作業の流れは以下のようになっています。今日は(2)までです。
(1) OSのインストールとIPv4用のパッケージのインストールを行う(既存のインターネットに接続可能な環境を利用)
(2) IPv4用の設定を行う(この段階でこのルータでIPv4でインターネット接続可能になる)
(3) IPv6用のパッケージのインストールと設定を行う

OSのインストール

今回はDebian(stretch)を使います。Debian(jessie)でもよいかと思います。
後で必要なパッケージはapt-getでインストールするので、OSインストール時にはパッケージは何も選択しなくてもよいです。

他のディストリビューションを利用する場合は、Kernel version が 3.9.0 以上であることを確認してください。

IPv4用パッケージのインストール

一般に家庭用のルータでは、PPPoE client、FirewallとIP masquerade、DHCP server、DNS resolverが必要になります。それぞれインストールします。
あと、ntpとsshはとりあえずインストールしておきます。お好みでtcpdumpなんかもいれていいと思います。

IPv4用の設定

ここからIPv4用の設定をしていきます。
作業の最後にrebootして設定を反映するので、設定ファイルを編集後にそれぞれserviceのrestartなどは不要です。

kernel parameterの設定(/etc/sysctl.conf)

ルータなのでforwardingを有効にします。

インターフェースの設定(/etc/network/interfaces)

eth0をWAN側、eth1をLAN側として利用します。
eth1(LAN側のインターフェース)は通常通りIP addressとnetmaskを設定します。
eth0(WAN側のインターフェース)はIP address無し(address 0.0.0.0)でupする、up時にppp0をupする、ppp0は/etc/ppp/peers/dsl-provider-testに基づいてpppoe接続する設定です。

pppoeの設定(/etc/ppp/peers/dsl-provider-test, /etc/ppp/chap-secrets)

/etc/ppp/peers/dsl-provider-test(/etc/network/interfacesでファイル名は指定)はpppoeの設定を行うファイルで、/etc/ppp/chap-secretsはユーザ名・パスワードの対応を格納するためのファイルです。
それぞれファイルの testuser と testsecret はプロバイダのユーザ名・パスワードを入れます。
面倒ならpppoeconfを利用してもいいと思います。

DHCP serverの設定(/etc/dhcp/dhcpd.conf)

今回は192.168.1.128-195の範囲をDHCPとして利用することにします。また、DNSとgatewayとしてLAN側IP(192.168.1.254)を配布します。

DNS resolverの設定(/etc/unbound/unbound.conf)

LAN側IP(192.168.1.254)からの問い合わせに応答します。

FirewallとIP masqueradeの設定(iptables)

iptablesはコマンド経由で設定するのが一般的なので、シェルスクリプトを書くことにします。適当な場所に iptables.sh を作成します。

設定の反映

問題なく設定されていたら、これでIPv4対応のpppoeルータとして動作するはずです。

次回に続きます。

p.s. 4巻が出た路地裏バトルプリンセスが面白いです。

huawei, インフォメーション, コラム, 製品

Huaweiという会社を知ってますか?。
正式名称は、華為技術有限公司(ファーウェイ・テクノロジーズ、Huawei Technologies Co. Ltd.)、Wikipediaの華為技術のページを見ると、なにげにすごいことが書かれています。

2010年2月、米国の著名なビジネス誌「ファスト・カンパニー」にて、Most Innovative Company Ranking(世界で最も革新的な企業ランキング)にて、facebook、Amazon、Apple、Googleに続き、第5位に選ばれた。

毎年売上の10%以上を研究開発費に投じる等、先端技術開発への投資が旺盛な企業として知られており、20か国拠点で働く全従業員の内46%が研究開発職に携わっている。2008年に初めて国際特許出願件数世界1位になるとはその後は5位以内をキープし続けている。

そんなHuaweiの中国本社に先週行ってきましたよ。
とてもとても刺激的な旅でした。
セッティングしていただいた、Huawei様、日商エレクトロニクス様、本当にありがとうございました。

IMG_1069

こんな内容で旅行記を書いて行こうと思っています。ご期待ください。

  • 1日目 日本から深圳(深セン)までの移動
  • 2日目 本社ショールーム訪問
  • 2日目 本社食堂で食事
  • 2日目 本社ラボでのディスカッション
  • 2日目 電気街散策
  • 3日目 工場見学
  • 3、4日目 広州散策、帰国
  • 中国でのインターネットへのアクセス
  • その他

イベント, インフォメーション, お知らせ, 勉強会

これは MySQL Casual Advent Calendar 2015 の19日目です

みなさん、肉の日といえば毎月29日を思い浮かべますでしょうか。
焼き肉が安くなったり、いろいろなキャンペーンを行っている、あの日です。
ツチノコの生息地、大手町のお店でも肉の日にランチ焼き肉が安くなったりしているようです。
MySQL界隈で毎月29日といえば、そうです MySQL用全文検索エンジンMroonga 及び Groonga のアップデート日です。さらに、毎年だいたい02/09にメジャーアップデートを行っています。
現在はVer5系、Groongaは5.1.0、Mroongaは5.10が最新バージョンです。
12/29にはそれぞれまたアップデートが来るのではないでしょうか。
また、MySQL5.7において全文検索機能が入ったということで、いろいろと皆さん試しているのではないか、と思います。

そして来年2016/02/09のに、下記イベントが開催されることとなりましたので、そのご案内を致します!

MySQLとPostgreSQLと日本語全文検索

概要

「MySQLとPostgreSQLと日本語全文検索」は次の2つのことについて紹介するイベントです。

MySQLで日本語全文検索する方法とその利用事例
PostgreSQLで日本語全文検索する方法とその利用事例

私しののめも「DMM.comラボでの日本語全文検索の利用事例紹介」として簡単にお話をさせて頂く予定となっております。

また席に余裕があるようですので、ぜひ皆様恵比寿ガーデンプレイスへお越しくださいませ!
また、MySQLでの全文検索利用事例、PostgreSQL向けのPGroongaの利用事例、pg_bigm利用事例も発表者募集中ですので、ぜひよろしくお願いいたします!

イベント概要
https://groonga.doorkeeper.jp/events/35295
MySQLとPostgreSQLと日本語全文検索
日時:2016-02-09(火)20:00 – 22:00
会場:DMM.comラボ 東京都渋谷区恵比寿4-20-3 恵比寿ガーデンプレイスタワー21F

RabbitMQ, Ruby

 こんにちは、若手ツチノコの大山裕泰です。Ruby Advent Calendar 2015 の 12 日目を担当しまーす。

はじめに

 複数のホストに跨った処理を実現するシステムを構築する際、何がしかの Message Queue (MQ) システムが利用されるケースがあります。MQ を利用することで、送信元からは接続先についての様々な事(どういうネットワークの先に、どれだけ居て、どんな事をやっているか)について考えなくてよくなるため、複雑な分散システムをシンプルに設計・実装することができます。
 MQ の中でも特に AMQP は、柔軟なメッセージルーティングと確実なメッセージ転送機能に加え、高いスケーラビリティを実現するシステムとして古くから利用されています。AMQP については、GREE のエンジニアブログ で分かりやすく解説されています。
 AMQP の実装としては ActiveMQRabbitMQ が有名です。特に RabbitMQ は OpenStack や VMware NSX, Sensu など分散システムのミドルウェアとして様々なソフトウェアで利用されています。
 もちろん RabbitMQ が万能というわけではなりません。メッセージの永続化による確実なメッセージ転送などの機能とパフォーマンスはトレードオフになっています。特にリアルタイムシステムなどには向きません。
 これに対して AMQP で規定されている柔軟なメッセージ転送機能を実現する Broker 機能を一部 (ないしは全部) 省いた Apache KafkaZeroMQ など、低いレイテンシで高いスループットを実現する実装があります。

概要

 今日は RabbitMQ による柔軟なメッセージトポロジーの構築を実現する機能について紹介します。

環境構築

 本題に入る前に RabbitMQ の環境構築作業について簡単に説明します。RabbitMQ のインストールは、本家のマニュアル (*1) や、いろんな人のブログで紹介されているのでそちらをご確認ください。
 インストールができたら、以下のコマンドでユーザ “ohyama” の作成と権限の設定を実施します。

 本編では MyMQ ライブラリ を使うのでこれの設定もしておきます。

本題

 以下の図は、RabbitMQ による一般的な Pub/Sub メッセージングモデルを表しています。

 Exchange (Broker) が Publisher からのメッセージを受け取り、Subscriber がキューを通してメッセージを取得します。
 これを MyMQ ライブラリを使うと、以下のようにメッセージの送受信が行えます。

Sub

Pub

 Publisher / Subscriber 双方で指定されている ‘e1’ と ‘r1’ はそれぞれ、AMQP の Exchange Name と Routing Key を表しています。
 MyMQ.receive を実施した後、別のターミナルから MyMQ.send を送るとメッセージ ‘data’ が送られることが確認できると思います。

 さて、ここで本題の exchange to exchange binding (e2e binding) について紹介します。尚、元ネタは こちら になります。
 通常、AMQP における Routing Key は、Exchange と Queue とを関連付けるために存在しています。この仕組みによって、キューの存在が Publisher 側から隠蔽されます。Publisher は Broker (Exchange) にメッセージを送ることだけを考えればよく、Publisher がどこに居て、どれだけの数存在するかは全く気にしなくてよくなります。後のことは Broker がよしなにしてくれます。
 e2e binding では同様に、ある Exchange と別の Exchange とを関連づけ、既存のトポロジーに新たな配送経路を設定します。

 以下は、先ほどと同様の Exchange と Queue が 2 つになった例を表します。

 先ほどの例との違いは、Pub2/Sub2 が追加されたことに加えて、Sub1 のキューの Routing Key が ‘r1’ から ‘*’ に変更されました。これは e1 に送られる全てのメッセージをキューイングすることを表します。
 新しいターミナルを起動させ、以下のコマンドを実行してください。

 さて、この例ではそれぞれの Exchange に送られたメッセージは、別々のキューに格納され、Pub1 が送ったメッセージが Sub2 から取得されること(またはその逆)はありません。
 ここで別のターミナルを立ち上げ、以下のように e2 から e1 に Routing Key = ‘r2’ の e2e binding を設定します。

 これによって、先ほどの図は以下のようになります。

 e1 と e2 間で Routing Kye = ‘r2’ の新たな転送経路が設定されました。これにより Sub1 では Pub1 に加えて、Pub2 のメッセージも取得するようになります。
 以下のように、最初に実行した Pub1 から e1 へのメッセージ送信に加え、以下 Pub2 から e2 へのメッセージ送信を実施してみてください。

 Sub1 において、それぞれの Exchange ‘e1′,’e2’ に送られたメッセージ ‘foo’,’bar’ が取得できることが確認できると思います。

終わりに

 今回は e2e binding によってアプリケーションの変更なしに、柔軟なメッセージのルーティングトポロジーを動的に設定する方法を紹介しました。
 冒頭で述べたように RabbitMQ の適用範囲は広く、様々な場面で利用されています。SDK も Ruby, C/C++, Java, Python から、OCaml, Haskell に至るまで、ほぼあらゆる言語が提供 されており、AMQP の実装としてはデファクトスタンダードと言っていいと思います。
 ちなみに RabbitMQ 自体の開発言語は Erlang です。

PAGE TOP