質問: 特定のip:portでwebサーバーを起動するためにsudoが必要なのはなぜですか? debianボックスにpythonベースのwebサーバーをセットアップしています。セットアップ: debianosはvmベースですが、virtualboxをnatからbridgedに切り替えました。 vmセットアップ= 192.168.1.7(ルーターの管理画面またはifconfigごと)のip)。 sshとhttpの両方に対してルーターのポート転送を正常に設定しました。 dyndns.comを使用して、ルーターのダイナミックdnsを正常にセットアップしました。 使用している特定のpython webサーバー(django、cherrypy、標準ライブラリ))に関係なく、sudoを使用して192.168.1.7:80でwebサーバーを起動する必要があります。ポートにアクセスする権限がないというエラーが表示されます。ip:portを指定するときにsudoを使用する必要があることについて言及しているwebサーバーチュートリアルはありません。質問:これらのwebサーバーを起動するためにsudoを使用する必要があるのはなぜですか? 192.168.1.7を使用すべきではないことを示していますか?または、設定ファイルをどこかに正しく設定していませんか?
回答: 非特権ユーザーが特権ポート(1024未満のポート番号)にバインドできないのは標準的な動作です。したがって、たとえばポート80にバインドするアプリケーションは、このポートにバインドするために特権を実行する必要があります(通常、これはrootとして実行することを意味します)。一般的なアプローチは、特権ユーザーを使用して小さな「リスナー」プロセスを実行し、接続を受け入れてから、非特権プロセスを生成して要求を処理することです。リクエスト処理の権限の削除は、セキュリティ上の理由から行われます。誰かがリクエストを処理するプロセスを悪用できる場合、通常、侵入者は処理プロセスと同じ権限を使用してコマンドを実行できます。したがって、特権プロセスを使用して要求全体を処理するのは良くありません。ただし、多くのアプリケーションでは、最近では非rootとして実行するのが一般的です。しかし、そのようなプロセスはもちろん、標準構成では特権ポートにバインドできません。そのため、tomcatやjbossなどのサーバーは、代わりに8080などのハイポートにバインドしていたため、特権リスナーは必要ありません。もちろん、このようなプロセスをインターネットに公開すると、httpプロトコルが使用されているときに各ブラウザが最初にポート80に接続しようとするため、ポート80でアクセスを提供する可能性があります。これを提供するための一般的な回避策は、アプリケーションとパブリックインターネットの間にファイアウォールまたはポートトランスレータを使用することです。したがって、要求はポート80を要求するファイアウォールにヒットしますが、ファイアウォールは要求をポート8080の内部ホストに転送します。このようにして、実際のwebサーバーはポート80で公開されている間、ハイポートで動作できます。- (internet request) ----> (port 80)[firewall] ------> (port 8080)[webserver] このリダイレクトは、iptables natルール:iptables -a prerouting -t nat -i eth0 -p tcp --dport 80 -j redirect --to-port 8080 これにより、ポート8080へのすべての着信要求がポート8080にリダイレクトされるだけで、ポート8080でリッスンしている非特権アプリケーションを実行できます。ただし、最新のlinuxカーネルを使用すると、別の可能性があります。機能を使用する。setcap cap_net_bind_service=+ep /some/webserver/binary これにより、root以外のユーザーから起動した場合でも、binaryが特権ポートにバインドできるようになります。見る man capabilities 詳細については。