非ルートユーザーがポートtcp / 80でリッスンするサーバーを実行できるようにする必要があります。
これを行う方法はありますか?
答え1
setcap 'cap_net_bind_service=+ep' /path/to/program
これは特定のプロセスに適用されます。ただし、特定のユーザーが1024未満のポートにバインドできるようにするには、そのユーザーをsudoersに追加する必要があります。
確認してみてください議論するもっと学ぶ。
答え2
(これらのアプローチのいくつかは他の答えで述べられており、おおよその好みに応じていくつかの可能なオプションを提供しました。)
低いポートを高いポートにリダイレクトし、高いポートでリッスンできます。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 1080
サーバーをrootとして起動し、サーバーが特権ポートでリッスンを開始すると、権限を削除できます。直接コーディングするのではなく、タスクを実行するラッパーからサーバーを起動することをお勧めします。サーバーが接続ごとにインスタンスを起動している場合は、次の場所から始めてください。inetd
(または次のような類似プログラムxinetd
)。の場合は、inetd
次の行を使用します/etc/inetd.conf
。
http stream tcp nowait username:groupname /path/to/server/executable argv[0] argv[1]…
サーバーが単一のインスタンスをリッスンする場合は、次の場所から始めてください。authbind
。空のファイルを作成し/etc/authbind/byport/80
、サーバーを実行しているユーザーとして実行可能にするか、createを作成します。/etc/authbind/byuid/1234
ここで、1234はサーバーが実行されているUIDであり、行を含みます0.0.0.0/0:80,80
。
サーバー実行可能ファイルがその機能をサポートするファイルシステムに保存されている場合は、次のように指定できます。cap_net_bind_service
能力。これらの機能はまだ比較的新機能です。まだいくつかの質問があります。。
setcap cap_net_bind_service=ep /path/to/server/executable
答え3
サービスが systemd によって実行される場合、
- サービス構成で必要なポートを設定します。
- ユニットファイルを開き(通常)そのセクションに移動し、新しい行を追加してファイルを保存します。
/etc/systemd/system/something.service
[Service]
AmbientCapabilities=CAP_NET_BIND_SERVICE
- ファイルを再読み込みします。
systemctl daemon-reload
- (再)サービス開始:または
systemctl start something
systemctl restart something
答え4
使用できるnetcatまたはxinetdまたは、iptablesポートフォワーディングを使用するか、Apacheをフロントエンドプロキシとして使用し、権限のないポートでプロセスを実行します。