方法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 <コンテナ名> <デバイス名>
参考
- LXDのproxyを使ってポートフォワーディング
- https://hnakamur.github.io/blog/content/post/2018/07/05/port-forwarding-using-lxd-proxy/
- Container configuration Type: proxy
- https://lxd.readthedocs.io/en/latest/containers/#type-proxy
方法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
などのパラメータを設定します。