-
-
Notifications
You must be signed in to change notification settings - Fork 45
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add --bind to specify serving address with relaxed default (0.0.0.0) #475
Conversation
@@ -304,7 +304,7 @@ public actor Server { | |||
} | |||
// Enable SO_REUSEADDR for the accepted Channels | |||
.childChannelOption(ChannelOptions.socketOption(.so_reuseaddr), value: 1) | |||
.bind(host: configuration.host, port: configuration.port) | |||
.bind(host: "0.0.0.0", port: configuration.port) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you just change the default value of --host
option to keep the address still configurable? It's important to be able to make it restrictive by the option.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
--host
で 0.0.0.0
を指定することはできません。
この設定は接続用のURLを作るために使われるので、
http://0.0.0.0:8080
でブラウザを開こうとしてしまいます。
0.0.0.0
は待ち受け用のワイルドカードであって、
接続先のアドレスとして使うことはできません。
Chromeはそのような実装に配慮して 127.0.0.1 に読み替えて接続してくれますが、
別のサイトとみなされるので別の問題が生じます。
Safariは無効なアドレスとみなして接続エラーになります。
オプションとして設定可能にする場合、
外部から接続するためのアドレス (--host
) とは別のパラメータとして
新たに用意する必要があると思います。
例えば --listen
などでしょうか。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
会話した
https://discord.com/channels/291054398077927425/383442648012423179/1245364906434363513
以下の方針とする
- WebDriver を使って Docker内部 などから NAT 超えをする状況もサポートしたい (Swift 6 が mac でぶっ壊れていたりするためニーズがある)
--listen
を導入、デフォルトは0.0.0.0
--host
指定なし、--listen
指定ありの場合、--host
デフォルト値を--listen
から導出したい。127では接続できないことがわかっているため。
self.port = port | ||
self.host = host | ||
self.customIndexPath = customIndexPath | ||
self.resourcesPaths = resourcesPaths | ||
self.entrypoint = entrypoint | ||
self.terminal = terminal | ||
} | ||
|
||
public static func host(listen: String, host: String?) -> String { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hostとlistenからhostを決定するロジックをここに定義します。
devコマンドとtestコマンドから共通で利用しています。
@kateinoigakukun |
|
@kateinoigakukun ショートオプションの しかし、
|
|
ロングオプションも合わせて |
Thanks! |
現状
dev server は
--host
で指定したアドレスで待ち受けします。課題
指定しない場合
仮に
--host
がデフォルトの 127.0.0.1 の場合、同一ホスト上から
http://127.0.0.1:8080
へのアクセスでなければ接続できません。ホストのLAN IPが 192.168.1.2 だったとして、
http://192.168.1.2:8080
では接続できません。また、同一LAN の他のマシンやスマートフォンからも接続できません。
ウェブアプリ開発ではスマホを対象にしたりするのでこれは不便です。
指定する場合
--host
で 192.168.1.2 を指定すれば、それで接続できますが、この場合は同一ホストであっても
127.0.0.1
から接続できません。状況に応じて使い分ける必要があり、面倒です。
また、Docker内部で起動する場合、
コンテナのネットワークアドレスが必要ですが、
これを把握するのは多少面倒です。
提案
こういった状況のために、ソケットインターフェースには待ち受けアドレスとして
0.0.0.0
が指定できます。これはそのホストのあらゆるアドレスからの接続を受け入れる特別な設定です。
これで起動すれば、接続元に応じたホストのアドレスを指定するだけで良いので簡単です。
知る限りでは、
npx serve
コマンドやnc
コマンド、 vitejs の devサーバ なども、デフォルトではこのモードで待ち受けおり、一般的です。
そこで、新たに
--bind
オプションを導入し、待ち受けアドレスを指定できるようにしつつ、そのデフォルト値として
0.0.0.0
を指定します。--host
オプションのデフォルト値は127.0.0.1
を使うのをやめて、--bind
オプションの値を使うようにします。ただし、
0.0.0.0
は接続先アドレスとして不正です。例えばSafariではこれはエラーとなり接続できません。
そこで、
--bind
オプションが0.0.0.0
の場合は、--host
オプションの値は127.0.0.1
にします。この書き換えは、Chromeのアドレスバーに
0.0.0.0
を指定した時と同じ挙動です。--host
の用途--host
を指定する機能はこれまで通り必要です。立ち上がったサーバに接続するためのURLを構築するために使われているからです。
セキュリティ
待ち受けアドレスを限定するのはセキュリティを高める効果があります。
意図しない外部からの接続を遮断できるからです。
例えば postgresql などは初期状態でそのように設定されています。
この変更はそれを低下させます。
しかし、 dev server はデーモンとして常駐させるような使い方よりも、
明示的に CLI から起動し、フロントエンドジョブとしてユーザが運用するものなので、
影響は小さいです。