【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
に変更すると、無事にコンテナが起動できることを確認しました。つまり...?🤔
原因と対処
以下にエラーの原因と対処方法が書いてありました。
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でコンテナ起動させてるので、、、ウェルノウンポートにはバインドしないほうがいいんですかね?🤔