びぼうろぐ

ネ申エクセルからの卒業

【CentOS8】Podmanでポートバインド時にエラーになる

Podmanで実行するコンテナのポートをホストのウェルノウンポートにバインドしようとするとエラーになりました。

実行環境の情報

$ cat /etc/centos-release
CentOS Linux release 8.2.2004 (Core)

$ uname -r
4.18.0-193.14.2.el8_2.x86_64

$ podman -v
podman version 1.6.4

実行したコマンドと遭遇したエラー

$ podman pull nginx
$ podman run -it -p 80:80/tcp nginx
Error: error from slirp4netns while setting up port redirection: map[desc:bad request: add_hostfwd: slirp_add_hostfwd failed]

バインドするポートを8080に変更すると、無事にコンテナが起動できることを確認しました。つまり...?🤔

原因と対処

以下にエラーの原因と対処方法が書いてありました。

github.com

Shortcomings of Rootless Podman
Podman can not create containers that bind to ports < 1024.
- The kernel does not allow processes without CAP_NET_BIND_SERVICE to bind to low ports.
- You can modify the net.ipv4.ip_unprivileged_port_start sysctl to change the lowest port.

非rootユーザだとホストのウェルノウンポート(1024未満のポート)にバインドできないとのことです。
Podmanの仕様というより、カーネルの仕様みたいですね。

どうしてもウェルノウンポートにバインドしたいなら、rootユーザでコマンドを実行するか、カーネルのパラメータをいじる必要があるとのこと。

カーネルのパラメータをいじってみる

せっかくなので、カーネルパラメータをいじればコンテナが動くことを確認してみます。

# 現状確認
$ sysctl -n net.ipv4.ip_unprivileged_port_start
1024

# 80にバインド可能にする
$ sudo sysctl -w net.ipv4.ip_unprivileged_port_start=80

$ podman run -it -p 80:80/tcp nginx
...
/docker-entrypoint.sh: Configuration complete; ready for start up

コンテナが動きました!
しかしセキュリティのためにRootlessでコンテナ起動させてるので、、、ウェルノウンポートにはバインドしないほうがいいんですかね?🤔