プライベートサブネット内のLinuxでオンラインパッケージアップデートする方法を考えてみた

記事タイトルとURLをコピーする

 こんにちは。福岡オフィスのtakadaです。

今回は、

「AWS上で従量制料金で利用しているRedHat Linuxのパッケージアップデートは、AWSのインターネットゲートウェイ経由でしかアップデートができない」

ということをネタに書こうと思っていましたが、

実はインターネットに抜けることができれば、オンプレミス側のネットワーク側からでもアップデートができるようになっていました。

。。。ということで、書くことがなくなってしまいました。

方針転換して、プライベートサブネット内のLinuxのオンラインパッケージアップデートのやり方について書くことにしました。

 

想定する環境

 以下のような環境を想定します。

vpc_private1

  • パブリックサブネット
    Internet Gatewayにルーティングを持ち、これを利用して、インターネット側と通信ができるサブネットです。
    このサブネットには、EIPでグローバルIPアドレスが付与されたLinuxのEC2インスタンス(Instance-public)が配置されています。
     
  • プライベートサブネット
    インターネット側との通信ができないサブネットです。
    パブリックサブネットとはルーティングが存在するため、疎通可能です。
    このサブネットには、プライベートIPアドレスのみ付与されたLinuxのEC2インスタンス(Instance-private)が配置されています。

​このような構成とき、Instance-privateのパッケージアップデートをオンラインで行うためには、どうしたらよいでしょうか?

考えられる方法

 方法として、以下の2つが考えられます。 

  • NATを利用する方法
     パブリックサブネット上に、 NATインスタンスまたはNATゲートウェイを構築し、プライベートサブネットのルートテーブルでデフォルトゲートウェイ(0.0.0.0/0)を、 NATインスタンスまたはNATゲートウェイに設定します。一旦、構築と設定を行うと、それ以降は特別な操作をすることなく、インターネット経由でパッケージアップデートができそうです。
     ただし、NATインスタンス、NATゲートウェイは課金対象となります。また、NATインスタンスは、使用しないときだけ停止しておくことで、コストが抑制できますが、NATゲートウェイは停止ができないため、常に課金が発生することになります。

     
  • プロキシサーバを利用する方法
     
    パブリックサブネット上に、EC2でプロキシサーバを構築します。Linuxですと、Squidを使ってプロキシサーバを作ることができます。構築した後に、Instance-privateのLinuxのパッケージ管理システムで、このプロキシサーバを設定します。RHEL系のyumですと、/etc/yum.confに以下のような設定を行うことで、プロキシサーバ経由でパッケージアップデートを行うことができます。(当然ですが、プロキシサーバ側で3128ポートを許可するセキュリティグループの設定が必要です。)

    proxy=http://proxyserver:3128
    
     この方法でも、プロキシサーバを別途立てた場合、その分EC2の課金が発生します。使用しないときだけ停止しておいたり、​もともと配置しているInstance-publicにsquidを構成することでコストを削減することはできそうです。

​上記2つ以外に、追加課金を発生させずパッケージアップデートを行う方法を考えてみました。

sshポートフォワーディングを使った方法

この方法は、以下の条件が揃っていることが前提となります。

  • 操作端末から、Instance-publicにssh接続が可能であること
  • Instance-publicからInstance-privateへssh接続が可能であること

 

  1. 操作端末からInstance-publicへssh接続を行いログインします。
     
  2. Instance-public上で、自分自身(Instance-public)にssh接続を行います。このとき、ダイナミックフォワーディングを有効にして接続します。下の例では、Instance-publicの1080番ポートを、リスニングポートとして有効にしています。
    ssh ec2-user@instance-public -D 1080 -i sshkeyfile.pem
    
  3. Instance-publicからInstance-privateへssh接続を行います。このとき、リモートポートフォワーディングを有効して接続を行います。下の例では、Instance-privateの2080番ポートをInstance-publicの1080番ポートに転送します。
    ssh -R 2080:localhost:1080 ec2-user@instance-private -i sshkeyfile.pem
    
  4. Instance-private上で、/etc/yum.confを編集し、以下の行を追加します。
    proxy=socks5://127.0.0.1:2080
  5. パッケージアップデートを行います。
    sudo yum update
       

実際の通信の流れは、以下のようになります。パッケージアップデートの通信は、sshのトンネルの中を流れるため、instance-publicとinstance-privateの間はsshのポートだけが使用されるので、追加でセキュリティグループを設定する必要はありません。

vpc_private2

まとめ

 sshのポートフォワーディングを使うと、NATやプロキシサーバを構築しなくても、プライベートサブネット上のEC2のパッケージアップデートを行うことができました。
最初、書くネタがなくなって、絶望の淵に立たされましたが、なんとか最後まで書き終えることができて、よかったです。人間、諦めなければ、時々は、何とかなります。(何とかなっているのだろうか)