第2回 SLB-PTでWebサーバをさくっとIPv6対応に
A10ネットワークス株式会社
山村剛久
2012/4/26
検討事項1:MTUに関連する考慮
MTUは悩ましい問題です。IPv6では、経路途中のルータでのフラグメントによる負荷をなくすという目的のため、経路上のルータでフラグメントせず、エンドツーエンドで経路上の最も小さいサイズのMTUに調整する実装となっています。
【関連記事】 シンプルで洗練されたIPv6のヘッダフォーマット http://www.atmarkit.co.jp/fnetwork/rensai/ipv6-03/ipv6-01.html |
MTUやMTUの調整方法に関するIPv4とIPv6間の違いを、表1にまとめてみました。
IPv4 | IPv6 | |
最小MTUサイズ | 規定なし (実質576バイト以上) |
1280バイト |
途中経路上ルータでの フラグメント可/不可 |
可 | 不可 |
MTUサイズ調整方法 | ICMPv4 Path MTU Discovery | ICMPv6 Packet Too Big |
DFビットの有無 | 有 | なし(途中でのフラグメントの概念がない) |
AXシリーズのようなSLB-PTを行うロードバランサは、IPv4の世界とIPv6の世界の間に立ち、両方の世界のMTUのハンドリングを行います。基本的にはICMPv4 Path MTU DiscoveryやICMPv6により、デバイス側で自動的に調整してうまくやってくれるはずです。しかし機器の実装やネットワーク環境(例えば途中のルータでICMPのフィルタがされているなど)によっては、問題が発生する場合もあり得ます。
対応方法はそれぞれのケースに合わせて考える必要がありますが、問題が発生した場合の最終手段としては、IPv6のMTUサイズを最小の「1280」にしてしまうという方法もあります。これにより通信上のエラーは解決できますが、一度に送信できるデータ量が少なくなってしまうので、通信効率は下がります。
検討事項2:L7ヘッダやそのペイロードのリライト
今回紹介するケースでは、IPv4のWebサーバに対して、IPv6端末からロードバランサを介してアクセスしています。
もし、Webサーバが返信するコンテンツ中のハイパーリンク先がIPv4サーバであった場合、そのハイパーリンクをクリックすると、IPv6端末からIPv4サーバに対してアクセスしようと試み、通信エラーが発生して結局リンク先に飛べなくなる、といった問題が発生します。これでは、一時的にアドレスが変換されたとしても、実用上は使えないに等しい状態です。
もしハイパーリンク先がIPv6サーバとなっているのであれば、何も気にすることはありません。しかしハイパーリンク先がIPv4サーバであった場合には、間に立つSLB-PTを行うロードバランサで、ハイパーリンク先のホスト名のリライト(書き換え)を行い、IPv6サーバの名前へ書き換えることで対処が可能です。つまり、Webサーバのコンテンツを変更することなく対応できます。
例えば、コンテンツ中のハイパーリンク先が以下のIPv4 Webサーバ(www.a10networks.com)になっていた場合、IPv6 Webサーバであるipv6.a10networks.comに書き換えます。
<A href=http://www.a10networks.com/new.html> </A>
↓
<A href=http://ipv6.a10networks.com/new.html> </A>
なお、例として挙げているAXシリーズでは、aFleXというTclベースのスクリプト言語をサポートしています。このaFleXを利用することで、コンテンツの中身を引っ掛けてリライトすることが可能です。
以下は、上記の場合のaFleXのサンプルです(ipv6linkという名前でスクリプトを保存します)。
when HTTP_RESPONSE {
if {[HTTP::status] == 200} {
HTTP::collect [HTTP::header Content-Length]
}
}
when HTTP_RESPONSE_DATA {
regsub -all "http://www" [HTTP::payload] "http://ipv6" newdata
HTTP::payload replace 0 [HTTP::header Content-Length] $newdata
HTTP::release
}
こうして作成したスクリプトを、Virtual Portの設定に追加します。
slb virtual-server vir2 2001:db8:1:1::1
port 80 http
source-nat pool pool1
service-group sg-80
aFleX ipv6link
こうすることで、Webサーバのコンテンツを直接編集する必要なく、前段のAXシリーズでハイパーリンク先をIPv6サーバへ振り向けることが可能になります。
なお、オリジナルのコンテンツはIPv4 Webサーバで書かれていますから、IPv4端末からのアクセスの場合には書き換えは不要です(aFleXはVIPにバインドしていますから、IPv4のVIPにはこのaFleXをバインドしなければいいのです)。
今回はWebサーバを例に挙げているため、このようなハイパーリンクのリライトが必要となりました。しかし、例えばVoIPや仮想デスクトップのような他のアプリケーションには書き換えが不要であったりします。逆に、特殊なALG(Application Layer Gateway)機能により、アプリケーションごとの特殊なヘッダやペイロードの書き換えが必要になることもあります。使用する機器により可/不可がありますので、利用シーンに合わせて事前の機能確認が必要となるでしょう。
検討事項3:IPv4←→IPv6間の変換ログの保存
通常の運用では、セキュリティの観点から、Webサーバに誰が、いつ、どこからアクセスしてきたかをトレースするためにアクセスログを取っているかと思います。
ところがSLB-PTでは、Source NAT(ソースアドレスの書き換え)が必須になります。そのままではログを取る対象はSource NATされた後のもので、すべてのソースIPが同一になってしまいます。このままでは、アクセスしてきた端末を特定できません。
そこでSLB-PTでは、何らかの手段でログを採取する機能を備えるようになっています。AXシリーズの場合は、以下の方法を提供しています。
(1)Webサーバ側でアクセスログを取得する方法
(2)Syslogサーバ側でアクセスログを取得する方法
■(1)Webサーバ側でアクセスログを取得する方法
AXシリーズでは、HTTPヘッダ中の“X-ClientIP”というフィールドに、Source NAT変換される前のオリジナルのIPv6アドレスを格納して送信できます。これによりIPv4 Webサーバ側で、どのIPv6端末がアクセスしてきたかというログを採取できます。
slb template http clhttp
insert-client-ip
slb virtual-server vir2 2001:db8:1:1::1
port 80 http
source-nat pool pool1
service-group sg1
template http clhttp
!
この際、Webサーバ側にも設定が必要になります。Apacheの場合、Httpd.conf内のLogFormatディレクティブに以下の内容を追加します。
%{ヘッダ名}i
デフォルトでは「X-ClientIP:」というヘッダが追加されるため、以下の赤字部分を追加します。なお下記の例では“(ダブルクォーテーション)で区切っているため、「\"」を両側に追記しています。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"{X-ClientIP}i\" " combined
この結果、Webサーバ側で以下のようなログを取得できるようになります。
192.168.0.254 - - [15/Feb/2011:13:04:24 +0900] "GET / HTTP/1.1" 200 12 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)" "2001:db8:1:1::250"
192.168.0.254 - - [15/Feb/2011:13:04:27 +0900] "GET / HTTP/1.1" 200 12 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)" "2001:db8:1:1::250"
■(2)Syslogサーバ側でアクセスログを取得する方法
先に紹介したWebサーバ側でのアクセスログの記録が可能なのは、L7でロードバランスを行っている場合だけです。では、L4でロードバランスを行う際にはログを取得する方法がないかというと、そうではありません。L7ヘッダのリライトはできませんが、AXシリーズからSyslogサーバにログを送信することで取得は可能です。
!
slb server logserver a.b.c.d ……(1)
port 514 udp
!
slb service-group group-syslog udp ……(2)
member logserver:514
!
ip nat template logging logtemp ……(3)
log port-mappings both
service-group group-syslog ……(4)
include-rip-rport ……(5)
!
slb virtual-server vir2 2001:db8:1:1::1
template logging logtmp ……(6)
port 80 tcp
source-nat pool
各設定の意味は以下の通りです。
(1)ログサーバをSLBのリアルサーバのように作成します。
(2)サービスグループを作成します。
(3)ロギングテンプレートを作成します。ここで「severity」「facility」などを設定できます。defaultではlocal0、debuggingで送信されます。
(4)サービスグループを指定します。
(5)このinclude-rip-rportを設定すると、どのIPv4サーバへ送信されたかをログに記録します。
(6)バーチャルサーバの配下にロギングテンプレートをバインドします。
AXシリーズの場合では、このような設定を行うと、Syslogサーバに次のようなログが送信されます。
Feb 16 12:39:26 ax19 NAT-TCP-C: [2001:db8:1:1::250]:58070 -> 192.168.0.254:2134 RS 192.168.0.1:80#015#012<135>Feb 16 12:39:28 ax19 NAT-TCP-F: [2001:db8:1:1::250]:58070 -> 192.168.0.254:2134#015
Feb 16 12:39:38 ax19 NAT-TCP-C: [2001:db8:1:1::250]:58071 -> 192.168.0.254:2135 RS 192.168.0.2:80#015#012<135> Feb 16 12:39:40 ax19 NAT-TCP-F: [2001:db8:1:1::250]:58071 -> 192.168.0.254:2135#015
このように、IPv6端末のIPv6アドレスがログとして残っていることが分かります。また別の方法として、先に紹介したaFleXを使ってログを取得する方法もあります。
when SERVER_CONNECTED { log "Connected: [IP::client_addr] ([TCP::client_port]) -> [IP::server_addr] ([TCP::server_port])" }
このルールをvPortにバインドします。
slb virtual-server vir2 2001:db8:1:1::1
port 80 http
source-nat pool pool1
service-group sg1
aFleX ipv6-log
するとAXシリーズ上のログとして、次のように表示されるようになります。
Dec 8 12:10:28 ax32 a10logd: [AFLEX]<6> Connected: 2001:398:2:1::114 (38634) -> 192.168.0.1 (80)
端末に先を越される? サーバのIPv6対応
最近リリースされているPCでは、OSの多くがネイティブでIPv6対応となっています。またルータやL3スイッチも、多くがデュアルスタック対応となってきています。そういう意味では、徐々にですが、企業内イントラネットのユーザーデバイス/ネットワーク機器の更新に伴い、あらゆるものがIPv6対応となっていくでしょう。
残すはサーバのIPv6化です。しかし、技術的にはサーバ自身でIPv6化はできたとしても、どうしてもホストしているアプリケーションの改変が必要であったりして、なかなか踏み込めないこともあるかもしれません。
また、いきなりすべての端末がIPv6になることもありません。どうしてもIPv4とIPv6が共存する期間というのが存在します。両方の端末からのアクセスに対応するためにIPv4とIPv6対応のサーバを別々に用意するというのもナンセンスではないでしょうか。
今回ご紹介したSLB-PTは、既存のIPv4サーバをうまく利用して、IPv4/IPv6、両方の端末へのサービスを一元的に提供する1つの手段にもなります。興味を持った方はぜひ試してみてください。
第2回 「SLB-PTでWebサーバをさくっとIPv6対応に」 | |
Webサーバに手を付けずIPv6対応 対象となるネットワーク NAT-PTの設定方法 |
|
検討事項1:MTUに関連する考慮 検討事項2:L7ヘッダやそのペイロードのリライト 検討事項3:IPv4←→IPv6間の変換ログの保存 端末に先を越される? サーバのIPv6対応 |
「Master of IP Network総合インデックス」 |
- 完全HTTPS化のメリットと極意を大規模Webサービス――ピクシブ、クックパッド、ヤフーの事例から探る (2017/7/13)
2017年6月21日、ピクシブのオフィスで、同社主催の「大規模HTTPS導入Night」が開催された。大規模Webサービスで完全HTTPS化を行うに当たっての技術的、および非技術的な悩みや成果をテーマに、ヤフー、クックパッド、ピクシブの3社が、それぞれの事例について語り合った - ソラコムは、あなたの気が付かないうちに、少しずつ「次」へ進んでいる (2017/7/6)
ソラコムは、「トランスポート技術への非依存」度を高めている。当初はIoT用格安SIMというイメージもあったが、徐々に脱皮しようとしている。パブリッククラウドと同様、付加サービスでユーザーをつかんでいるからだ - Cisco SystemsのIntent-based Networkingは、どうネットワークエンジニアの仕事を変えるか (2017/7/4)
Cisco Systemsは2017年6月、同社イベントCisco Live 2017で、「THE NETWORK. INTUITIVE.」あるいは「Intent-based Networking」といった言葉を使い、ネットワークの構築・運用、そしてネットワークエンジニアの仕事を変えていくと説明した。これはどういうことなのだろうか - ifconfig 〜(IP)ネットワーク環境の確認/設定を行う (2017/7/3)
ifconfigは、LinuxやmacOSなど、主にUNIX系OSで用いるネットワーク環境の状態確認、設定のためのコマンドだ。IPアドレスやサブネットマスク、ブロードキャストアドレスなどの基本的な設定ができる他、イーサネットフレームの最大転送サイズ(MTU)の変更や、VLAN疑似デバイスの作成も可能だ。
|
|