authbind - 特権ポートをバインドする

目次

特権ポートをバインドする

SSH Configの書き方では、次のようなローカルフォワードの設定を紹介した。 これはリモートの80番ポートをローカルの8080番ポートに転送してバインドする設定である。

Host my-con-name
    HostName xx.xx.xx.xx
    Port 22
    User my-user-name
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    LocalForward 8080 yy.yy.yy.yy:80

8080番ポートは代替HTTPポートとしてよく使われるので、これはこれで良いのだが、場合によっては80番ポート(HTTP)に直接バインドしたくなるかもしれない。

しかし、

    LocalForward 80 yy.yy.yy.yy:80

と書いてもうまく行かない。

次のようなエラーが出るはずである。

bind [127.0.0.1]:80: Permission denied
channel_setup_fwd_listener_tcpip: cannot listen to port: 80

なぜこのようになるかというと、0番から1023番までのポートは 特権ポート(privileged ports) と呼ばれており、 一般ユーザーはバインドする権限を持たず、root権限でのみこのポートをバインドすることができる、という制約があるからである。

この0番から1023番までのポートは システムポート(system ports) と呼ばれ、かつてはウェルノウンポート(well known ports)とも呼ばれていた。 この範囲はIANAが標準的なサービス用に定めているため、OSが制限をかけているわけである。

sudo ssh my-con-name

とすれば良いかと思うかもしれないが、こうするとユーザーのSSH Configを読んでくれなくなるので、イマイチうまく行かない。

authbindというツールを使用すれば、かんたんに回避が可能である。

sudo apt install authbind

とインストールして、たとえば次のようにして80番ポートをバインドする権限を現在のユーザーに開放する。

# 80番ポートを特定ユーザーに開放
sudo touch /etc/authbind/byport/80
sudo chown $USER /etc/authbind/byport/80
sudo chmod 500 /etc/authbind/byport/80

そして、

authbind ssh my-con-name

としてやれば、アラ不思議、特権ポートをユーザー権限でバインドできる。