「これからはIPv6の時代だ!」そんなふうに考えていた時期が筆者にもありました。確か2005年頃の話だったかと思います。
それから10数年の時が流れ、世の中は未だにIPv4だらけです。人生の進捗もダメなままです。
そんな折、某所でIPv6の需要が急激に高まってきたので、久し振りにIPv6と戯れてみました。
今回のお題は「v6喋る串」、平たく言えば「IPv4だけ喋るクライアントからの HTTP Request を、IPv6な HTTP Server へ送るプロクシ」です。こんなものの需要はほとんど無いでしょうけれども、手元の環境はIPv4の回線しか無いけどIPv6での接続確認も取りたい!という検証用には非常に有用でしょう。
IPv6 アドレスを容易に獲得できるインフラ
AWSでのIPv6サポートは(本記事執筆時点では)限定的なものであり、EC2のサーバに直接IPv6アドレスを割り付けることはできないようです。今回の検証にはAWSを使うことはできません。
AWSに匹敵するほど我々に身近なサーバ屋さんの中でIPv6対応を謳っているのは、さくらインターネットさんの「さくらのVPS」と「さくらのクラウド」です。今回はこれらのお世話になりつつ実験を進めたいと思います。
この記事では さくらのVPS と さくらのクラウド の両方を使っていますが、おそらく片方だけを2環境用意するという方法でも上手く行くでしょう。
「どちらを使ったら良いの?」という方には、ただ単に実験するだけなら さくらのクラウド の方がオススメです。長期的に使い続けて、かつ、負荷の程度が見えている状況なら さくらのVPS の方が良いでしょう。クラウドの方はクレカ必須であるように見えるので、持っていないという方はご注意を。さくらのクラウド の場合は後述の「ルーター+スイッチ」が最低でも3500円程度/月・1ネットワーク、VPSの場合は初期費用が1600円程度/月・1台 かかるので、いずれにせよ実験するために5000円くらい使うことになります。
筆者が用意した環境
IPv4 / IPv6 両方喋る HTTP Server : Debian編
Apacheのセットアップ
たぶん sudo apt-get install apache2
とかやれば、Apacheは入るでしょう。
とりあえず、インストールした後にアクセスして、テスト用ページが表示されることと、アクセスログが吐かれることを確認しましょう。アクセスログは、後でIPv6のアクセスを受け付けるようになったときに、接続確認にも使います。今はIPv4でのアクセスログが吐かれていることでしょう。
eth0 で IPv6 を有効に
さくらのVPS のコンパネにアクセスすると、
を教えてくれるので、その情報を /etc/network/interfaces
に書き込み、サーバ再起動します(恐らく、ネットワーク関係のサービスだけ再起動しても有効なはずだけど、調べるのが面倒臭くてサーバ再起動してましたw)。
詳しい書き方や動作検証の方法などは、こんな解説もあるので参考にしましょう。
ip6tables
基本的な考え方は通常のIPv4での iptables と同じです。ですが、IPv4 で効いていた設定が効かなかったり、指定したらエラーを吐いて設定を食ってくれないということが非常に多くありました。今回の検証の中で、筆者が最も時間を費やしてしまったのはこの部分です。
最終的にはこんな設定を /etc/iptables/rules.v6
に書き込みましたが、まだザルだらけなので改善の余地は大いにあります。
*filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :LOG_PINGDEATH - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p ipv6-icmp -j ACCEPT -A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT -A INPUT -j DROP -A FORWARD -m limit --limit 1/sec -j LOG --log-prefix "[IPTABLES6 FORWARD] : " -A FORWARD -j DROP -A OUTPUT -p tcp -m multiport --sports 135,137,138,139,445 -j DROP -A OUTPUT -p udp -m multiport --sports 135,137,138,139,445 -j DROP COMMIT
どうも -m
のオプションが機能していないような感覚がありますが、裏づけまでは取れていません。
こうやって書いた設定を有効にするにはroot権限で netfilter-persistent reload
を実行していました(Debianです)。実行後、反映されるまでには数秒〜10秒程度の遅延がありました。
串
さて、さくらのクラウドのお世話になりながら、串をセットアップしていきましょう。冒頭に記載しました通り、Ubuntu 16.04 を使っています。
さくらのクラウド でIPv6を使うためのテクニック
実は、さくらのクラウドで立てるサーバを単体で使っても、IPv6アドレスを獲得することはできません。
「ルーター+スイッチ」を設置し、そこでIPv6を有効にし、その状態でサーバを新設してルーター+スイッチに接続させる必要があります。
このとき、サーバを共有セグメントで立ち上げた後でルーター+スイッチに接続しようとすると、IP(v4, v6)アドレスがDHCP的な仕組みではなくて静的にOS内に設定されていることから、後でそれを書き換えるための手間が増えます。サーバ起動よりも先にルーター+スイッチを用意しておくことで、少なくともIPv4アドレスについては何もしなくて良くなります。
IPv6を有効にするには、/etc/network/interfaces
に以下の内容を追記し、サーバ再起動します(これも恐らく、ネットワーク関連のサービスの再起動だけでも行けるはず)。
iface eth0 inet6 static address 2401:2500:***(ヒミツ)*** netmask 64 gateway fe80::1
ここで address の値は、ルーター+スイッチの詳細情報「IPv6割当可能範囲」を参考にして、他のサーバと衝突しないように自分で勝手に付けます。
Squid の設定
root権限で apt-get install squid
みたいなコマンドを打てば、squid をインストールすることができます。
設定ファイルは /etc/squid/squid.conf
に置いてあるので、バックアップを取った上で編集し、
acl theowner src ${自分のIPv4アドレス}/32 http_access allow theowner
という設定を先頭の方に差し込みましょう。設定ファイルの下の方に http_access deny all
という一節がありますが、恐らくここよりも上に書いていれば良いのでしょう(下に書くことを検証してはいません)。best-practiceとしては、別のファイルに設定を書いておき、それをincludeして使う形が望ましいですが、ちょっと検証するだけのサーバならどうでもいいでしょう。
ip6tables
前述の、Debianで設定した時と考え方は同じです。
(ですが、筆者はここで 座流・咳百合亭 という大技を繰り出しましたとさ…orz)
長期的に設置したり、大事な情報を置いたりすることになるサーバなら、きちんと設定しましょう。v4に関しては さくらのクラウド のパケットフィルタ機能で制御できるようです。
Outgoing の IPv4 を殺す
恐らく、ここまでの手順を踏むだけで HTTP Proxy サーバとしては十分に機能するはずです。
お手元のブラウザまたはOSのプロクシ設定を、ここで建てた串に向けます。
(※squidのデフォルトポートは 3128 です)
この状態で、冒頭で建てたHTTPサーバへアクセスすると、きちんと IPv6 でのアクセスが記録されます。良かったですね!
実は、squid がプロクシとして動作するとき、IPv6とIPv4の両方で HTTP Server にアクセスできるのならば、IPv6 を優先して使うという挙動を取ります。
[squid-users] Outgoing IPv6 address with no IPv4 address access(Squidのメーリングリストに、2015年に投稿されている情報)
IPv6で HTTP Server に接続することが目的なら、この挙動を信じて、これ以上作業をする必要はありません。
もしも「IPv6でなければエラーにしたい」のであれば、iptablesをいじって、串からの outgoing の HTTP(S) のパケットを破棄すれば良いでしょう。iptablesの設定で「DROP」だとやたら待たされるでしょうから「REJECT」が良いでしょう。
参考図書
- 作者: 井上博之,黒木秀和,小林直行,志田智,鈴木暢,矢野ミチル
- 出版社/メーカー: オーム社
- 発売日: 2013/07/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
- 作者: Silvia Hagen,市原英也,豊沢聡
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2007/06/22
- メディア: 単行本(ソフトカバー)
- 購入: 3人 クリック: 136回
- この商品を含むブログ (15件) を見る
- 作者: 江崎浩
- 出版社/メーカー: インプレスR&D
- 発売日: 2007/11/13
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 37回
- この商品を含むブログ (8件) を見る