LXDのproxyを使ってポートフォワーディング
はじめに
LXDのコンテナでnginxを動かして、ホストからChromeなどのブラウザでアクセスしたいことがよくあります。
LXDのイシューを見るとiptablesで実現可能とのことなのですが、iptablesとネットワークに弱い私がコマンド例を見て雰囲気で実行してもうまくできず、回避策としてホストでnginxを動かしてリバースプロキシでLXDコンテナのnginxに繋いで使っていました。
しかし、これはhttpなら良いのですがhttpsの場合はホストでSSLを終端することになるのがいまいちです。
検索してみるとLXD 3.0からproxyという種別のデバイスが追加されており (Linux Containers - LXD - ニュース 参照) 、これを使えばポートフォワーディングできるようになっていました。
公式ドキュメントは Type: proxy にあります。
snapでインストールしたLXD 3.2で試してみたのでメモです。
プロキシーの追加
例えば 192.0.2.2 というIPv4アドレスを持つ c1 というコンテナにホストの80番と443番ポートをそれぞれコンテナの80番と443番ポートにフォワーディングする場合は以下のようにします。以下で指定しているhttpとhttpsは追加するプロキシーデバイスの名前です。お好みで変えてください。
lxc config device add c1 http proxy listen=tcp:0.0.0.0:80 connect=tcp:10.138.67.13:80 bind=host
lxc config device add c1 https proxy listen=tcp:0.0.0.0:443 connect=tcp:10.138.67.13:443 bind=host
状態確認
以下のコマンドでc1というコンテナのデバイス一覧を表示します。
lxc config device show c1
実行例を示します。
$ lxc config device show c1
http:
bind: host
connect: tcp:192.0.2.2:80
listen: tcp:0.0.0.0:80
type: proxy
https:
bind: host
connect: tcp:192.0.2.2:443
listen: tcp:0.0.0.0:443
type: proxy
プロキシーの削除
例えば コンテナ c1 から http と https という名前のプロキシーデバイスを削除する場合は以下のようにします。
lxc config device rm c1 http https
実行例を示します。
$ lxc config device rm c1 http https
Device http, https removed from c1
デバイスがない状態で一覧表示するとJSONの空オブジェクトが表示されました。
$ lxc config device show bionic
{}