2016-04-10: Windows Server 2012 R2 と strongSwan + Quagga で IPsec の Site-to-Site VPN 接続を張る

Remote Access 情報無さすぎてウケる。

さくらの VPS for Windows Server がどうやら無印な VPS とローカルネットワークが別物っぽくて、VPN 張らないと連携が取れないので必要に迫られた (バックエンドが Hyper-V ベースだったりするらしいからその関係なんだろうなあ)。

既に quagga の ospfd と strongSwan と VTI でいくつかのネットワークを結んでるので、まあそこにいい感じに乗っける。ハマりどころとしてはとにかくドキュメントが足りていない RRAS と仲良くすることと、RRAS が投げる IKEv2 Proposal の内容を把握すること。

実験は Windows Server 2012 R2 を AWS の t2.micro インスタンスでたててやりました。接続先はさくらの VPS。

前提

  • Linux: karen.example.org
    • ASN: 65000
    • Tunnel 内部 IP: 172.16.100.1/30
    • グローバル IP: 192.0.2.1/24
    • ローカルネットワーク: 192.168.0.1/24
  • Windows Server 2012 R2: nao.example.org
    • ASN: 65001
    • Tunnel 内部 IP: 172.16.100.2/30
    • グローバル IP: 198.51.100.1/24
    • ローカルネットワーク: 192.168.1.1/24

設定

WS: Remote Access を構成する

https://technet.microsoft.com/en-us/library/jj574196.aspx

ipmo servermanager
Install-WindowsFeature RemoteAccess -IncludeManagementTools
add-windowsFeature -name  routing -IncludeManagementTools

の後、手で RRAS の management tool 開いて configure する必要があるかも (netsh でやればいけそうな気はするけど。。)

WS: VpnS2SInterface を作成

https://technet.microsoft.com/en-us/library/hh918397(v=wps.630).aspx

Add-VpnS2SInterface -Name vpn-iface `
  -Destination karen.example.org `
  -IPv4Subnet 172.16.100.1/30:1 `
  -CustomPolicy `
  -AuthenticationMethod PSKOnly `
  -AuthenticationTransformConstants SHA256128 `
  -CipherTransphormConstants AES256 `
  -IntegrityCheckMethod SHA256 `
  -DHGroup ECP384 `
  -PfsGroup ECP384 `
  -Protocol IKEv2 `
  -SharedSecret ...

-CustomPolicy 以外にもまあ -EncryptionType MaximumEncryption とかで全部いい感じにお任せする手がありますが、明示しときます。 AES-GCM 使った場合なんかうまく動かなかったのであきらめた。

VPN 対向への route の作成…は -IPv4Subnet 入れてるならたぶん不要。

Linux: ipsec.conf

conn vpnconn
  leftsubnet=0.0.0.0/0,::/0
  rightsubnet=0.0.0.0/0,::/0
  leftid=@karen.example.org
  rightid=%any
  right=nao.example.org # IP でも
  rightsourceip=172.16.100.2 # Windows が virtual ip 要求してきます
  leftauth=psk
  rightauth=psk
  keyexchange=ikev2
  ike=aes256-sha256-prfsha256-ecp384!
  esp=aes256-sha256!
  type=tunnel
  auto=add
  mark=42 # かぶってないやつ。 %unique でもいいけどオススメしない (rekey ごとに変わって VTI というか quagga と相性が悪いので)
  mobike=yes # AWS VPC なので…

charon.conf もいじって install_routes = no とかしたほうが安全な気がします。VTI使う場合。

ipsec.secrets にも PSK を書いておく必要があるけれど、WS 側の ID は VPC とかで NAT 裏にいる場合はプライベート IP になります。

ike, esp の cipher の設定、 -EncryptionType MaximumEncryption の場合はこれです。

ike=aes256-sha256-prfsha256-modp1024!
esp=aes256-sha256!

strongSwan を起動しておくのを忘れずに。 IKE (500/udp), MOBIKE (4500/udp), ESP あたりの許可を忘れずに。

Windows: 接続

Connect-VpnS2SInterface vpn-iface

あるいは Administrative Tool から Remote Access 起動して適当に接続ボタン押してもよい。cmdlet からの操作と違って勝手にキャンセルというか Disconnect されたりする。Connecting な状態になってると Get-VpnS2SInterface とかの操作がささるので Disconnect-VpnS2SInterface をトラブった時は叩くとよさそう。まあ Administrative Tool 使うと良いんじゃないかな。

Linux: 接続確認

ipsec statusall, ip xfrm policy とかで良きに確認する。

Linux: VTI 作成

ip tunnel add vpn_iface \
  local 192.0.2.1 remote 198.51.100.1 mode vti \
  okey 42 ikey 42
ip link set dev vpn_iface up
ip addr add 172.16.100.1/30 dev vpn_iface

… まあ、leftupdown でスクリプト組んじゃうのがいいと思います。

疎通確認

おたがい ping をトンネル内部 ip に向けて飛ばしてみるとよさそう。

Linux: bgpd 設定

抜粋です。 zebra も設定必要だけど対した設定量ないから割愛。bgpd, zebra 両方起動忘れずに。

router bgp 65000
  bgp router-id 192.168.0.1  
  redistribute kernel
  redistribute connected
  redistribute static
  neighbor 172.16.100.2 remote-as 65001

必要に応じて route-map も指定。

Windows: BgpRouter 設定

Add-BgpRouter -BgpIdentifier 192.168.1.1 -LocalASN 65001
Add-BgpCustomRoute -Network 192.168.1.0/24
Add-BgpPeer -Name karen -LocalIPAddress 172.16.100.2 -PeerIPAddress 172.16.100.1 -PeerASN 65000

Add-BgpCustomRoute-Interface Ethernet とかでもいいと思う。AWS 環境でやると APIPA へのルートとかも流れてきちゃうので適宜ポリシー設定が必要です…というか VPC 全部へのルートはできないからいずれにせよ Network で指定しないとだめか。VPC の場合。

BGP 確認

quagga は show bgp neighbor とか、windows 側は Get-BgpPeer | Format-List -Property * とかで。

Get-BgpRouteInformation がずっと空ならたぶん Next hop へのルーティングがないとかでしれっと無視されてるんだと思います。それでハマった。

参考

Published at 2016-04-10 08:43:20 +0900