Linux(それが重要な場合はCentOS)で、通常のユーザーが1024未満のポートを使用できるようにする方法はありますか? (オープンリスニングTCPそのポートのソケット)
現在、rootのみがこれらのポートを使用する権限を持っていることを理解しています。
CentOS 3/4/5にはない(ファイルシステム機能の欠如):
このポートを開く必要があるプログラムにCAP_NET_BIND_SERVICE機能を設定できます。ルートは実行可能ファイルに機能を設定し、その後、すべてのユーザーがその実行可能ファイルを実行でき、1024未満のポートを使用できるようになります。
実行可能ファイルに機能を設定するには:
setcap cap_net_bind_service=+ep /path/to/program
SUIDを実行し、ポートを開いた後に特権を削除するラッパーを作成できます。
IIRCこれは不可能です。そうである場合は、セキュリティ上の理由からお勧めしません。
ただし、ユーザーが特定のポートでリッスンできるようにする場合は、いつでもTCP rinetd
などのフォワーダーまたはiptablesルールを使用して、そのポートへの接続をユーザーが可能なポートにリダイレクトできます。リッスンし、その上位ポートでリッスンするようにサービスを設定してもらいます。
たとえば、行
aa.bb.cc.dd 80 127.0.0.1 8000
rinetdの構成では、アドレスaa.bb.cc.dd
のポート80への接続を、特権のないユーザーがリッスンできるローカルホストポート8000に転送します。同等のiptablesルールは次のようになります
/sbin/iptables -t nat -A PREROUTING -p tcp -d aa.bb.cc.dd --dport 80 -j DNAT --to 127.0.0.1:8000
どちらの方法でも、ユーザーに任意のポートでリッスンさせるよりも、はるかにきめ細かい制御が可能です。
Iptablesアプローチには、リスニングアプリケーションが呼び出し元クライアントのIPアドレスを認識するという利点があります(rinetdメソッドを使用すると、すべての接続がローカルホストからのものであると見なされます)。 iptablesメソッドでは、TCPだけでなくUDPも使用できます。
authbind 岩。
機能は素晴らしいものですが、特定のカーネルバージョンを適切に構成する必要があります。 Sun Javaなどの一部のプログラムは、機能を備えていません。 authbindはすべてのLinuxバージョンで機能します。
ただし、authbindはIPv4のみをサポートします。