from Allied Telesis AR560s to Amazon VPC - make Private VPN 


Alied Telesis のインテリジェントルーター [AR560s](#https://www.allied-telesis.co.jp/products/list/router/ar560s/catalog.html) でAmazon VPC にVPN接続する設定について書きます。
社内では、ほぼこの設定で動いてます。(^ ^)

AR560s側の設定が中心です。"ネットワークのお勉強寄り"な内容です。

あじぇんだ

* 用意するもの
* ネットワーク構成
* いきなり答え発表
* (かなり詳細な)説明
 注） かなり長い説明です。
半分以上基礎知識なので、「今から勉強！」という人向け。
すぐ繋ぎたい人は答えだけ見てください。


# 用意するもの
[AR560s](#https://www.allied-telesis.co.jp/products/list/router/ar560s/catalog.html)
他のルーターは試してませんので、あしからず。

[AWS](http://aws.amazon.com/jp/)
AWSにアカウントを作る必要があります。
「クレカの入力が必要」という点が、一番高いハードルかもしれませんね（笑）。
（社内説得として）

[グローバルIP]
AWSと社内の接続ポイントになるIPアドレスです。
ISPと契約することになりますが、一般的に1つのIPを付与する端末型とIPセグメントを配布するLAN型があります。詳しくは[こちら](http://www.infraexpert.com/study/ip13.html)

#ネットワーク構成
今回は、AWS Documentation の[Amazon VPC とは](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_VPN.html#Examples) に記載されている最も基本的なVPN接続を実現します。

こんな感じです。

![AWS-Basic VPC.png](https://qiita-image-store.s3.amazonaws.com/0/49986/b0a1dcd7-b3b4-adac-d588-287798f3a92e.png)

# いきなり答え

本当に「いきなり」ですが、AR560sに入れ込む設定ファイルです。

 * 太字のところは、ISPから配布されるIPや、社内のプライベートネットワーク、AWS側の情報を設定するところです。
  
----
create ppp=0 over=eth0-any
set ppp=0 bap=off iprequest=on username=*username@ISP* password=*password*
set ppp=0 over=eth0-any lqr=off echo=10

enable ip
enable ip remote
add ip int=ppp0-0 ip=0.0.0.0
add ip int=ppp0-1 ip=***1.1.1.1*** mask=255.255.255.255
add ip rou=0.0.0.0 mask=0.0.0.0 int=ppp0-1 next=0.0.0.0

add ip int=vlan1 ip=*192.168.1.1*

enable firewall
create firewall policy="net"
disable firewall policy="net" identproxy
enable firewall policy="net" icmp_f=unre,ping
add firewall policy="net" int=vlan1 type=private
add firewall policy="net" int=ppp0-0 type=public
add firewall policy="net" int=ppp0-1 type=public
add firewall poli="net" nat=enhanced int=vlan1 gblin=ppp0-1 gblip=***1.1.1.1***
add firewall poli="net" ru=1 ac=allo int=ppp0-1 prot=udp po=500 ip=***1.1.1.1*** gblip=***1.1.1.1*** gblp=500
add firewall poli="net" ru=2 ac=non int=ppp0-1 prot=ALL ip=***192.168.1.1-192.168.1.254*** enc=ips
add firewall poli="net" ru=3 ac=non int=vlan1 prot=ALL ip=***192.168.1.1-192.168.1.254***
set firewall poli="net" ru=3 rem=***10.0.1.1-10.0.255.254***

create ipsec sas=2 key=isakmp prot=***esp*** enc=***aes128*** hasha=***sha***
create ipsec bund=2 key=isakmp string="2" expirys=***3600***
create ipsec pol="isa" int=ppp0-1 ac=permit
set ipsec pol="isa" lp=500 rp=500 tra=UDP
create ipsec pol="nat" int=ppp0-1 ac=permit
set ipsec pol="nat" lp=***4500*** rp=***4500*** tra=***UDP***

create ipsec pol="aws0" int=ppp0-1 ac=ipsec key=isakmp bund=2 peer=***2.1.1.1***
set ipsec pol="aws0" lad=***192.168.1.0*** lma=***255.255.255.0*** rad=***10.0.1.0*** rma=***255.255.0.0***
set ipsec pol="aws0" USEPFSKEY=***true*** GROUP=***2***

create ipsec pol="aws1" int=ppp0-1 ac=ipsec key=isakmp bund=2 peer=***2.1.1.2***
set ipsec pol="aws1" lad=***192.168.1.0*** lma=***255.255.255.0*** rad=***10.0.1.0*** rma=***255.255.0.0***
set ipsec pol="aws1" USEPFSKEY=***true*** GROUP=***2***

create ipsec pol="inet" int=ppp0-1 ac=permit
enable ipsec


create isakmp pol="aws0" pe=***2.1.1.1*** enc=***aes128*** key=*1*
set isakmp pol="aws0" expirys=***28800*** gro=***2*** natt=***true*** DPDMODE=***BOTH*** DPDIDLETIMEOUT=***10***
set isakmp pol="aws0" sendn=true sendd=true

create isakmp pol="aws1" pe=***2.1.1.2*** enc=***aes128*** key=*2*
set isakmp pol="aws1" expirys=***28800*** gro=***2*** natt=***true*** DPDMODE=***BOTH*** DPDIDLETIMEOUT=***10***
set isakmp pol="aws1" sendn=true sendd=true

enable isakmp

----

# （かなり詳細な）設定方法 
さて、手順としては、

1. AWSにVPCを作る。
2. AR560sに設定ファイルを入れ込む。

になります。

## AWS側の設定(手順1.)
手順の 1.は便利なウィザードで簡単にできます。

AWSマネジメントコンソールにログインして、***Services->VPC*** を選択。

![vpc wizard1.png](https://qiita-image-store.s3.amazonaws.com/0/49986/0dcefcd0-2b83-38f2-3493-ad2fbf33d0eb.png)

↓

![vpc wizard 2.png](https://qiita-image-store.s3.amazonaws.com/0/49986/3d70ea27-028d-e5d2-6f18-b8e778e1c471.png)

今回は、***VPC with a Private Subnet Only and Hardware VPN Access*** を選びます。

あとは、ウィザードに従って社内プライベートネットワーク情報を入力します。
設定完了後、VPNの状態は、VPC->VPN Connection で確認できます。（下の画像）

＃ 設定直後なので、VPNはDOWN(セッションが張れてない）状態になってます。

![vpc-state.png](https://qiita-image-store.s3.amazonaws.com/0/49986/29e8e65c-d3c3-d1a6-122e-e95afaa35321.png)

VPCの作成が成功すると、社内の接続ポイントであるルーターへ追加するVPCへの接続情報が、ダウンロードできるようになります。

有名メーカーのルータであれば、その機種固有のファイルがダウンロードできます。
（ちなみに、アライドテレシスのルーターは残念ながらありません。）

落としておきましょう。

設定ファイルの例は[こちら](http://docs.aws.amazon.com/AmazonVPC/latest/NetworkAdminGuide/GenericConfig.html) 

![downloadconfig.png](https://qiita-image-store.s3.amazonaws.com/0/49986/dc263195-28ef-0450-3ac2-4e73850af532.png)

## AR560sの設定（手順2.)
次は、AR560sの設定です。
ネットワークの学習も兼ねているので、基礎知識なところの説明を厚くしています。
設定ファイルの文法については、はしょってます。

## PPPoE 認証の設定

```
create ppp=0 over=eth0-any
set ppp=0 over=eth0-any lqr=off echo=10
set ppp=0 bap=off iprequest=on username=username@ISP password=password
```
ISPと接続するための[PPP](http://www.infraexpert.com/study/ip13.html)インターフェースを作成します。

**ppp=0 eth0-any**は、WAN側ポート0番(eth0)をPPP通信に使用する設定です。
![31dVMxKhaPL.jpg](https://qiita-image-store.s3.amazonaws.com/0/49986/8b89d6ec-8d20-3768-2991-c4d37e6730b6.jpeg)

**lqr=off** は、Link Query Reportの略で、PPPの状態を監視する特殊なプロトコルのことです。
[LQR(RFC1333)](https://tools.ietf.org/html/rfc1333)

**echo=10**は、PPPの状態監視として[LCP](http://www.tcpipguide.com/free/t_PPPLinkControlProtocolLCP.htm)
(TCP/IPを利用した状態監視）を使用します。先ほどのLQRとどちらかを選ぶことになりますが、
LCPのほうが現在は主流なので、こちらを使います。

**bap=..., iprequest=..., username=..., password=...** は、ISP側の認証情報を設定します。
[BAP(RFC2125)](https://tools.ietf.org/html/rfc2125)は、Bandwidth Allocation Protocol の略で、マルチリンク時に帯域幅を制御するために使います。
ISDN時代には、高速化のために２系統の回線を使っていたことから、それぞれのリンクの帯域幅のズレから安定性が損なわれるのを防ぐ目的で利用されていました。
今回は単回線なのでOFFにします。ほとんどの場合OFFで問題ないと思います。

これで、ISPとの認証後、パケットがeth0へ流れるようになりました。
次はルーティングです。

## 社内→社外へのルーティング

イメージはこんな感じです。
![routing1.png](https://qiita-image-store.s3.amazonaws.com/0/49986/f277029e-618f-a5b0-4d20-6f64418f5d6b.png)


```
enable ip
enable ip remote
add ip int=ppp0-0 ip=0.0.0.0
add ip int=ppp0-1 ip=1.1.1.1 mask=255.255.255.255
add ip rou=0.0.0.0 mask=0.0.0.0 int=ppp0-1 next=0.0.0.0
add ip int=vlan1 ip=192.168.1.1
```
**enable ip** はAR560s でIPでの通信を有効にします。
**enable ip remote** は、PPPで認証情報をやりとりするためのプロトコル、IPCP(Internet Protocol Control Protocol)を有効にします。

[IPCP(RFC1332)](https://tools.ietf.org/html/rfc1332)
ISPからグローバルIPを直接付与してもらうためのプロトコルです。このプロトコルに則り、先ほど設定した認証情報が送られます。

**add ip int=ppp0-0 ip=0.0.0.0** は、AR560s と社外との通信に Unnumbered(ip=0.0.0.0)を使用します。

[PPPoE Unnumbered](http://www.infraexpert.com/study/ip13.html) 
ISPとLAN型の契約をしており、PPPoEでの認証が必要な場合は、ルーターがUnnumberedに対応している必要があります。

**add ip int=ppp0-1 ip=1.1.1.1 ...**は、社内のPCたちから出て行くときは、1.1.1.1を使ってね。という設定。

**add ip rou=0.0.0.0 mask=0.0.0.0 int=ppp0-1** は、1.1.1.1は、0.0.0.0(Unnumbered)を使ってインターネットと接続しようね。という設定。

**add ip int=vlan1 ip=192.168.1.1**は、社内プライベートネットワークのAR560s側アドレスを、192.168.1.1にします。という設定。(下の図のポートね）

![31dVMxKhaPL (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/49986/1c29c8e6-615a-321a-26aa-84bf10f6e321.jpeg)

>LAN型接続の場合は、こういうことをしてあげないといけない。
たとえば、この0.0.0.0を通れ。という設定を1.1.1.1にすると、ISPとルーターが端末型で接続
されることになり、せっかくマルチグローバルなIPを振ってもらえてるのに、一つしか使えない。

## 穴あけ
普段ルーターに触れているなら**常識**なのでしょうが、あえて書きますと一般的にルーターは、

 * 外(internet)→中(社内ネットワーク)に対しては閉じています。
 * 中(社内ネットワーク)→外(internet)の接続は開いてます。

なので、外→中に入ってこようとするパケットを必要な分だけ開けてあげるのが、firewall の設定です。

```
enable firewall
create firewall policy="net"
disable firewall policy="net" identproxy
enable firewall policy="net" icmp_f=unre,ping
add firewall policy="net" int=vlan1 type=private
add firewall policy="net" int=ppp0-0 type=public
add firewall policy="net" int=ppp0-1 type=public
add firewall poli="net" nat=enhanced int=vlan1 gblin=ppp0-1 gblip=1.1.1.1
add firewall poli="net" ru=1 ac=allo int=ppp0-1 prot=udp po=500 ip=1.1.1.1 gblip=1.1.1.1 gblp=500
add firewall poli="net" ru=2 ac=non int=ppp0-1 prot=ALL ip=192.168.1.1-192.168.1.254 enc=ips
add firewall poli="net" ru=3 ac=non int=vlan1 prot=ALL ip=192.168.1.1-192.168.1.254
set firewall poli="net" ru=3 rem=10.0.1.1-10.0.255.254
```
**disable firewall .. identproxy** は、外→内の[Identification Protocolパケット](https://www.astaro.org/gateway-products/network-protection-firewall-nat-qos-ips/40944-ident-proxy.html)を拒否します。
Identification Protocol には、ユーザー情報が含まれるため、こうします。

**enable firewall ... icmp_f=unre,ping** は、ping要求を許可します。
ルーターのデフォルト設定は、ICMPパケットが通過しませんので、許可します。
「あれ〜？つながらないなあ〜。」「ping届く〜？」用。

**add firewall policy="net" int=vlan1 type=private**
**add firewall policy="net" int=ppp0-0 type=public**
**add firewall policy="net" int=ppp0-1 type=public**
この３つは、どっち向きのパケットに対するfirewallか？という設定。
"type=public"は、外→中、"type=private"は、中→外、という意味です。

**add firewall poli="net" nat=enhanced int=vlan1 gblin=ppp0-1 ....**
社内ネットワーク(192.168.1.X)からNATを使って外に接続するときは、1.1.1.1を使え。という設定。

**add firewall poli="net" ru=1 ac=allo int=ppp0-1 prot=udp po=500 ip=1.1.1.1 gblip=1.1.1.1 gblp=500**
[IKE(Internet Key Exchange)](http://en.wikipedia.org/wiki/Internet_Key_Exchange)用のポート設定。外から来るUDP 500番ポートへのアクセスを
通過させますよ。という意味です。

**add firewall poli="net" ru=2 ac=non int=ppp0-1 prot=ALL ip=192.168.1.1-192.168.1.254 enc=ips**
internetから、社内ネットワークへのパケットは全て通過させます。という設定。

**add firewall poli="net" ru=3 ac=non int=vlan1 prot=ALL ip=192.168.1.1-192.168.1.254
set firewall poli="net" ru=3 rem=10.0.1.1-10.0.255.254**
この2つは、社内ネットワークから、AWSのVPC内にあるプライベートセグメントへのプロトコルは全て通過させます。という設定。

## IPSec トンネルの設定
ここからは、AWSとIPSecトンネルを作成する設定です。
[IPSec](http://www.infraexpert.com/study/study10.html)
L3(IP)ベースで暗号化とトンネリングを行う技術です。
詳細な解説は[こちら](http://www.infraexpert.com/study/study10.html)
(掲載元：「ネットワークエンジニアとして 」http://www.infraexpert.com/）

大雑把に言うと、
IPSecの通信路は、2段階のフェーズが必要です。

 1. Phase1は鍵交換のための通信路の確立
 1. Phase2はIPSec通信用の通信路の確立
 
です。

と、その前に、暗号化にはキーが必要です。
このキーは、設定ファイルに直接書くことができません。
AR560sのコンソールに直接ログインして、**[create enco key](https://www.allied-telesis.co.jp/support/list/router/ar570s/docs/CREATE_ENCO_KEY.html)　コマンドで登録します。

```
create enco key=1 type=general value="<<キーの値>>"
```
> 文字列なので、"(ダブルクォート)忘れずに。
まず、下の設定は、IPSec Phase2 通信用の設定です。
キーの値は、AWSから取得したファイル内のPre-Shared-Keyに記載があります。

先ほどのIPSecのPhase1では、この鍵を事前に交換するための伝送路を確立するわけですね。

```
create ipsec sas=2 key=isakmp prot=esp enc=aes128 hasha=sha
create ipsec bund=2 key=isakmp string="2" expirys=3600
create ipsec pol="isa" int=ppp0-1 ac=permit
set ipsec pol="isa" lp=500 rp=500 tra=UDP
create ipsec pol="nat" int=ppp0-1 ac=permit
set ipsec pol="nat" lp=4500 rp=4500 tra=UDP

create ipsec pol="aws0" int=ppp0-1 ac=ipsec key=isakmp bund=2 peer=2.1.1.1
set ipsec pol="aws0" lad=192.168.1.0 lma=255.255.255.0 rad=10.0.1.0 rma=255.255.0.0
set ipsec pol="aws0" USEPFSKEY=true GROUP=2

省略(pol="AWS1")

create ipsec pol="inet" int=ppp0-1 ac=permit
enable ipsec
```
**create ipsec sas=2 key=isakmp prot=esp enc=aes128 hasha=sha**
SAS(Security Association Spec)を設定します。暗号化通信のためのアルゴリズムや鍵交換方法を設定します。この設定の集合をSASと呼んでいます。

**create ipsec bund=2 key=isakmp string="2" expirys=3600**
SASと連携するbundleスペックを設定します。SAで通信を行う通信路の設定をします。
"string=2"は、先ほど設定したSASの番号(=2)です。

**create ipsec pol="isa" int=ppp0-1 ac=permit
set ipsec pol="isa" lp=500 rp=500 tra=UDP
create ipsec pol="nat" int=ppp0-1 ac=permit
set ipsec pol="nat" lp=4500 rp=4500 tra=UDP**
これらの設定は、鍵交換(IKE)とNATTraversal(後述）で使用するポートの開放です。
IKEでは、UDPの500番、NATTraversalでは、UDP4500が使われますので、開放しておきます。
>AWSから取得できる一般的(General)のVPN設定ファイルには、NaTtraversalの記載がないので、
注意しましょう。


**create ipsec pol="aws0" int=ppp0-1 ac=ipsec key=isakmp bund=2 peer=2.1.1.1
set ipsec pol="aws0" lad=192.168.1.0 lma=255.255.255.0 rad=10.0.1.0 rma=255.255.0.0
set ipsec pol="aws0" USEPFSKEY=true GROUP=2**
次は、実際にIPSecトンネルを確立するIPアドレスを設定です。
この情報は、AWSから取得したVPNの設定ファイルに記載されています。
> ここで注意するのは"USEPFSKEY"です。こちらもAWSから取得するVPN設定ファイルには記載がないので、設定をわすれずに。

次に、Phase1の設定です。

```
create isakmp pol="aws0" pe=2.1.1.1 enc=aes128 key=1
set isakmp pol="aws0" expirys=***28800*** gro=2 natt=true DPDMODE=BOTH DPDIDLETIMEOUT=10
set isakmp pol="aws0" sendn=true sendd=true

省略(pol="AWS1")

enable isakmp
```
ここでもほとんどの値は、AWSから取得するVPN設定ファイルの値です。
> 注意するところは、２行目のnatt=trueは、AWSの設定ファイルからはわからないので設定をわすれずに。


超長文になり、ここまで全部読まれた方は本当にお疲れさまでした。疲れたでしょう。。

これでやっと、設定は完了です。

AR560Sを実際にネットワークに接続して、AWS側のマネジメントコンソールが"UP"になっていることを確認しましょう。

![vpc-state1.png](https://qiita-image-store.s3.amazonaws.com/0/49986/8174f5de-aed8-620b-186c-9ac75bee2aa3.png)

これでAWSと社内ネットワークのVPNが確立できました。
AWSと閉域網（厳密には違いますが）で接続できたことになります。
これができれば、社内の開発環境やインフラをAWSへ移行もしやすくなると思います。

ネットワーキング系のサービスは、基礎知識がないとなかなか難しい部分もありますが、
実際つながるとなかなかうれしいもんです。

みなさま！よりよいAWS ライフを。