tabimoba.net

とあるエンジニアの雑記帳

LXDコンテナからコンテナ外へポートフォワーディング

方法1:LXDのProxyを使う (LXD >= 3.0)

Ubuntu 18.04 LTSの場合、デフォルトでLXD3.0がインストールされますので、こちらの方法が簡単でおすすめです。

追加

$ lxc config device add <コンテナ名> <デバイス名> proxy listen=tcp:0.0.0.0:<ポート番号> connect=tcp:127.0.0.1:<ポート番号> bind=host
  • <デバイス名> は、識別するためのラベルのようなもので、任意の名称を指定することが出来ます。
  • listen=tcp:0.0.0.0:<ポート番号> は、転送先(ホスト)に関する設定です。0.0.0.0の場合、全てのNICに割り当てられたIPアドレスが転送先(待ち受けIPアドレス)となります。特定のIPアドレスを指定した場合、指定されたIPアドレスが転送先となります。
  • connect=tcp:127.0.0.1:<ポート番号> は、転送元(コンテナ)に関する設定です。127.0.0.1の場合、コンテナのlocalhostが転送元となります。127.0.0.1以外の場合、指定されたIPアドレスが転送先となります。
  • bind=host の場合、コンテナが転送元、ホストが転送先となります。

削除

$ lxc config remove <コンテナ名> <デバイス名>

参考

方法2:iptablesを使う

# iptables -t nat -A PREROUTING -d <ホストのNICのIPアドレス/32> -p tcp -m tcp --dport <転送先ポート番号> -j DNAT --to-destination <コンテナのIPアドレス:ポート番号>
  • 転送元となるコンテナのIPアドレスは、lxc listコマンド等で事前に確認します。
  • ホストに割り当てられたIPアドレスが複数存在する場合、転送先としたいNICのIPアドレス(あるいはエイリアスのIPアドレス)を指定します。
  • iptablesの設定を永続化させたい場合は、service iptables save/sbin/iptables-save, netfilter-persistent saveなど(コマンドはディストリビューションにより異なります)を実行し、設定を保存します。

方法3:HAProxyを使う

# globalとdefaultsは省略します。

frontend forward_service
  bind *:<転送先ポート>
  mode tcp
  default_backend forward_server

backend forward_server
  server forwardsv01 <コンテナのIPアドレス:ポート番号> check
  • bind *:<転送先ポート>*は、ホストに割り当てられた全てのIPアドレスが転送先(待ち受け先)ポートとなります。特定のIPアドレスを転送先とする場合は、*を転送先とするIPアドレスに変更します。
  • サービスのコネクションが頻繁に切断される場合は、転送するサービスに応じて、timeout connect timeout server timeout clientなどのパラメータを設定します。