さくらのVPSとRTX1100をopenswanでipv6 over ipv6 ipsecを張ってみる
さくらのVPS上のCentOS 6.5と、自宅のYAMAHA RTX1100との間の通信をipsecで暗号化したいと思い立ちました。
さくらのVPSは固定グローバルipv4アドレスが一つ付与されているため、自宅側にも固定グローバルipv4アドレスがあれば話が早いのですが、あいにくこれがありません。しかし、自宅には半固定ipv6グローバルアドレスが割り当てられる環境になっており、さくらのVPSも固定グローバルipv6アドレス(Global Unicast Address、GUA)が付与されているため、ipv6でipsecを張ることにします。
色々調べた結果、openswanでipv6 ipsecができるようだったので、CentOS 6.5にはopenswanをインストールします。
※個人的に手探り状態で設定したので、正しくない箇所があるかもしれません。もし参考にする方がいれば、十分検証のうえでお願いします。
事前共有キーの設定
openswanで事前共有キー(PSK)方式のipsecを張ります。事前共有キーは十分に複雑で長い文字列を設定しましょう。
RTX1100の設定
WAN側インターフェイスへGUAの付与
自宅はひかり電話ありフレッツ光ネクストに、IIJmio FiberAccess/NFで、IPoE方式でipv6を使える環境です。ひかり電話ありの場合、ひかり電話ルータにRTXを繋げば、DHCPv6-PDでprefix移譲を受けられます。
余談ですがIIJmio FiberAccess/NFの場合、RTXには/60のprefixが移譲されてきたため、64bit-60bit=4bit分、2の4乗分サブネットをRTX1100で切ることができます。うちではRTX1100でVLAN切って各VLANにGUAを付与し、自宅サーバのKVMにトランク接続しているので、KVMの仮想マシンにはグローバルのipv6サブネットを10以上割り当てられる状態になっています。
あとはGUAをRTXのWAN側インターフェイスに割り当てる設定が必要です。具体的にはYAMAHAのサイトに設定例が出ているので(フレッツ 光ネクストでインターネット接続(IPv6 IPoE)を使用するには、どうすればよいですか? )、この通り設定すれば大丈夫ですが、RTX1100のファームウェアが古い場合、設定例通りにするとひかり電話ルータにRTX1100を繋いだ途端にRTX1100が再起動を繰り返してしまう不具合があるため、必ずRev. 8.03.94以降のファームウェアを適用してから設定しましょう。
LAN側インターフェイスへULA(Unique Local IPv6 Unicast Addresses)の付与
今回ipsecトンネルを通すipv6アドレスは、RTX側もCentOS側も、ipv4でいうところのプライベートIPアドレスであるULAのipv6アドレスにします。
ULAは他のipv6アドレスと重複しないよう、基本的にインターフェイスのMacアドレスを基に計算して生成します。ULAの生成Webサービスを使うと楽です(Generate Unique Local Address)。
RTX側、CentOS側のいずれのULAにも外部から到達できませんが、今回RTX側、CentOS側にそれぞれ互いのULAのサブネットに対してipsecトンネル経由でルーティングするよう設定すれば、ULA同士で通信できるという仕組みです。
RTXのLAN側インターフェイスに、生成したULAを付与します。ちなみにRTX1100は一つのインターフェイスに複数のipv6アドレスを振れるので、各インターフェイスにはGUAとULAをそれぞれ付与することも可能です。
ipsecの設定
コンフィグの該当部分のみ抜粋します。なお、ip filterを設定する場合は、WAN側インターフェイスでUDP546(DHCPv6-PD)、esp、UDP500(ipsec)辺りのポートが開いている必要があるかと思います。
# 対向(CentOS側)ULAのサブネットへのルーティング追加 ipv6 route (CentOS側ULAサブネット) gateway tunnel 1 # ipsecトンネルの設定 tunnel select 1 ipsec tunnel 1 ipsec sa policy 1 1 esp 3des-cbc sha-hmac ipsec ike encryption 1 3des-cbc ipsec ike esp-encapsulation 1 off ipsec ike group 1 modp1024 ipsec ike hash 1 sha ipsec ike keepalive use 1 on dpd ipsec ike local address 1 (RTXのGUA) ipsec ike log 1 key-info message-info payload-info ipsec ike payload type 1 3 ipsec ike pre-shared-key 1 (事前共有キー) ipsec ike remote address 1 (CentOSのGUA) ipsec auto refresh 1 on ip tunnel tcp mss limit auto tunnel enable 1
CentOS 6.5の設定
eth1インターフェイスの追加
CentOSのeth0にグローバルipv6アドレスが付与されているので、eth1を作ってこれにULAを振ることにします。最初eth0にセカンダリipv6アドレスとしてULAを振って試したんですが、うまく行きませんでした。
eth1を追加するため、VPS同士をローカル接続させる仮想スイッチの仕組みを使います。コントロールパネルにて仮想スイッチを作成し、これにeth1を接続するよう設定すれば、さくらのVPS上のCentOSでeth1インターフェイスが活性化しますので、後はこれにULAを設定するだけです。
openswanのインストール
CentOS標準リポジトリからyumでインストールできます。
$ sudo yum install openswan
対向(RTX側ULAのサブネットへのルーティングテーブル追加)
ここが一番嵌りました。ipv6の静的ルーティングテーブル追加はipv4のようにコマンドで設定できません。
/etc/sysconfig/network-scripts/route6-eth1ファイルを作成し、そこに経路情報を記載します。
$ sudo echo '(RTXのULAのサブネット) via (CentOSのULA)' > /etc/sysconfig/network-scripts/route6-eth1
openswanの設定
基本的に以下の3つの設定ファイルの変更が必要です。
/etc/sysctl.conf
openswanを起動して設定を確認すると、カーネルパラメータを修正するようメッセージが表示されます。
$ sudo service ipsec start $ sudo ipsec verify
そこで、次の通り追記します(たぶんipv6しか使わないなら関係ない設定だとは思います)。
$ sudo echo 'net.ipv4.conf.all.send_redirects = 0' >> /etc/sysctl.conf $ sudo echo 'net.ipv4.conf.default.send_redirects = 0' >> /etc/sysctl.conf $ sudo echo 'net.ipv4.conf.eth0.send_redirects = 0' >> /etc/sysctl.conf $ sudo echo 'net.ipv4.conf.lo.send_redirects = 0' >> /etc/sysctl.conf $ sudo echo 'net.ipv4.conf.all.accept_redirects = 0' >> /etc/sysctl.conf $ sudo echo 'net.ipv4.conf.default.accept_redirects = 0' >> /etc/sysctl.conf $ sudo echo 'net.ipv4.conf.eth0.accept_redirects = 0' >> /etc/sysctl.conf $ sudo echo 'net.ipv4.conf.lo.accept_redirects = 0' >> /etc/sysctl.conf
また、ipv6パケットのフォワーディングができるように次の通り追記します。
$ sudo echo 'net.ipv6.conf.all.forwarding = 1' >> /etc/sysctl.conf
/etc/ipsec.d/connection.conf
ipsec設定の核の部分です。コンフィグはOpenswan/ipv6.conf.in at master · xelerance/Openswanを参考にしました。
conn rtx1100 connaddrfamily=ipv6 type=tunnel authby=secret auth=esp ike=3des-sha1;modp1024 esp=3des-sha1;modp1024 keyexchange=ike pfs=yes left=(CentOSのGUA) leftid=(同上) leftsubnet=(CentOSのULAのサブネット) leftsourceip=(CentOSのULA) right=(RTXのGUA) rightid=(同上) rightsubnet=(RTXのULAのサブネット) rightsourceip=(RTXのULA) ikelifetime=8h keylife=1h compress=no dpddelay=5 dpdtimeout=20 dpdaction=restart auto=start
/etc/ipsec.d/rtx1100.secrets
事前共有キーとなる文字列を記載しておくファイルです。
(CentOSのGUA) (RTXのGUA): PSK "(事前共有キー)"
openswanの起動
以上で、openswanを起動するとipv6 over ipv6 ipsecを張ってくれるはずです。
$ sudo service ipsec start
システム起動時に自動実行させておきます。
$ sudo chkconfig ipsec on
余談
RTX1100はipv4 over ipv6のipsecをサポートしているので、頑張ればipv4で通信できると思ったのですが、力及ばず駄目でした。
ipv6 over ipv6でのipsecする需要がどのくらいあるか分かりませんが、私はさくらのVPS上のCentOSでzabbix、rsyslogを動かしているので、これに使う通信経路が暗号化できて満足しています。
ちなみにさくらのVPS側でDNSも動かしているのですが、RTX1100自身からのDNSクエリについて送信元IPを指定できないため(ipv4ならできるのに!)、DNSクエリのパケットがipsecトンネルの方へ向いてくれません。syslogは送信元IPを指定できるのでipsecトンネルを経由してさくらのVPS側へ届くんですけどね……。YAMAHAさんがファームウェア更新で対応してくれないかななんて虫のいいことを考えています。