技術メモなど

ほぼ自分用の技術メモです。

さくらのVPSとRTX1100をopenswanでipv6 over ipv6 ipsecを張ってみる

さくらのVPS上のCentOS 6.5と、自宅のYAMAHA RTX1100との間の通信をipsecで暗号化したいと思い立ちました。

さくらのVPSは固定グローバルipv4アドレスが一つ付与されているため、自宅側にも固定グローバルipv4アドレスがあれば話が早いのですが、あいにくこれがありません。しかし、自宅には半固定ipv6グローバルアドレスが割り当てられる環境になっており、さくらのVPSも固定グローバルipv6アドレス(Global Unicast Address、GUA)が付与されているため、ipv6ipsecを張ることにします。

色々調べた結果、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 ipv6ipsecをサポートしているので、頑張ればipv4で通信できると思ったのですが、力及ばず駄目でした。

ipv6 over ipv6でのipsecする需要がどのくらいあるか分かりませんが、私はさくらのVPS上のCentOSでzabbix、rsyslogを動かしているので、これに使う通信経路が暗号化できて満足しています。

ちなみにさくらのVPS側でDNSも動かしているのですが、RTX1100自身からのDNSクエリについて送信元IPを指定できないため(ipv4ならできるのに!)、DNSクエリのパケットがipsecトンネルの方へ向いてくれません。syslogは送信元IPを指定できるのでipsecトンネルを経由してさくらのVPS側へ届くんですけどね……。YAMAHAさんがファームウェア更新で対応してくれないかななんて虫のいいことを考えています。