Juniper SSG5(ScreenOS)とAzure間でSite to Site VPN接続を行う(BGPも有効)

# はじめに
Juniper SSGシリーズはAzure Site to Site VPNの動作確認済みルータであり、設定ファイルもAzureポータルからダウンロード可能ですが、VPN接続時のBGPによるルート交換の設定までは含まれていません。

そこで、多少試行錯誤ではありましたが、VPN接続＋BGPによるルート交換を含めて接続設定が行えたので記します。

# 前提条件

今回の検証では以下の構成・条件で行いました。

- インターネット接続はフレッツにPPPoEで任意のインターネットプロバイダに接続済
- オンプレミス側のWAN側IPアドレスは固定

# 構成

ざっくりとした構成図は以下のとおりです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/9d72ac36-aaf6-8bba-d0a9-114a7dc9a1c6.png)

オンプレミス側とAzure側のセグメント情報(192.168.127.0/24, 192.168.10.0/24, 192.168.12.0/24)は直接ローカルネットワークゲートウェイ等の設定には記述しないで、BGPによる経路交換を実現させます。

# Azure側の設定

必要な仮想ネットワーク、仮想マシンは事前に作成します。本記事では具体的な作成方法は割愛します。

## 仮想ネットワークゲートウェイ リソース

前述した構成上、AzureVNET内にGatewaySubnetを作成してそこに配置します。
本記事ではGatewaySubnetのアドレス空間は192.168.10.128/28を設定しています。

BGPを利用する為にはSKUはBasic以外を選択する必要があります。今回はVpnGw1を使用しました。

参考 : [BGP はすべての Azure VPN Gateway SKU でサポートされていますか](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-bgp-overview#is-bgp-supported-on-all-azure-vpn-gateway-skus)

作成後に「概要」のパブリックIPアドレスと、「構成」の自律システム番号(ASN)及びBGPピアのIPアドレスを控えておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/47666161-1a98-641d-c19c-31b0f12445bc.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/6dc2e6c8-bcbf-870c-dcd7-24f194c39ed7.png)

## ローカルネットワークゲートウェイ リソース

- IPアドレス : オンプレミスのWAN側IPアドレスを設定します。
- アドレス空間 : 後述しますが、オンプレミス側のtunnelインタフェースのIPアドレスを指定します。このアドレスはBGPのピア用のアドレスとなっていて、オンプレミス側のプライベートネットワーク内のアドレスとは異なります。後から修正もできるので、とりあえず下記画面通りの値をいれておいても良いと思います。
- BGP設定の構成 : 必ずチェックを入れます
- 自律システム番号 : こちらも後述しますが、プライベートASNの範囲からAzureが予約していない番号をオンプレミス側に指定するため、そのASNを設定します。
- BGPピアのIPアドレス : アドレス空間に設定したピア用のIPアドレスと同じものを指定します(こちらは末尾に/32は付けない)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/3236b6ea-0c22-0fcb-4aa9-8304cf0b38c0.png)

## 接続 リソース

先に作成した仮想ネットワークゲートウェイと、ローカルネットワークゲートウェイを指定して作成します。

共有キーはオンプレミス側のルータ設定時にも必要ですので、設定した内容を控えておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/948c4a2c-d9de-dd91-778e-4e399a61a6b4.png)

接続リソース上でもBGPが有効になっているか確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/f58aba54-e278-ebcc-b4ce-9510664e748f.png)



# Juniper追加設定
既にインターネットへはWebインタフェースのウイザードなどを使い、PPPoE等で契約済みのプロバイダに接続されているのが前提となります。

Azure Site to Site VPN接続を行う場合にはオンプレミス側のWAN側IPアドレスは固定化されていることが必要です。

また、ScreenOSは6.2.x以降のファームウェアバージョンが対象となります(それ以前のバージョンではルートベースのVPN接続が不可)。

## tunnelの設定

オンプレミス側のWAN側アドレスに対してAzure VPN GWからBGPのピアを直接張ることはできないため、オンプレミス、Azure VNET共に重複しないアドレス空間でtunnelを作成します。

今回は192.168.130.1/30をBGPピアIPアドレスに指定します。

参考 : [VPN デバイスの BGP ピア IP アドレスに関する要件はどんなものですか。](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-bgp-overview#what-are-the-requirements-for-the-bgp-peer-ip-addresses-on-my-vpn-device)

```config:tunnelの設定
set zone "Trust" asymmetric-vpn
set interface "tunnel.1" zone "Trust"
set interface tunnel.1 ip <Edit>192.168.130.1/30</Edit>
```

**※「\<Edit\>～\</Edit\>」は適宜環境に合わせて修正してください**

## MTU/MSSの値設定

BフレッツでAzureとVPN接続する場合には以下のMTU/MSSが良いそうです。
ethernet0/0とtunnel.1の両方に設定が必要か判断できなかったので両方設定しました。
(どなたか正解をコメントして頂ければ幸いです)

参考 : [Azureなう : IPsec VPN利用時の、最適なMTU](http://taleofazure.blogspot.com/2014/12/ipsec-vpnmtu.html)

```config:MTU値の設定
set interface ethernet0/0 mtu 1374
set interface tunnel.1 mtu 1374
set flow vpn-tcp-mss 1334
```

## Site to Site VPNの設定

基本的にはAzure側にて「接続」リソース作成後に「構成のダウンロード」で取得できるオンプレミス側の設定ファイルをベースとしています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/eafa61dc-5628-51a2-000a-7eab457f8225.png)

しかし、こちらの内容はBGP非対応のものであるほか、インターネットと直接(PPPoE経由とかではなく)接続されている前提のconfigファイルとなるため、必要な箇所だけ抜粋・修正しました。

注意点・要修正点は以下のとおりです。

- set ike gateway ikev2 "Azure-GW"
  - address : Azure側の仮想ネットワークゲートウェイに割り当てられたパブリックIPアドレスを設定
  - local-id : オンプレミスのWAN側に割り当てられたパブリックIPアドレスを設定
  - preshare : Azure側の接続リソース作成時に設定した共有キーと同じものを設定


```config:VPNの設定
set ike p1-proposal "AZURE-P1_Proposal" preshare group2 esp aes256 sha2-256 hour 8
set ike p2-proposal "AZURE-P2_Proposal" group2 esp aes256 sha2-256 hour 3
set ike gateway ikev2 "Azure-GW" address <Edit>XXX.XXX.XXX.XXX</Edit> local-id "<Edit>XXX.XXX.XXX.XXX<Edit>" outgoing-interface "ethernet0/0" preshare "<Edit>Preshareword</Edit>" sec-level compatible
set ike gateway "Azure-GW" dpd-liveness interval 10
set ike respond-bad-spi 1
set ike gateway ikev2 "Azure-GW" auth-method self preshare peer preshare
set ike ikev2 ike-sa-soft-lifetime 60
unset ike ikeid-enumeration
unset ike dos-protection
unset ipsec access-session enable
set ipsec access-session maximum 5000
set ipsec access-session upper-threshold 0
set ipsec access-session lower-threshold 0
set ipsec access-session dead-p2-sa-timeout 0
unset ipsec access-session log-error
unset ipsec access-session info-exch-connected
unset ipsec access-session use-error-log
set vpn "Azure" gateway "Azure-GW" no-replay tunnel idletime 0 sec-level compatible
set vpn "Azure" monitor optimized rekey
set vpn "Azure" id 0x1 bind interface tunnel.1
set url protocol websense
exit
```

**※「\<Edit\>～\</Edit\>」は適宜環境に合わせて修正してください**

## BGPの設定

注意点・要修正点は以下のとおりです。

- set protocol
  - bgp : オンプレミス側のプライベートASを指定。64512～65534の範囲の内、65515, 65517, 65518, 65519, 65520はAzure側で予約されているので、それ以外を指定します。今回の例では65521を使用しました。

参考 : [Azure によって予約済みの ASN はありますか](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-bgp-overview#are-there-asns-reserved-by-azure)

- set neighbor全体
  - IPアドレス(例では192.168.10.142)に、Azure側の仮想ネットワークゲートウェイ作成後に「構成」から確認できる「BGPピアのIPアドレス」を設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/833078da-29bd-dd8b-a6a5-11d8f445f817.png)

- set neighbor
  - remote-as : Azure側の仮想ネットワークゲートウェイ作成後に「構成」から確認できる「自律システム番号(ASN)」を設定します(例では65516)。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/8c23eea7-61f5-0223-0a0d-44ca77ca4395.png)

- set neighbor ... ebgp-multihop 2
  - こちらを設定しないとtunnel経由でBGP交換を行う場合にデフォルトでは次ホップ(1)までしか広告されないので、必ず設定します
- set ipv4 network
  - オンプレミス側からAzure VNETに広告が必要なセグメント情報をCIDRで指定します(複数行指定可能)。今回の例ではオンプレミス側は 192.168.127.0/24 のみであるため、1行指定しています。
- set route
  - Azure側のBGPピアのIPアドレスを設定します。こちらについては静的登録しないとBGPによるルート交換ができませんので。

```config:BGP設定
set vrouter "trust-vr"
set max-ecmp-routes 2
set protocol bgp <Edit>65521</Edit>
set enable
set hold-time 30
set neighbor <Edit>192.168.10.142</Edit> remote-as <Edit>65516</Edit>
set neighbor <Edit>192.168.10.142</Edit> enable
set neighbor <Edit>192.168.10.142</Edit> hold-time 30
set neighbor <Edit>192.168.10.142</Edit> ebgp-multihop 2
set ipv4 neighbor <Edit>192.168.10.142</Edit> activate
set ipv4 network <Edit>192.168.127.0/24</Edit> weight 100
exit
unset add-default-route
set route <Edit>192.168.10.142/32</Edit> interface tunnel.1
exit
set interface tunnel.1 protocol bgp
```

**※「\<Edit\>～\</Edit\>」は適宜環境に合わせて修正してください**

# 接続確認

JuniperのCLIからget routeコマンドを実行して、ルーティングテーブルにBGP経由でAzure側のルーティング情報が広告されているか確認します。

```
ssg5-isdn-> get route


IPv4 Dest-Routes for <untrust-vr> (0 entries)
--------------------------------------------------------------------------------------
H: Host C: Connected S: Static A: Auto-Exported
I: Imported R: RIP/RIPng P: Permanent D: Auto-Discovered
N: NHRP
iB: IBGP eB: EBGP O: OSPF/OSPFv3 E1: OSPF external type 1
E2: OSPF/OSPFv3 external type 2 trailing B: backup route


IPv4 Dest-Routes for <trust-vr> (12 entries)
--------------------------------------------------------------------------------------
         ID          IP-Prefix      Interface         Gateway   P Pref    Mtr     Vsys
--------------------------------------------------------------------------------------
*         8          0.0.0.0/0         eth0/0   203.180.20.89   C    0      1     Root
*         4  192.168.127.20/32        bgroup0         0.0.0.0   H    0      0     Root
*         1    124.41.88.34/32         eth0/0         0.0.0.0   C    0      0     Root
*         2    124.41.88.34/32         eth0/0         0.0.0.0   H    0      0     Root
*        11    192.168.12.0/24          tun.1  192.168.10.142  eB   40      0     Root
*        10    192.168.10.0/24          tun.1  192.168.10.142  eB   40      0     Root
*         3   192.168.127.0/24        bgroup0         0.0.0.0   C    0      0     Root
*         6   192.168.130.0/30          tun.1         0.0.0.0   C    0      0     Root
*         7   192.168.130.1/32          tun.1         0.0.0.0   H    0      0     Root
         12   192.168.130.1/32          tun.1  192.168.10.142  eB   40      0     Root
*         9  192.168.10.142/32          tun.1         0.0.0.0   S   20      1     Root
```

Pref欄に「eB」と表記されている行がAzureからBGPで受け取ったVNETのルーティング情報です。

オンプレミス上のLinuxからtracerouteとpingした結果です。
うまく繋がりました。

```
pi@raspberrypi:~ $ traceroute 192.168.12.4
traceroute to 192.168.12.4 (192.168.12.4), 30 hops max, 60 byte packets
 1  192.168.127.20 (192.168.127.20)  0.701 ms  0.697 ms  0.712 ms
 2  169.254.0.29 (169.254.0.29)  5.260 ms  6.261 ms  6.801 ms
 3  192.168.12.4 (192.168.12.4)  9.585 ms  9.323 ms  9.059 ms
pi@raspberrypi:~ $ ping -c 3 192.168.12.4
PING 192.168.12.4 (192.168.12.4) 56(84) bytes of data.
64 bytes from 192.168.12.4: icmp_seq=1 ttl=62 time=6.23 ms
64 bytes from 192.168.12.4: icmp_seq=2 ttl=62 time=6.69 ms
64 bytes from 192.168.12.4: icmp_seq=3 ttl=62 time=6.23 ms

--- 192.168.12.4 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 6.232/6.388/6.697/0.218 ms
```

# おわりに

とりあえず感はありますが、無事オンプレミスのJuniper SSG5とAzure VPN GW間でSite to Site接続がBGP有りで接続できました。

参考になれば幸いです。