Apache 2.4系でHTTP/2サーバを構築してみるテスト。
IPv6のサーバ設置ネットワークの設定さて、IPv6のクライアントPCの用意ができたところで、早速サーバの設定に進みます。 サーバを運用しているNURO-Bizの回線は、IPv6に対応しています。 NUROのIPv6は、デュアルスタックとよばれる方式で提供されています。これは、IPv4とIPv6が共存する方式で、トンネル化などが不要で、特別なことをしなくても、IPv6に接続できます。 トンネル方式ではないので、そのままパケットが運ばれます。そのため、遅延もIPv4と大差ありません。 あとは、サーバ運用に必要となるIPアドレスを固定的に割り当てるだけです。 これまで、IPv4のサーバを運用していれば、IPアドレスとサブネットマスクの情報が書面で渡されて、それを手動で設定といった感じで、構築していたと思いますが、IPv6には、これをある程度自動化する仕組みがあります。 これは、DHCPv6-PDと呼ばれるプロトコルで実現します。 IPv4のDHCPは、ルータとホストマシンの両方を自動設定することができましたが、DHCPv6-PDは一定範囲のアドレスを、ルータ向けに配布するといったものになります。 ホストマシン向けには、ステートレスアドレス自動設定(SLAAC)を使う設定で進めます。
DHCPv6-PDを利用したルータの設定IPv6では、アドレスの範囲の割り当てを委任する方法を使うことができます。これはDHCPv6-PD(Prefix Delegation)と呼ばれる方法です。 対応ルータは、まだ少ないのですが、非クラウド環境でIPv6対応のサーバを運用する場合は、DHCPv6-PDが便利です。 NURO-Bizは、このDHCPv6-PDによるアドレス割り当ての委任を提供しております。 DHCPv6-PDによって委任されるNURO-Bizのアドレスは、DHCPとあるので、なんだかすぐ値が変わってしまうと思い込んでしまいそうですが、そんなことはなく、IPv4の固定IPのように継続的かつ固定的に割り当てられますので、サーバ設置が可能です。 さてそこで重要となるのが、DHCPv6-PDに対応したルータですが、YAMAHAのRTX1210等が候補になりますが、ここではCISCOのC800シリーズ(IOSは15.X系)を利用してみます。 この図にあるように、VLANにサーバ群、GigabitEhernet8に上位プロバイダ(この場合Nuro-Biz)を、それぞれ接続する構成を想定します。 以下、上図のように、設定表記中、グローバルIDを赤、サブネットIDを緑、インタフェースIDを青で記載します。 >IPv6アドレスについては、コチラを参考にしてください>> IPv6アドレスについて
まずは、コンソールケーブルなどで、ルータに接続します。IPv4の設定は済んでいる前提で進めます。 gw>enable Password:XXXX gw#conf t gw(config)#ipv6 unicast-routing gw(config)#ipv6 cef ここまでは、全体の設定です。 次に、上位プロバイダと接続しているインタフェースの設定になります。 gw(config)# interface GigabitEthernet 8 gw(config-if)# ipv6 enable gw(config-if)# ipv6 dhcp client pd dhcp-prefix gw(config-if)# ipv6 dhcp client request vendor gw(config-if)# end gw# これで、DHCPv6-PDの設定ができました。 ipv6 dhcp client pdに続く文字列はなんでもいいのですが、ここでは、「dhcp-prefix」としています。 この文字列は、後述の別インタフェースのアドレスの設定の際に、グローバルID部分を意味する文字列として、利用できます。この文字列「dhcp-prefix」とサブネットIDとインタフェースIDと一緒に記載して、アドレスとして表現します。 割り当てられたアドレス範囲を確認するには、以下のコマンドを打ちます。 gw# show ipv6 dhcp interface GigabitEthernet8 is in client mode Prefix State is OPEN Renew will be sent in 01:06:51 Address State is IDLE List of known servers: Reachable via address: FE80::1 DUID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Preference: 0 Configuration parameters: IA PD: IA ID 0x00XXXXXX, T1 XXXX, T2 XXXX Prefix: 240D:XXXX:XXXX:XX00::/56 preferred lifetime 10800, valid lifetime 10800 expires at XXX XX 2016 HH:MM PM (9411 seconds) DNS server: 240D:XXXX:XXXX:XXXX::XX DNS server: 240D:XXXX:XXXX:XXXX::XX Information refresh time: 0 Prefix name: dhcp-prefix Prefix Rapid-Commit: disabled Address Rapid-Commit: disabled と確かに、/56のプリフィックスでアドレスが来ていることが判ります。 続いて、サーバ群を設置するVLANの設定です。
サーバ設置ネットワークの設定サーバを設置するネットワークは、CiscoルータのVLANとします。 ここでは、VLAN1とします。 設定は以下の通りです。 gw#conf t gw(config)# interface GigabitEthernet 0 gw(config-if)# switchport mode access gw(config-if)# switchport access vlan 1 gw(config-if)# no shutdown gw(config-if)# no ip address gw(config-if)# end gw# これで、ギガビットイーサネットのポート0番をVLAN 1に割り当てます。 (たぶん初期設定のままでいけるとおもいますが、念のため。)
続いて、VLANのグローバルスコープと、リンクローカルスコープにそれぞれアドレスを振ります リンクローカルアドレスと、DHCPv6-PDのアドレスを設定します。 デフォルトゲートウェイとなるリンクローカルアドレスには、FE80::1を割り当てることが多いので、ここでもFE80::1を割り当てます。
gw#conf t gw(config)# interface Vlan1 gw(config-if)# ipv6 address FE80::1 link-local gw(config-if)# ipv6 address dhcp-prefix ::1:0:0:0:1/64 gw(config-if)# ipv6 enable gw(config-if)# end gw# 上記の設定で、VLAN1にリンクローカルアドレスFE80::1が割り当てられます。 なお、ルータに接続されたホストに、ステートレスアドレス自動設定(SLAAC)を行う、ルータ広告(RA)は有効になっていますので、このリンクローカルのアドレスと、ネットワークのプリフィックスが広告されます。 その次の行では、IPv6アドレスとして、上位プロバイダから割り当てられたDHCPv6-PDのグローバルID部分を意味する(「dhcp-prefix」(これは、インタフェースの設定で、ipv6 dhcp client pd コマンドに続いて指定した文字列と同じ)と、サブネットID(1)とインタフェースID(:0:0:0:1)を結合したアドレス(dhcp-prefix ::1::0:0:0:1)を設定します。 ※今回は例のため、dhcp-prefix ::1::0:0:0:1といった設定をしていますが、ルータに振られたグローバルIPアドレスは、隠しておきたいところ。インタフェースIDの部分は、乱数などで予想できない数値をおすすめします。 このように、プリフィックス表記(この例ではdhcp-prefix)を含む設定が行えるのは、インタフェースのアドレス設定(ipv6 address)だけのようです。 たとえば、トラフィックフィルタの設定では使えないようです。 確認は以下のコマンドで行えます。 gw#show ipv6 interface vlan 1 Vlan1 is up, line protocol is up IPv6 is enabled, link-local address is FE80::1 No Virtual link-local address(es): General-prefix in use for addressing Global unicast address(es): 240D:XXXX:XXXX:XX01::1, subnet is 240D:XXXX:XXXX:XX01::/64 [CAL/PRE] valid lifetime 10004 preferred lifetime 10004 Joined group address(es): FF02::1 FF02::2 FF02::1:FF00:1 MTU is 1500 bytes ICMP error messages limited to one every 100 milliseconds ICMP redirects are enabled ICMP unreachables are sent Output features: CCE Classification ND DAD is enabled, number of DAD attempts: 1 ND reachable time is 30000 milliseconds (using 30000) ND advertised reachable time is 0 (unspecified) ND advertised retransmit interval is 0 (unspecified) ND router advertisements are sent every 200 seconds ND router advertisements live for 1800 seconds ND advertised default router preference is Medium Hosts use stateless autoconfig for addresses. と、設定通りになっています。
トラフィックフィルタの設定当然ですが、IPv6でも、サーバを保護し、必要な通信のみ許可するように、フィルタを設定します。 以下、問題ないように記載したつもりですが、十分にテストした物ではありません。 みなさんが理解できる範囲で、参考程度にご利用ください。
まずは、上位プロバイダ方向に送信(out)されるパケットについて、以下の通り許可します。 このうち、TCPとUDPについては、LAN内部から開始した通信に対する応答を許可するための一時的なACLを作る、「refrect REFLECTOUT」を追加します。 gw#conf t gw(config)# no ipv6 access-list filter_ipv6_out gw(config)# ipv6 access-list filter_ipv6_out gw(config-acl)# permit tcp 240D:XXXX:XXXX:XX00::/56 any reflect REFLECTOUT gw(config-acl)# permit udp 240D:XXXX:XXXX:XX00::/56 any reflect REFLECTOUT gw(config-acl)# permit icmp any any gw(config-acl)# deny ipv6 any any log gw(config-acl)# exit gw(config)# 上位プロバイダ方向から受信(in)するパケットについては、一時的なACLである、REFLECTOUTに加え、サービスを行うポートへの通信を許可します。 ルータを 240D:XXXX:XXXX:XX01::1に設定したので、サーバのIPv6のグローバルアドレスは、 240D:XXXX:XXXX:XX01::2とします。 今回は、このサーバで、DNSとHTTPのサービスを提供しますので、HTTP/1.1の80番(www)ポートとHTTP/2用の443番ポート、それからDNS用に53番ポート(domain)を開けます。 一旦接続が済んだ通信については許可するよう、アクセスリストの先頭で、permit tcp any any establishedとします。 また、ルータ広告や、DHCPv6のパケットを受信するため、リンクローカルの通信も許可(permit ipv6 FE80::/10 any)しておきます。 icmpについては、pingと、tracerouteの戻りとして必要なパケットを許可し、これら以外を拒否するようにします。 gw#conf t gw(config)# no ipv6 access-list filter_ipv6_in gw(config)# ipv6 access-list filter_ipv6_in gw(config-acl)# permit tcp any any established gw(config-acl)# evaluate REFLECTOUT gw(config-acl)# permit udp any 240D:XXXX:XXXX:XX01::2/128 eq domain gw(config-acl)# permit tcp any 240D:XXXX:XXXX:XX01::2/128 eq www gw(config-acl)# permit tcp any 240D:XXXX:XXXX:XX01::2/128 eq 443 gw(config-acl)# permit ipv6 FE80::/10 any gw(config-acl)# permit icmp any any echo-reply gw(config-acl)# permit icmp any any time-exceeded gw(config-acl)# permit icmp any any unreachable gw(config-acl)# permit icmp any any packet-too-big gw(config-acl)# deny ipv6 any any log gw(config-acl)# exit gw(config)# これを上位プロバイダに接続しているインタフェースに設定します。 gw#conf t gw(config)# interface GigabitEthernet8 gw(config-if)# ipv6 traffic-filter filter_ipv6_in in gw(config-if)# ipv6 traffic-filter filter_ipv6_out out gw(config-if)# end gw# 以下、コピペ用です。 conf t no ipv6 access-list filter_ipv6_out ipv6 access-list filter_ipv6_out permit tcp 240D:XXXX:XXXX:XX00::/56 any reflect REFLECTOUT permit udp 240D:XXXX:XXXX:XX00::/56 any reflect REFLECTOUT permit icmp any any deny ipv6 any any log exit no ipv6 access-list filter_ipv6_in ipv6 access-list filter_ipv6_in permit tcp any any established evaluate REFLECTOUT permit udp any 240D:XXXX:XXXX:XX01::2/128 eq domain permit tcp any 240D:XXXX:XXXX:XX01::2/128 eq www permit tcp any 240D:XXXX:XXXX:XX01::2/128 eq 443 permit ipv6 FE80::/10 any permit icmp any any echo-reply permit icmp any any time-exceeded permit icmp any any unreachable permit icmp any any packet-too-big deny ipv6 any any log exit interface GigabitEthernet8 ipv6 traffic-filter filter_ipv6_in in ipv6 traffic-filter filter_ipv6_out out end 次はいよいよ、サーバにIPv6アドレスを設定します。
| ||||||||||||||||||||||||||