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
- ASN:
- 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
- ASN:
設定
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 へのルーティングがないとかでしれっと無視されてるんだと思います。それでハマった。
参考
- Routing and Remote Access Service (RRAS)
- Border Gateway Protocol (BGP) with Windows Server 2012 R2 | Networking Blog
- Remote Access Cmdlets in Windows PowerShell
- VPN Interoperability guide for Windows Server 2012 R2 | Networking Blog
tcpdump
したけど、ここに一応 maximum strong encryption の時の proposal 内容のってる…。