IPSecトンネルモード接続を行う。libreswan-3.10使用。今回は専用のホストキーを生成して使用する。(20152)

{:TableOfContents}

方針

  • # emerge libreswan時にnssデータベースが設置されるので、利用する(/etc/ipsec.d/{cert8,key3,secmod}.db)
    • Arch Linuxでは設置されないので、初期化するipsec initnss --configdir /etc/ipsec.d
  • .secretsファイルは /etc/ipsec.d/に複数置けるようにする。元締めの/etc/ipsec.secretsは、次の簡単な内容とする。

    include /etc/ipsec.d/*.secrets
    
  • 各接続のconfigファイルも、ipsec.dに複数置けるようにする。 /etc/ipsec.conf最終行に、それらを読み込む記述がコメントアウトされているので、コメント解除する。

    include /etc/ipsec.d/*.conf
    
  • leftのidを@west、rightを@eastとし、接続設定を “myconn”と呼ぶ。

  • leftは固定IPアドレス、rightは動的または固定IPアドレスとする。

設定

/etc/ipsec.d/myconn.conf

leftは固定ipアドレス。もしrightも固定なら、left, rightとも全く同じ内容のmyconn.confをする。

# vim /etc/ipsec.d/myconn.conf
conn myconn
    auto=add # {add|start}
    authby = rsasig

    leftid=@west
    rightid=@east

    leftrsasigkey=...(後でコピペしてくる)
    rightrsasigkey=...(同上)

    left=99.99.99.99
    right=88.88.88.88
  • rightが動的ipアドレスの場合は、最後のright=を変更する。

    • left側のmyconn.conf

      right=%any
      
    • right側のmyconn.conf

      right=%defaultroute
      

ホストキー生成

rsaホストキーを新規に生成し、秘密鍵と公開鍵をそれぞれ、nssデータベースと .secrets ファイルに保存する。

(left) # ipsec newhostkey --output /etc/ipsec.d/myconn_left.secrets --configdir /etc/ipsec.d --seeddev /dev/random
(right)# ipsec newhostkey --output /etc/ipsec.d/myconn_right.secrets --configdir /etc/ipsec.d --seeddev /dev/random

myconn.confに記述する形式で、公開鍵を表示させる。

(left) # ipsec showhostkey --left  --file /etc/ipsec.d/myconn_left.secrets
(right)# ipsec showhostkey --right --file /etc/ipsec.d/myconn_right.secrets

これらの出力をleft, right 双方の myconn.conf にコピペする。

これで、双方とも 公開鍵・秘密鍵を生成した。 公開鍵は *.secretsに、秘密鍵はnssデータベースに保存された。人手を介さず接続するためには、nssデータベースのパスフレーズを設定しない。

ipsec verify の前に、gentoo での調整

  • ipsec verifyがiproute2の/bin/ipを見つけてくれない。/sbin/ip/usr/sbin/ipを探すようだ。仕方ないのでln -s /bin/ip /sbin/ しておく。

  • python-3.3だと、ipsec verifyで言語上のエラーが発生するので、2.7で。verifyを終えたら 3.3に戻しても大丈夫。

    # eselect python list
    # eselect python set <番号>
    
  • ipsec サービス開始時に、ディレクトリが無い旨のエラーが2つログされる。不要かもしれないが、気持ち悪いのでmkdirしておく。

    # mkdir /etc/ipsec.d/cacerts /etc/ipsec.d/crls
    

# ipsec verify

# /etc/init.d/ipsec startしてから、# ipsec verifyで各要件を満たしているかチェックする。うちでは以下のとおりだった。

  • /etc/sysctl.confを調整、再起動

    net.ipv4.conf.default.rp_filter = 0        # 0に書き換えた
    net.ipv4.conf.all.rp_filter = 0            # 0に書き換えた
    net.ipv4.conf.default.send_redirects = 0   # 書き足した
    net.ipv4.conf.default.accept_redirects = 0 # コメント解除した
    
  • [OK]で無いが問題ない項目

    • Hardware random device [N/A] は問題ない(そのようなデバイスを使っていないなら)。
    • Opportunistic Encryption [DISABLED] は設定内容を表示しているだけで、問題ない。 これらは[OK]と同様、グリーンで表示される。

テスト接続

left,rightとも /etc/init.d/ipsec start してから、ipsec --upで接続を行う。

(left) # ipsec auto --up myconn
(right)# ipsec auto --up myconn

ログ確認 IPSec SA established となっていればOK。

例:

pluto[<pid>]: "myconn" #2: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>...略...}

自動接続

  • ipsecサービス開始時に自動で接続させるなら、myconn.conf内の auto=addを、auto=startに変更する。
  • # rc-update add ipsec default

以上。