kWatanabe 記事一覧へ

kWatanabe の 技術帖

某企業でOSや仮想化の研究をやっているインフラ系エンジニア。オンプレとクラウドのコラボレーションなど、興味ある技術を綴る。

AWS・Azure・自宅にてマルチでハイブリッドなクラウドを作ってみた(その1)

大要

  • 自学自習のため、マルチでハイブリッドなクラウドを作ってみた
  • AWS、Azure、自宅の各拠点をプライベートなネットワークで結ぶ
  • ゴールは、各リソースをパブリックな通信なしで利用できるようにすること
  • まずは、Softether VPNでサイト間VPNを構築した

次回は PaaS を VPN に繋げる話。 kwatanabe.hatenablog.jp

背景

  • 浦島太郎なkWatanabeにとって、クラウドといえばOpenNebula、OpenStack、CloudStackであって、パブリックなクラウドは馴染みがない
  • コレはイカんと思い、会社の勉強会*1にかこつけて、何かパブリッククラウドで遊んでみようと思った
  • システムを知るにはまずは足回りからがモットーなので、まずは生の計算機とネットワークが見えそうな、マルチでハイブリッドなクラウドに挑戦した

マルチでハイブリッドなクラウド

f:id:kWatanabe:20200925222427g:plain
マルチでハイブリッドなクラウド

サイト間VPN

f:id:kWatanabe:20200925234646g:plain
サイト間VPNのイメージ

  • まず、各拠点をプライベートなネットワークで結ぶためにサイト間VPNを作る
  • 各事業者でVPNのPaaSを提供
  • 今回は1つの仕組みで完結させる為、Softether VPNを採用
  • 注意点としては、AWSもAzureも仮想ネットワークはL3レベルでフィルタされているので、L2ではなくL3でサイト間VPNをはる必要がある

ネットワークの整備

自宅

  • 192.168.1.0/24 が整備されている
  • VPNサーバ以外の各端末のルーティングテーブルを設定する
    • 192.168.20.0/24 via 192.168.1.249 (VPNサーバの仮想L3スイッチの内向きアドレス)
    • 192.168.21.0/24 via 192.168.1.249 (同上)
    • 192.168.30.0/24 via 192.168.1.249 (同上)
    • 192.168.31.0/24 via 192.168.1.249 (同上)
    • 192.168.10.0/24 via 192.168.1.249 (同上)

Amazon VPC

  • CIDRの範囲:192.168.20.0/24 と 192.168.21.0/24
  • サブネット「Hybrid-Subnet」
    • CIDR:192.168.20.0/24
    • ルートテーブル
      • 192.168.1.0/24 via 192.168.20.1 (VPNブリッジのEC2インスタンス)
      • 192.168.30.0/24 via 192.168.20.1 (同上)
      • 192.168.31.0/24 via 192.168.20.1 (同上)
    • アベイラビリティゾーン:Hybrid-Subnet-Dammy と異なるところ
  • サブネット「Hybrid-Subnet-Dammy」
    • CIDR:192.168.21.0/24
    • アベイラビリティゾーン:Hybrid-Subnetと異なるところ
    • ルートテーブルなし

Azure VNet

  • IPv4 アドレス空間:192.168.30.0/24 と 192.168.31.0/24
    • サブネット「Hybrid_Subnet」
      • CIDR:192.168.30.0/24
      • ルートテーブル
        • 192.168.1.0/24 via 192.168.30.100 (VPNブリッジのVirtualMachine)
        • 192.168.20.0/24 via 192.168.30.100 (同上)
        • 192.168.21.0/24 via 192.168.30.100 (同上)
    • サブネット「Hybrid_Subnet_Dammy」
      • CIDR:192.168.31.0/24
      • ルートテーブルはHybrid_Subnetと同じ
    • BastionHost:無効化
    • DDoS Protection Standard:無効化
    • ファイアウォール:無効化

Softether VPN のインストール

自宅(VPNサーバ)

  • 環境は、LXCで構築した Debian 10 のシステムコンテナ
  • ネットワークインタフェースは2つ
    • eth0:VPN通信を受け付けるNIC
      • veth (仮想NICをホストのNICにブリッジ接続)
      • ルータから 5555/TCP ポートがフォーワードされる
      • IPアドレスは 192.168.1.0/24 のどこか(なんでもいい)
    • eth1:パケットをローカルに流すためのNIC
      • phys (物理NICをパススルー)
      • プロミスキャスモードにする
      • IPアドレスは未割り当て

SoftEther の サイトから Linux 64bit 用のバイナリを入手してリンクする

$ sudo apt install wget gcc make
$ cd /opt
$ wget https://jp.softether-download.com/files/softether/v4.34-9745-rtm-2020.04.05-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.34-9745-rtm-2020.04.05-linux-x64-64bit.tar.gz -O - | sudo tar xzf -
$ cd /opt/vpnserver
$ sudo make

systemdのユニットファイルを作成して、自動起動を有効化する

$ cat << EOF | sudo tee /etc/systemd/system/softether-vpnserver.service
[Unit]
Description=Softether VPN Server Service
After=network.target

[Service]
Type=forking
User=root
ExecStart=/opt/vpnserver/vpnserver start
ExecStop=/opt/vpnserver/vpnserver stop
Restart=on-abort
WorkingDirectory=/opt/vpnserver

[Install]
WantedBy=multi-user.target
EOF
$ sudo chmod +x /etc/systemd/system/softether-vpnserver.service
$ sudo systemctl daemon-reload
$ sudo systemctl start softether-vpnserver
$ sudo systemctl enable softether-vpnserver

適当な端末から eth0 に向かって、SoftEther VPN Managerで接続して、以下の設定を施す。

  • 仮想HUB「DEFAULT」の設定
    • ユーザ名:テキトー
    • 認証方法:パスワード認証
    • SecureNATは無効
    • ローカルブリッジ:eth1
  • 仮想HUB「HYBRID」の設定
    • ユーザ名:テキトー
    • 認証方法:パスワード認証
    • SecureNATは無効
  • 待受ポート:5555/TCP (SE-VPN) のみ
  • 仮想L3スイッチの設定
    • インターフェース
      • 192.168.1.249 ⇒ 接続先HUB「DEFAULT」に接続
      • 192.168.10.1 ⇒ 接続先HUB「HYBRID」に接続
    • ルーティングテーブル
      • 192.168.20.0 ⇒ 192.168.10.2 (AWS用)
      • 192.168.30.0 ⇒ 192.168.10.3 (Azure用その1)
      • 192.168.31.0 ⇒ 192.168.10.3 (Azure用その2)

以上で設定完了。

AWS および Azure(VPNブリッジ)

  • Amazon EC2 と Azure VirtualMachine で Debian10 のインスタンスを作成
    • NICはそれぞれ自身の VPC なり VNet なりに属するインタフェース1個
    • パブリックIPあり
    • プライベートIPは手動指定
      • AWS:192.168.20.100/24
      • Azure:192.168.30.100/24
    • モニタモードに相当する機能を有効化
      • AWS:送信元/送信先チェックを無効にする
      • Azure:Enable IP forwardingを有効にする
    • セキュリティグループ
      • 自分のサブネット内のパケットすべて許可
      • 5555/TCP (SE-VPN) を許可

SoftEther の サイトから Linux 64bit 用のバイナリを入手してリンクする。

$ sudo apt install wget gcc make
$ cd /opt
$ wget https://jp.softether-download.com/files/softether/v4.34-9745-rtm-2020.04.05-tree/Linux/SoftEther_VPN_Bridge/64bit_-_Intel_x64_or_AMD64/softether-vpnbridge-v4.34-9745-rtm-2020.04.05-linux-x64-64bit.tar.gz -O - | sudo tar xzf -
$ cd /opt/vpnbridge
$ sudo make

ユニットファイルを作成して、自動起動を有効化する

$ cat << EOF | sudo tee /etc/systemd/system/softether-vpnbridge.service
[Unit]
Description=Softether VPN Bridge Service
After=network.target

[Service]
Type=forking
User=root
ExecStart=/opt/vpnbridge/vpnbridge start
ExecStop=/opt/vpnbridge/vpnbridge stop
Restart=on-abort
WorkingDirectory=/opt/vpnbridge

[Install]
WantedBy=multi-user.target
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl start softether-vpnbridge
$ sudo systemctl enable softether-vpnbridge

VPNブリッジは自力でアドレス変換しないとダメなのでポートフォワードを有効化

$ sudo vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
$ sudo sysctl -p

適当な端末から、SoftEther VPN Managerで接続して、以下の設定を施す。

  • 仮想HUB「BRIDGE」
    • ポート:5555/TCP
    • ローカルブリッジ:新しいtapデバイス ( vpntap )
    • カスケード接続:仮想HUB「HYBRID」
      • ブリッジ名:HYBRID
      • 接続先:自宅のVPNサーバ
      • 状態:オフライン
    • ユーザ名とパスワード:仮想HUB「HYBRID」に設定したもの

SoftEther VPN の設定後に、tapデバイスに ip addr でIPアドレスを設定

  • AWS:192.168.10.2
  • Azure:192.168.10.3

SoftEther VPNの設定後に、ip route でローカルのルーティングテーブルを編集

  • AWS
    • 192.168.1.0/24 via 192.168.10.1 dev tap_vpntap
    • 192.168.30.0/24 via 192.168.10.1 dev tap_vpntap
    • 192.168.31.0/24 via 192.168.10.1 dev tap_vpntap
  • Azure
    • 192.168.1.0/24 via 192.168.10.1 dev tap_vpntap
    • 192.168.20.0/24 via 192.168.10.1 dev tap_vpntap

改めて、SoftEther VPN Managerで接続して、以下の設定を施す。

  • 仮想HUB「BRIDGE」
    • カスケード接続:仮想HUB「HYBRID」
      • 状態:オンライン

以上で設定は完了。

まとめ

f:id:kWatanabe:20200926004223g:plain
本記事の手順完了時点の状況

  • 本記事の手順を実施した時点で上記の環境が構築できている
  • IaaS レベルのハイブリッドクラウドであれば、これで構築完了
  • 各拠点間の端末から ping を送りあうと疎通ができるはず
  • 次回は各拠点に PaaS をデプロイして、疎通できるようにする

次回に続く kwatanabe.hatenablog.jp

*1:会社の勉強会だけど、作業は資料作成のふくめて4連休のオフの時間にしたし、機材も自費でクラウドを契約したので会社のカネは1円も使ってない。趣味でやったことを会社の勉強会で喋っただけ。