-
Notifications
You must be signed in to change notification settings - Fork 928
chore(docs): add requirements re ports and stun server to docs #12026
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
Changes from 5 commits
aff688e
efb639a
4e95495
c187875
fb8a887
9abe9eb
05dcbad
90405b4
9d9759b
ad2d953
7d2b50f
bd81137
56929f7
39c5867
e3a6865
4b4d246
9726796
6ac84d2
9cad8e7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,6 +13,83 @@ user <-> workspace connections are end-to-end encrypted. | |
|
||
[Tailscale's open source](https://tailscale.com) backs our networking logic. | ||
|
||
## Requirements | ||
|
||
In order for clients and workspaces to be able to connect: | ||
|
||
- All clients and agents must be able to establish a connection to the Coder | ||
server (`CODER_ACCESS_URL`) over HTTP/HTTPS. | ||
- Any reverse proxy or ingress between the Coder control plane and clients must | ||
support WebSockets. | ||
|
||
In order for clients to be able to establish direct connections: | ||
|
||
> **Note:** Direct connections via the web browser are not supported. To improve | ||
> latency for browser-based applications running inside Coder workspaces, | ||
johnstcn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
> consider deploying one or more | ||
> [workspace proxies](../admin/workspace-proxies.md). | ||
|
||
- The client is connecting using the CLI (e.g. `coder ssh` or | ||
`coder port-forward`). | ||
johnstcn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- The client and workspace agent are both able to connect to | ||
[a specific STUN server](#stun-in-a-natshell). | ||
johnstcn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- All outbound UDP traffic must be allowed for both the client and the agent on | ||
**all ports** to each others' respective networks. | ||
- To establish a direct connection, both agent and client use STUN. This | ||
involves sending UDP packets outbound on `udp/3478` to the configured | ||
[STUN server](../cli/server.md#--derp-server-stun-addresses). If either the | ||
agent or the client are unable to send and receive UDP packets to a STUN | ||
server, then direct connections will not be possible. | ||
- Both agents and clients will then establish a | ||
[WireGuard](https://www.wireguard.com/)️ tunnel and send UDP traffic on | ||
ephemeral (high) ports. If a firewall between the client and the agent | ||
blocks this UDP traffic, direct connections will not be possible. | ||
|
||
### STUN in a NATshell | ||
|
||
> [Session Traversal Utilities for NAT (STUN)](https://www.rfc-editor.org/rfc/rfc8489.html) | ||
> is a protocol used to assist applications in establishing peer-to-peer | ||
> communications across Network Address Translations (NATs) or firewalls. | ||
> | ||
> [Network Address Translation (NAT)](https://en.wikipedia.org/wiki/Network_address_translation) | ||
> is commonly used in private networks to allow multiple devices to share a | ||
> single public IP address. The vast majority of ISPs today use at least one | ||
> level of NAT. | ||
|
||
Normally, both Coder agent and client will be running in different _private_ | ||
networks (e.g. `192.168.1.0/24`). In order for them to communicate with each | ||
other, they will each need their counterpart's public IP address and port. | ||
johnstcn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Inside of that network, packets from the agent or client will show up as having | ||
source address `192.168.1.X:12345`. However, outside of this private network, | ||
the source address will show up differently (for example, `12.3.4.56:54321`). In | ||
order for the Coder client and agent to establish a direct connection with each | ||
other, one of them needs to know the `ip:port` pair under which their | ||
counterpart can be reached. | ||
|
||
In order to accomplish this, both client and agent can use a STUN server: | ||
|
||
> The below glosses over a lot of the complexity of traversing NATs. For a more | ||
> in-depth technical explanation, see | ||
> [How NAT traversal works (tailscale.com)](https://tailscale.com/blog/how-nat-traversal-works). | ||
|
||
- **Discovery:** Both the client and agent will send UDP traffic to a configured | ||
STUN server. This STUN server is generally located on the public internet, and | ||
responds with the public IP address and port from which the request came. | ||
- **Port Mapping:** The client and agent then exchange this information through | ||
the Coder server. They will then construct packets that should be able to | ||
successfully traverse their counterpart's NATs successfully. | ||
- **NAT Traversal:** The client and agent then send these crafted packets to | ||
their counterpart's public addresses. If all goes well, the NATs on the other | ||
end should route these packets to the correct internal address. | ||
- **Connection:** Once the packets reach the other side, they send a response | ||
back to the source `ip:port` from the packet. Again, the NATs should recognize | ||
these responses as belonging to an ongoing communication, and forward them | ||
accordingly. | ||
|
||
At this point, both the client and agent should be able to send traffic directly | ||
to each other. | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There should probably be some details about NATs and stuff but I really don't know what to write without getting super technical :/ There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Honestly I'd prefer to just link to Tailscale's docs on this. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. IDK how well Tailscale's docs cut it, this one doesn't really explain much about NAT just about firewalls. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I link to https://tailscale.com/blog/how-nat-traversal-works a bit above in the STUN section. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is a good blog post but it's not very good documentation since it's 9000 words long. We should probably dumb it down There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. OK, I added a fairly high-level overview. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've Slack'd you some diagrams. If we're going to explain it, then those are my suggested examples. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added and moved to a separate page as this one is getting plenty big already. |
||
## coder server | ||
|
||
Workspaces connect to the coder server via the server's external address, set | ||
|
Uh oh!
There was an error while loading. Please reload this page.