lxc で外部にポートを公開する。
docker だと expose で手軽にできるんだけど、LXCだとiptables使えとか forwarding しろとかめんどくさいので、もっと簡単にポート転送できるものがないか調べた。
プロキシで飛ばせる
たとえば、nginx-container
があって、ホスト側のIPを内部にそのまま出すには。
lxc config device add nginx-container my-https proxy listen=tcp:192.168.12.10:443 connect=tcp:10.185.93.215:443 bind=host
lxc config device add nginx-container my-http proxy listen=tcp:192.168.12.10:80 connect=tcp:10.185.93.215:80 bind=host
簡単な図解
クライアント →Lxc ホスト 192.168.12.10:80 (転送 → Lxcゲスト 10.185.93.215:80
追加するときは
lxc config device add $LXC_CONTAINER_NAME $PROXY_DEVICE_NAME proxy \ listen=tcp:$LXC_HOST_IP:$LXC_HOST_PORT \ connect=tcp:$LXC_CONTAINER_IP:$LXC_CONTAINER_PORT bind=host
削除するときは
lxc config device remove $LXC_CONTAINER_NAME $PROXY_DEVICE_NAME
設定の確認
lxc config show nginx-container
これで設定されているプロキシ転送を確認することが出来る。もうすこし楽ちんでも良さそうなものだが。
lxc config proxy お手軽。
proxy で nginx のコンテナを作ってポート転送しておけば、LXCの内部側にいくらでもサービス用にコンテナを起動できて便利。
macvlan や bridge で共有してると、だんだんIPやポートが膨大になってきて頭がおかしくなりそうなので、nginx で一旦中継しちゃうのが便利。
nginx は、比較的なんでも転送できるので、ssh や postfix などでも転送できるでちょっとしたルーター代わりにあげておくと便利。
一点だけ問題がある。
lxc のプロキシ設定は、プロキシ先を「IP」で指定しなくちゃいけない。lxc 自体が再起動して、IPが変わると動作しなくなることがあるので注意。
IPが不意に変わることが在り、大混乱を発生させるので、まじで注意。
参考資料
https://hnakamur.github.io/blog/2018/07/05/port-forwarding-using-lxd-proxy/
2020-12-30 更新
削除する方法も併せて書いた