ポート 80 を c のソケットにバインドしようとすると、このポートを使用する権限がないというエラーが常に表示されます。この許可を取得する簡単な方法はありますか?
9 に答える
通常、スーパーユーザー (root) のみが「特権」ポート (つまり、1024 未満のポート番号) にバインドできます。
これは、プログラムを root として実行するか、実行可能ファイルを「suid root」にする必要があることを意味します。
これらは両方ともセキュリティに影響を与えるため、bind 呼び出しが行われた後に suid アプローチを使用し、スーパーユーザー権限を放棄することを検討することをお勧めします。
このチュートリアルは、C/C++ を使用したネットワーク プログラミングに非常に役立ちます。
ところで、ANSI Cにはネットワークにアクセスする方法がありません。winsock
この機能を提供するのは、OS が提供するライブラリ (BSD ソケット API、Windows にも移植されている) です。
ポート 1024 以下はPrivileged Portsと呼ばれ、これらのポートにバインドするには昇格された権限が必要です。
1024 を超えるポートはEmphemeral Portsと呼ばれます。これらへのバインドには、特別な権限は必要ありません。
特権ポートにアクセスする最も簡単な方法は、root ユーザーになることです。
root ではない共有システム (大学のコンピューターなど) を使用している場合、設計上、その許可を取得する「簡単な」方法はありません。
@Charles Bailey が述べているとおりです...これが、URL のポート指定によって 8080 で http サーバーのアドレスをhttp://some.url :8080 /として表示していた理由であることを付け加えたいと思います。
S.Lott の回答は非常に否定的な反応を引き起こしたかもしれませんが、彼の考えは愚かではありません: 元の質問が実際のプログラム (学校の課題ではない) に対するものである場合、HTTP サーバーの背後でアプリケーションとして開発することは、多くの場合合理的な選択です。そうすれば、多くの低レベルの詳細を、よくデバッグされた優れたプログラムである Apache に任せることができます。
アプリケーションは CGI である必要はなく、Apache モジュールでもかまいません。バージョン 2 以降の Apache は、もはや単なる HTTP サーバーではありません。現在は、ネットワーク プログラムを開発するためのプラットフォームです。元の質問に対する正しい答えは、Apache モジュールを作成することです ( Apache のドキュメントを参照してください) 。
従来、1024 未満のポートにソケットをバインドできるのは root だけでした。
通常のプログラムは、「特権」ポート (1024 未満のポート) をバインドできません。これは、UNIX ライクなオペレーティング システムのほとんどが廃止されたセキュリティ機能です。
スーパーユーザーとして実行することは、ここで他の多くの人が提案していますが、この問題に対する悪い解決策です。Debian または Ubuntu システムで実行している場合は、authbindパッケージをインストールすることをお勧めします。これにより、プログラムに他の特別なアクセス許可を実際に与えることなく、特権ポートを開く許可をプログラムに与えることができます。
他のシステムで実行している場合は、debian または ubuntu をインストールすることをお勧めします ;-)。
はい、ポート 80 に簡単にバインドできます。Apache を使用してください。Web アプリケーションを作成します。Apache はポート 80 にバインドし、Web アプリケーションを実行します。
次の Apache を書こうとしていますか? その場合は、オペレーティング システムのsetuid API 呼び出しについて学習する必要があります。
新しいバージョンの Apache を作成していない場合、ほとんどの人は非特権ポートを使用します。8000 が人気で、8080 も人気です。