非ルートプロセスがポート80にバインドできるようにポート80を開くにはどうすればよいですか?


46

MacでWebサーバーを非ルートプロセスとして実行したい。通常、ルートプロセスのみがポート80(または1024未満のポート)にバインドできます。

ルート80以外のプロセスがリッスンできるように、特にポート80を開くことはできますか?



unix.stackexchange.comの質問のようなものですね。
フィリップバルトゥジ

1
macosシステム上にある場合、なぜunixですか?
nhed

回答:


28

これは設計上困難です。また、マシンへのルートアクセスがない限り、変更をセットアップするためにルートが必要になるため、次のいずれも機能しません。ただし、一度変更すると、ユーザースペースプログラムはルートなしでアクセスできます。

これを達成するための2つの一般的な方法があり、選択する方法は、制限を回避しようとしている理由によって異なります。

ポート80を8080などの別のポートにポイントします

ポート80のすべてのトラフィックをポート8080または任意のポートに渡すようにマシンを再構成することにより、ユーザー空間サーバーがアクセスを許可されたエリアでルート特権ポートを受信できるようにすることができます。

プロセスは簡単です:

手順1:現在のファイアウォールルールを表示します。

sudo ipfw show

ステップ2:ポート転送ルールを追加する(80から8080)

sudo ipfw add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in

ファイアウォールルールを削除するには、次を実行します。

sudo ipfw flush

ソース

これは一時的な変更であり、再起動すると元に戻ります。または、最後の行に示されているようにフラッシュします。

あなたはできるの変更を永続的に、またはあなたはおそらく、セキュリティの観点から、より安全である前に、あなたのサーバを起動すると、スタートアップライン、などのコマンドを追加することができます。

Authbindを使用する

Authbindは、1つのプログラムが完全なルートアクセスを許可せずに、より低いレベルのポートにアクセスできるように特別に設計されました。

MacOSXポートがあります:

https://github.com/Castaglia/MacOSX-authbind

ただし、まだIPv4トラフィックに制限されている可能性があるため、追加の調査を行って、ニーズに合っているかどうかを確認する必要があります。


LOVE MacOSX-authbind ...たとえば、ポート80でWebサーバーを「通常の管理者」として実行できます。すなわちlaunchd .plist... ` "ProgramArguments": [ "path/to/authbind", "/usr/bin/php", "-c", "/www/.router.ini", "-S", "0.0.0.0:80", "-t", "/www", "/www/.router.php"]Woohoo!
アレックスグレー

13
OS X Yosemiteは削除しipfwます。この要点では、を使用した代替ソリューションについて説明しpfます。
リショニング14年

共有環境を使用している場合、非特権ポートへのトラフィックのリダイレクトは安全ではないことに注意してください。プログラムが実行する前に別のプロセスがそのポートにバインドする場合があります。または、プログラムが瞬間的にポートをバインド解除してクイックリスタートを行う場合もあります。
ライライアン

authbindは本当に素晴らしいソリューションではありません、ありがとう!
FAVO

7

を使用ncatして、他のポートで実行されているWebサーバーからのトラフィックを転送できます。

sudo ncat -l -p 80 -c ' ncat -l -p 1234'

これにより、ポート80のトラフィックがlocalhost:1234に転送されます。これはちょっと面倒ですが、簡単なテスト以外では使用せず、実稼働環境では使用しません。

これにより、ルート以外のプロセスはバインドできなくなりますが、プロセスがバインドできるポート(この例では1234)を選択すると、ポート80にバインドされているように見えます。これは、ファイアウォールを使用して、ポート80をポート1234に転送しますが、一時的です。


2
これは良い回避策です。NB。ncatは、nmapMacポート経由でインストールできますsudo port install nmap。MacPorts自体はmacports.org/install.phpからインストールできます。
ウィリアムデニス

これにより、バインド:アドレスが既に使用中のエラーが発生します。
マットジョイナー

ここでも同じ-動作しませんでした。これはトリックを行いました:unix.stackexchange.com/a/187038
セバスチャンJ.

2

sshを使用してポート転送を行うこともできます。8080で実行しているサーバーがある場合、ポート80からトラフィックを転送できます。実行中のネイティブApacheを停止してトラフィックを転送するスクリプトを次に示します。

forward8080to80.command:

echo "You may close this terminal and the forwarding will continue."
echo "To stop, kill the ssh process found by `sudo lsof -i ':80' | grep LISTEN`"
sudo apachectl stop
sudo ssh user@127.0.0.1 -L 80:127.0.0.1:8080

SSHポートフォワーディングのパフォーマンスは非常に低くなる可能性があり、ローカル環境からローカル環境ではセキュリティ機能はあまり意味がありません。osxに組み込まれているポートフォワーディング、またはncatのようなものを使用することをお勧めします。
シェイン

-3

できることは、ルーターのポート80を開いて、WebサーバーのローカルIPアドレスを指すようにすることです。次に、Macで、[システム環境設定]> [共有]設定ペインからWeb共有を有効にし、選択したディレクトリをポイントします。これは、10.6サーバーに切り替えるまで、過去に私にとってはうまくいきました。


1
私は自分の開発マシンのソリューションとしてこれを探しています。ルーターを制御できない場所で作業する必要があるため、このソリューションは機能しませんでした。サーバーをセットアップしていて、何らかの理由でルートアクセス権がない場合は機能するはずです。
アヴナー

明確にするために、異なるクライアントサイトにWebサーバーをセットアップしようとしていますが、ポート80を開くためのアクセス権がありませんか?アクセスできない場合、どのようにしてルーターのポートを開きますか?私は正しく理解していますか、それともベースから外れていますか?
マットラブ

運用サーバーではなく、自分の開発マシンでポート80を使用しようとしています。とにかくherokuにデプロイします。
アヴナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.