VyOSをAWSで使う時によくやることをまとめてみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

最近、VyOSと戯れることが多い市田です。
別リージョンとのVPN接続などの際に、ソフトウェアルータであるVyOSをよく利用します。今回は、VyOSをAWS上で作成する際にやることをまとめてみました。

前提の構成

下記のような構成を想定して説明していきたいと思います。

構成図

VyOSでVPN接続するまで

基本項目

MarketplaceからVyOSインスタンスを作成できたら、下記の項目を対応していきます。
なお、対向のVPCで指定するAS番号は65000とします。

  1. 送信元/送信先チェックの無効化
  2. VyOSバージョンアップ
  3. コンフィグ投入
    • configureコマンドで編集モードになって投入します。
    • コンフィグは東京側のVPCで「VPN接続」を作成した際にダウンロードできます。
    • 「VPN接続」の作成については、下記の「対向VPC(VPC-Tokyo)の設定」の項目を参照してください。
    • ダウンロードしたコンフィグの一部を修正して投入します。
    • 設定できたらcommitコマンドで反映して、saveコマンドで保存します。

こちらの具体的な作業内容については、下記と同様になりますので手順については割愛させていただきます。

シンガポール側VPC(VPC-Singapore)のルーティングの設定

ルーティングの設定も上記のブログ記事と同様になります。
今回は、シンガポール側のVPC(VPC-Singapore)のルートテーブルに、東京側(192.168.1.0/24と192.168.2.0/24)へのルートがVyOSインスタンスを経由するように設定します。

図

対向VPC(VPC-Tokyo)の設定

対向VPC(VPC-Tokyo)側の設定も、VyOSに限らずハードウェアVPN接続を行う時の手順と同じですので詳細は割愛いたします。
具体的には以下の作業を行います。

カスタマーゲートウェイの作成

  • VyOSのElastic IPを指定します。

仮想プライベートゲートウェイの作成

  • 作成したらVPC(VPC-Tokyo)にアタッチします。

VPN接続の作成

  • 上記で作成した各ゲートウェイを指定、ルーティングは「動的」を選択します。
  • VyOS(Vyattaを選択)用のコンフィグをダウンロードします。

ルートテーブルの作成

  • VPC(VPC-Tokyo)に対してルートテーブルを作成します
  • 「ルート伝達」を有効にします。ルート伝達については続きをご覧ください。

ルート伝達(Route Propagation)

運用コストや管理コストを減らすために、東京リージョン側の仮想プライベートゲートウェイに対して、ルート伝達を有効にしておきます。
(何らかの理由でルートテーブルの管理は手動で行いたいという場合を除きます。)

作業としては次のとおりです。

東京リージョン側で対象のルートテーブルを選択します。
次に「ルート伝達」タブで「伝達」にチェックを入れて保存します。

ルート伝達の図

すると、VyOSから伝達されてきたルーティング情報がルートタブに自動的に反映されていると思います。
今回の場合ですと、シンガポールリージョンのVyOSがあるサブネット(10.10.1.0/24)へのルーティングが自動的に追加されています。

ルート伝達完了の図

BGPアドバタイズするネットワーク設定の追加

VyOSを経由してプライベートサブネットにアクセスできない

今回想定している構成では、VyOSインスタンスとその他のインスタンスでサブネットグループを分けています。これは、パブリックサブネットとプライベートサブネットを意識した形になります。

しかし、ここまでで作成したVyOSのコンフィグでは、ap-1またはap-2からap-3のインスタンスにアクセスすることができません。

理由は、東京側VPCにシンガポール側のプラベート用サブネット(10.10.2.0/24)へのルーティング情報がない為です。 (ap-3からap-1、ap-2へはアクセスできますが、東京リージョン側にシンガポール側への戻りの経路がないので、応答を得ることができません)

対策

上記の理由の通り、東京側VPC(VPC-Tokyo)のルートテーブルに10.10.2.0/24へのルーティングを追加すれば解決します。

手動で追加してもいいですが、折角なのでルート伝達できるようにする為に、VyOSに設定を追加します。
設定は、以下のとおりです。

$ configure
# set protocols static route 10.10.2.0/24 next-hop 10.10.1.1
# set protocols bgp 65000 network 10.10.2.0/24
# commit
# save
# exit

最初にVyOS自身に10.10.2.0/24宛てのルーティングを追加します。これは、次のnetwork文で宣言するCIDRが、VyOSのルーティングテーブルにないといけない為です。
その後にアドバタイズするネットワークを設定します。

なお、VPCではサブネットの最初のアドレスがVPCルータ用に予約されるので、next-hopに10.10.1.1を指定しています。

確認

以上で東京側VPC(VPC-Tokyo)のルーティングテーブルに10.10.2.0/24へのルーティングが伝達されて追加されます。

ルートテーブル追加

これで、シンガポール側のVyOSを経由して、東京リージョンの192.168.1.0/24192.168.2.0/24のサブネットと10.10.2.0/24とが相互に接続ができるようになりました。

AWSでVyOSを使う時のTips

VPN接続については以上になります。
次からは、AWS上でVyOSを使うときのTipsを紹介したいと思います。

authログのローテーション

VPCで作成したコンフィグの場合、DPD(Dead Peer Detection)という機能が有効になっています。これは、VPNピアが切れた時に再接続などの処理を実施する機能のことです。

このDPDの動作記録は定期的にログ(/var/log/auth.log/var/log/messages)に出力されるのですが、auth.logはローテーションされないので、ある時突然Disk fullになってしまうことがあります。

これを回避するため、下記のようなlogrotateの設定を/etc/logrotate.d/authとして作成します。(logrotateの設定の内容は各自の要件に合わせて修正してください)

/var/log/auth.log {
    weekly
    rotate 4
    missingok
}

タイムゾーン設定

デフォルトではUTCになっているので必要に応じて修正します。

$ configure
# set system time-zone Asia/Tokyo
# commit
# save
# exit

ホスト名

MarketplaceのAMIで作成した場合、デフォルトのホスト名はVyOS-AMIです。 必要に応じて変更します。

$ configure
# set system host-name <任意のホスト名>
# commit
# save
# exit

よく使う確認コマンド

VyOSをAWSで使うときはBGP設定などを確認することが多いと思います。
ここでは個人的によく使うコマンドを紹介します。

BGPテーブル確認

vyosが保有している全てのBGP情報を確認できます。

$ show ip bgp 

IPsec関連のログの確認

$ show log vpn ipsec

IPsec SAのコネクションの確認

Stateの内容などで接続の有無を判断できます。

$ show vpn ipsec sa

Peer ID / IP                            Local ID / IP
------------                            -------------
xxx.xxx.75.64                            xxx.xxx.1.236

    Description: VPC tunnel 1

    Tunnel  State  Bytes Out/In   Encrypt  Hash    NAT-T  A-Time  L-Time  Proto
    ------  -----  -------------  -------  ----    -----  ------  ------  -----
    vti     up     17.8K/17.8K    aes128   sha1    no     2301    3600    all


Peer ID / IP                            Local ID / IP
------------                            -------------
xxx.xxx.212.224                          xxx.xxx.1.236

    Description: VPC tunnel 2

    Tunnel  State  Bytes Out/In   Encrypt  Hash    NAT-T  A-Time  L-Time  Proto
    ------  -----  -------------  -------  ----    -----  ------  ------  -----
    vti     up     2.6K/2.6K      aes128   sha1    no     1284    3600    all

ルートテーブルの確認

VPNが正常に接続できていれば、対向のVPCからルーティング情報を受け取れていることが確認できます。これにより、対向のVPC情報が分からなくても、こちらのVPCのルートテーブルに対向VPCへのルーティングを設定することができます。

下記の例だと、192.168.0.0/16がBGPで受け取っているものになるので、これが対向VPCのネットワークであることが判断できます。

$ show ip route

Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

S>* 0.0.0.0/0 [210/0] via 10.10.1.1, eth0
C>* 10.10.1.0/24 is directly connected, eth0
S>* 10.10.2.0/24 [1/0] via 10.10.1.1, eth0
C>* 127.0.0.0/8 is directly connected, lo
C>* 169.254.xxx.xxx/30 is directly connected, vti0
C>* 169.254.xxx.xxx/30 is directly connected, vti1
B>* 192.168.0.0/16 [20/100] via xxx.xxx.25.133, vti1, 06:29:59

その他の便利なコマンド

コンフィグを修正したい時

修正箇所を削除して設定し直します。setをdeleteに変更するだけです。

deleteコマンドで削除したいコンフィグを消します。
# delete protocols bgp 65000 network 0.0.0.0/0

setコマンドで新たな設定を入れます。
# set protocols bgp 65000 network 10.10.1.0/24

コンフィグ反映前の確認

コンフィグを変更した時に、commitする前にcompareコマンドでdiffを取ることができます。例えば先ほどの場合だと、下記のようになります。

# compare
[edit protocols bgp 65000]
-network 0.0.0.0/0 {
-}
+network 10.10.1.0/24 {
+}

strip-privateコマンド

コンフィグモードのshowコマンドの出力からIPアドレスなどの機密情報をマスクします。
下記のサンプル(一部抜粋)だと、IPアドレスの一部がxxx.xxxでマスクされています。他にはAS番号やユーザー名などもしっかりマスクされます。

ブログに記載する場合などに便利です。

$ show configuration | strip-private

interfaces {
    ethernet eth0 {
        address dhcp
        duplex auto
        hw-id XX:XX:XX:01:19:2b
        smp_affinity auto
        speed auto
    }
    loopback lo {
    }
    vti vti0 {
        address xxx.xxx.24.94/30
        description "VPC tunnel 1"
        mtu 1436
    }
    vti vti1 {
        address xxx.xxx.25.134/30
        description "VPC tunnel 2"
        mtu 1436
    }
}

特定のコンフィグ内容に対しても利用できます。

# show system login | strip-private

 user xxxxxx {
     authentication {
         encrypted-password xxxxxx
         plaintext-password xxxxxx
         public-keys xxxx@xxx.xxx {
             key xxxxxx
             type ssh-rsa
         }
     }
     level admin
 }

コンフィグの内容だけでなく、動作確認のコマンド結果に対しても利用できます。
下記は、IPsec SAのコネクションの状況確認に対してマスクします。

$ show vpn ipsec sa |strip-private

commandsコマンド

コンフィグモードのshowコマンドの出力をコマンド形式に変換します。
今のコンフィグを他のVyOSに転用したいとか、すぐに複製したいと言った時に役に立ちます。

ブログなどに載せる場合は、先ほどのstrip-privateコマンドと併用すると便利です。

# show system login | strip-private | commands

set user xxxxxx authentication encrypted-password 'xxxxxx'
set user xxxxxx authentication plaintext-password 'xxxxxx'
set user xxxxxx authentication public-keys xxxx@xxx.xxx key 'xxxxxx'
set user xxxxxx authentication public-keys xxxx@xxx.xxx type 'ssh-rsa'
set user xxxxxx level 'admin'

カスタムメトリクス

VyOSのメモリ使用率やディスク使用量をCloudWatchで取得する場合は、AWS CLIで取得できるようにしておきます。
こちらの具体的な設定方法は下記をご参照ください。

最後に

他にも色々紹介したい機能や利用パターン、AWSネイティブな使い方もありますが、随時ご紹介していきたいと思います。

以上になります。