VPNが繋がらない

問題を解いていただきありがとうございました!

問題文  

概要  

あなたのクラスメイトのA君は、CiscoルーターであるRTとUbuntuサーバーであるServer間でIPIP over ipsecの検証をしていました。 しかし、設定を変更しているとRTServer間の疎通ができなくなってしまいました。
A君の代わりに、RTServerのIPIP over ipsecの設定を修正し疎通できるようにして下さい。

topology.png.webp
  • RT
    • Cisco CSR 1000v
    • IPアドレス
      • gi1 192.168.14.10/24
      • tun0 10.50.0.1/30
  • Server
    • Ubuntu 18.04
    • ipsec: strongswan
    • IPアドレス
      • eth0 192.168.14.20/24
      • tun0 10.50.0.2/30

初期状態  

  • RT, Server間で通信が行えない
    • RTから ping 10.50.0.2 をしても応答がない
    • Serverから ping 10.50.0.1 をしても応答がない

終了状態  

  • RT, Server間で通信が行える
    • RTから ping 10.50.0.2 をして応答がある
    • Serverから ping 10.50.0.1をして応答がある
  • IPIP over ipsecでトンネリング及び暗号化がされている
  • 設定が永続化されており、再起動後も自動で疎通ができる状態になっている

採点基準  

  • RTとServer間の通信でき、暗号化されている (80%)
    • RT -> Server ping 10.50.0.2 (40%)
    • Server -> RT ping 10.50.0.1 (40%)
  • 上記を満たしており、トンネリングにはIPIPのみを用いている (20%)
    • ipsecでトンネリングやその他のトンネリングはNG

解説  

RTとServerのそれぞれの設定が間違っていることによるトラブルでした。 具体的には以下の3つの原因が上げられます。

  • strongswanの設定でauto=addになっている
  • ipsecの通信モードが異なっている
  • ikeのバージョンが異なっている

原因  

strongswanの設定でauto=addになっている  

auto=addを設定したとき、strongswanは起動時設定の読み込みのみを行います。そのため、手動で接続しなければトンネルを張ることができません。 そこで、startまたはrouteを設定することによって接続を自動で行うようにします。

startrouteは以下のように動作します。

  • start サービス起動時にトンネルを張る
  • route 通信時にトンネルを張る

ipsecの通信モードが異なっている  

strongswanではipsecの通信モードをtype=transportとtransportモードに設定していますが、RTではmode tunnel とtunnelモードになっていました。

今回の構成では、IPIP over ipsecを行っているのでトンネリングはIPIPが担当します。そのため、ipsecではトンネリングする必要が無いのでRTの設定をmode transportに設定します。

ikeのバージョンが異なっている  

上記の問題を解決したあと、RTからServerへpingを送ってみると、接続が確立され疎通が取れていることが確認できます。

RT#ping 10.50.0.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.50.0.2, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 1/1/1 ms

しかし、接続を確立していない状態でServerからRTへpingを送ってみると接続が確立されず疎通が取れません。

user@Server:~$ sudo systemctl restart strongswan
user@Server:~$ ping -c 1 10.50.0.1
PING 10.50.0.1 (10.50.0.1) 56(84) bytes of data.

--- 10.50.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

RTは設定からikev1を利用していることがわかります。 strongswanの設定では、keyexchange=ikeというように指定されています。strongswanでは、ikeを指定した場合、接続の開始時にikev2を提案します。しかし、受信時にはいずれかのバージョンをacceptします。
そのため、RTからServerでは接続できでも、ServerからRTはできないという状態になっていました。 今回の構成ではikeのバージョンを指定されていないので、楽に修正ができるikev1に合わせます。 strongswanの設定を、keyexchange=ikev1に変更します。

修正後の設定  

RTの設定  

RTの設定は以下のようになります。(show run 一部抜粋)

crypto ipsec transform-set TS_IPSEC esp-aes esp-sha256-hmac
 mode transport

Server(strongswan)の設定  

Serverのstrongswanの設定(/etc/ipsec.conf)は以下のようになります。

# ipsec.conf - strongSwan IPsec configuration file

# basic configuration

config setup
conn RT
authby=secret
left=192.168.14.20
leftid=192.168.14.20
right=192.168.14.10
rightid=192.168.14.10
auto=start
type=transport
keyexchange=ikev1
ike=aes-sha256-modp3072
esp=aes-sha256

参考文献