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
としてやれば、アラ不思議、特権ポートをユーザー権限でバインドできる。