-
Notifications
You must be signed in to change notification settings - Fork 1.7k
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
core: bind to localhost rather than all interfaces #2589
Conversation
Summary: Prior to this change, TensorBoard would default to serving on the entire local network; now, TensorBoard serves to the local machine only, and the flag `--host='*'` can be used to dual-bind to IPv4 and IPv6 on the entire local network (the previous default). See #2387 and comments therein for details. Test Plan: On my Debian machine, running with `strace -e trace=%network`, and testing connection with `curl -4 localhost:6006/data/logdir` (or `-6`): - running with no `--host` flag, or `--host=localhost`: - can connect to loopback on IPv4 only - cannot connect over LAN - `strace` shows binding on `AF_INET` - running with `--host='::1'`: - can connect to loopback on IPv6 only - cannot connect over LAN - `strace` shows binding on `AF_INET6` - running with `--host=0.0.0.0`: - can connect to loopback on IPv4 only - **can** connect over LAN - `strace` shows binding on `AF_INET` - running with `--host='*'`: - can connect on both IPv4 and IPv6 - **can** connect over LAN - `strace` shows binding on `AF_INET6` with an additional syscall to `setsockopt(3, SOL_IPV6, IPV6_V6ONLY, [0], 4)` to facilitate the dual-binding, which is not present in any other tested case wchargin-branch: localhost-only
I’ve attempted to implement this to the spec in #2387. I’ve read through |
From offline discussion: we don’t much like that the We chose “ We propose instead the following:
This way, the stock answer to user questions of the form “why can’t my |
So... after mulling this over, the flag Would using Also, I think we probably want to special-case |
Okay, I’ll hold off for now. A few quick notes:
It doesn’t have to be the entire hostname; with current TensorBoard,
(where my Not to say that we can’t bite the bullet and do that anyway.
Yes; I ran into this while writing $ tensorboard --logdir /tmp/x1 --port 6006 --host 127.0.0.1
TensorBoard 1.15.0a20190822 at http://127.0.0.1:6006/ (Press CTRL+C to quit)
^Z
[1]+ Stopped tensorboard --logdir /tmp/x1 --port 6006 --host 127.0.0.1
$ tensorboard --logdir /tmp/x2 --port 6006 --host ::1
TensorBoard 1.15.0a20190822 at http://[::1]:6006/ (Press CTRL+C to quit)
^Z
[2]+ Stopped tensorboard --logdir /tmp/x2 --port 6006 --host ::1
$ bg %1 %2
[1]- tensorboard --logdir /tmp/x1 --port 6006 --host 127.0.0.1 &
[2]+ tensorboard --logdir /tmp/x2 --port 6006 --host ::1 &
$ curl -4 localhost:6006/data/logdir; printf '\n'
{"logdir": "/tmp/x1"}
$ curl -6 localhost:6006/data/logdir; printf '\n'
{"logdir": "/tmp/x2"} When given an IPv4 loopback address (possibly including |
FWIW, |
Okay, what about the following path forward:
Edited to add: oh and yeah, I expected that dual-binding would work for |
wchargin-branch: localhost-only wchargin-source: c05af50a7db71f2ab0b762f05f02ddf24ab76103
wchargin-branch: localhost-only wchargin-source: c05af50a7db71f2ab0b762f05f02ddf24ab76103
That plan sounds good to me. Done; PTAL. |
wchargin-branch: localhost-only wchargin-source: f3749cf614b1530c0031a2380c63dc3a629206ba
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.
elif host is None: | ||
host = 'localhost' | ||
|
||
self._host = host |
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.
Is self._host
actually used anywhere? Later down you read self.host
, which is the property set by werkzeug:
https://github.com/pallets/werkzeug/blob/bd60d52ba14f32a38caffc674fb17c9090ef70ce/src/werkzeug/serving.py#L728
Not sure if those are intentionally different or a typo.
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.
Good catch; this was an oversight. I’ll conservatively use self._host
.
wchargin-branch: localhost-only wchargin-source: 3fbdc41b7ce84cf605953a9cc3f5252380d88d13
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.
Updated the docs and the _host
. Thanks!
elif host is None: | ||
host = 'localhost' | ||
|
||
self._host = host |
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.
Good catch; this was an oversight. I’ll conservatively use self._host
.
Summary: These tests are currently broken on IPv6-only systems. While it’s valid to open a _socket_ that binds to `("localhost", 0)` even if the system only supports IPv6, it’s not valid to start a _Werkzeug server_ with host `localhost`, because Werkzeug detects `localhost` as an IPv4 address and will open an `AF_INET` socket, causing catastrophe. This restores the test behavior prior to #2589, which IMHO isn’t great, but unbreaks these tests on IPv6-only systems. Test Plan: This test still works on my dual-IPv4/IPv6 machine, and now also works on an IPv6-only machine where previously it failed with `EAFNOSUPPORT`. wchargin-branch: program-test-bind-all
Summary: These tests are currently broken on IPv6-only systems. While it’s valid to open a _socket_ that binds to `("localhost", 0)` even if the system only supports IPv6, it’s not valid to start a _Werkzeug server_ with host `localhost`, because Werkzeug detects `localhost` as an IPv4 address and will open an `AF_INET` socket, causing catastrophe. This restores the test behavior prior to #2589, which IMHO isn’t great, but unbreaks these tests on IPv6-only systems. Test Plan: This test still works on my dual-IPv4/IPv6 machine, and now also works on an IPv6-only machine where previously it failed with `EAFNOSUPPORT`. wchargin-branch: program-test-bind-all
Summary:
Prior to this change, TensorBoard would default to serving on the entire
local network; now, TensorBoard serves to the local machine only, and
the flag
--bind_all
can be used to dual-bind to IPv4 and IPv6 on theentire local network (the previous default). See #2387 and comments
therein for details.
Test Plan:
On my Debian machine, running with
strace -e trace=%network
:--host
flag:strace
shows binding onAF_INET
--bind_all
is printed to stderr--host=localhost
:--host
flag, but no notice is printed--host='::1'
:strace
shows binding onAF_INET6
--host=0.0.0.0
:strace
shows binding onAF_INET
--host='::0'
:strace
shows binding onAF_INET6
--bind_all
:strace
shows binding onAF_INET6
with an additional syscallto
setsockopt(3, SOL_IPV6, IPV6_V6ONLY, [0], 4)
to facilitatethe dual-binding, which is not present in any other tested case
In all cases, the printed serving URL (“TensorBoard x.y.z running at…”)
bears the exact
--host
flag, or my full hostname if--bind_all
wasgiven, or
localhost
if neither was given. In all cases, the URL is aclickable link in my
gnome-terminal
.Note that on my system dual binding to
::0
works without an explicitsyscall—i.e.,
IPV6_V6ONLY
defaults to0
—but this is not portable.Connection testing was performed via
in all cases.
wchargin-branch: localhost-only