Skip to content

Commit 05abed3

Browse files
authored
Add comments and minor renames to peerwg (#2609)
1 parent c85a6e9 commit 05abed3

17 files changed

+334
-316
lines changed

agent/agent.go

+13-11
Original file line numberDiff line numberDiff line change
@@ -47,30 +47,30 @@ const (
4747

4848
type Options struct {
4949
EnableWireguard bool
50-
PostPublicKeys PostKeys
50+
UploadWireguardKeys UploadWireguardKeys
5151
ListenWireguardPeers ListenWireguardPeers
5252
ReconnectingPTYTimeout time.Duration
5353
EnvironmentVariables map[string]string
5454
Logger slog.Logger
5555
}
5656

5757
type Metadata struct {
58-
Addresses []netaddr.IPPrefix `json:"addresses"`
58+
WireguardAddresses []netaddr.IPPrefix `json:"addresses"`
5959
OwnerEmail string `json:"owner_email"`
6060
OwnerUsername string `json:"owner_username"`
6161
EnvironmentVariables map[string]string `json:"environment_variables"`
6262
StartupScript string `json:"startup_script"`
6363
Directory string `json:"directory"`
6464
}
6565

66-
type PublicKeys struct {
66+
type WireguardPublicKeys struct {
6767
Public key.NodePublic `json:"public"`
6868
Disco key.DiscoPublic `json:"disco"`
6969
}
7070

7171
type Dialer func(ctx context.Context, logger slog.Logger) (Metadata, *peerbroker.Listener, error)
72-
type PostKeys func(ctx context.Context, keys PublicKeys) error
73-
type ListenWireguardPeers func(ctx context.Context, logger slog.Logger) (<-chan peerwg.WireguardPeerMessage, func(), error)
72+
type UploadWireguardKeys func(ctx context.Context, keys WireguardPublicKeys) error
73+
type ListenWireguardPeers func(ctx context.Context, logger slog.Logger) (<-chan peerwg.Handshake, func(), error)
7474

7575
func New(dialer Dialer, options *Options) io.Closer {
7676
if options == nil {
@@ -88,7 +88,7 @@ func New(dialer Dialer, options *Options) io.Closer {
8888
closed: make(chan struct{}),
8989
envVars: options.EnvironmentVariables,
9090
enableWireguard: options.EnableWireguard,
91-
postKeys: options.PostPublicKeys,
91+
postKeys: options.UploadWireguardKeys,
9292
listenWireguardPeers: options.ListenWireguardPeers,
9393
}
9494
server.init(ctx)
@@ -114,8 +114,8 @@ type agent struct {
114114
sshServer *ssh.Server
115115

116116
enableWireguard bool
117-
wg *peerwg.WireguardNetwork
118-
postKeys PostKeys
117+
network *peerwg.Network
118+
postKeys UploadWireguardKeys
119119
listenWireguardPeers ListenWireguardPeers
120120
}
121121

@@ -160,9 +160,11 @@ func (a *agent) run(ctx context.Context) {
160160
}()
161161
}
162162

163-
err = a.startWireguard(ctx, metadata.Addresses)
164-
if err != nil {
165-
a.logger.Error(ctx, "start wireguard", slog.Error(err))
163+
if a.enableWireguard {
164+
err = a.startWireguard(ctx, metadata.WireguardAddresses)
165+
if err != nil {
166+
a.logger.Error(ctx, "start wireguard", slog.Error(err))
167+
}
166168
}
167169

168170
for {

agent/wireguard.go

+11-13
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,26 @@ import (
1111
)
1212

1313
func (a *agent) startWireguard(ctx context.Context, addrs []netaddr.IPPrefix) error {
14-
if a.wg != nil {
15-
_ = a.wg.Close()
16-
a.wg = nil
17-
}
18-
19-
if !a.enableWireguard {
20-
return nil
14+
if a.network != nil {
15+
_ = a.network.Close()
16+
a.network = nil
2117
}
2218

2319
// We can't create a wireguard network without these.
2420
if len(addrs) == 0 || a.listenWireguardPeers == nil || a.postKeys == nil {
2521
return xerrors.New("wireguard is enabled, but no addresses were provided or necessary functions were not provided")
2622
}
2723

28-
wg, err := peerwg.NewWireguardNetwork(ctx, a.logger.Named("wireguard"), addrs)
24+
wg, err := peerwg.New(a.logger.Named("wireguard"), addrs)
2925
if err != nil {
3026
return xerrors.Errorf("create wireguard network: %w", err)
3127
}
3228

33-
err = a.postKeys(ctx, PublicKeys{
34-
Public: wg.Private.Public(),
35-
Disco: wg.Disco,
29+
// A new keypair is generated on each agent start.
30+
// This keypair must be sent to Coder to allow for incoming connections.
31+
err = a.postKeys(ctx, WireguardPublicKeys{
32+
Public: wg.NodePrivateKey.Public(),
33+
Disco: wg.DiscoPublicKey,
3634
})
3735
if err != nil {
3836
a.logger.Warn(ctx, "post keys", slog.Error(err))
@@ -53,13 +51,13 @@ func (a *agent) startWireguard(ctx context.Context, addrs []netaddr.IPPrefix) er
5351
}
5452

5553
err := wg.AddPeer(peer)
56-
a.logger.Info(ctx, "added wireguard peer", slog.F("peer", peer.Public.ShortString()), slog.Error(err))
54+
a.logger.Info(ctx, "added wireguard peer", slog.F("peer", peer.NodePublicKey.ShortString()), slog.Error(err))
5755
}
5856

5957
listenClose()
6058
}
6159
}()
6260

63-
a.wg = wg
61+
a.network = wg
6462
return nil
6563
}

cli/agent.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ func workspaceAgent() *cobra.Command {
178178
"CODER_AGENT_TOKEN": client.SessionToken,
179179
},
180180
EnableWireguard: wireguard,
181-
PostPublicKeys: client.PostWorkspaceAgentKeys,
181+
UploadWireguardKeys: client.UploadWorkspaceAgentKeys,
182182
ListenWireguardPeers: client.WireguardPeerListener,
183183
})
184184
<-cmd.Context().Done()

cli/wireguardtunnel.go

+14-12
Original file line numberDiff line numberDiff line change
@@ -100,29 +100,29 @@ func wireguardPortForward() *cobra.Command {
100100
}
101101

102102
ipv6 := peerwg.UUIDToNetaddr(uuid.New())
103-
wgn, err := peerwg.NewWireguardNetwork(cmd.Context(),
103+
wgn, err := peerwg.New(
104104
slog.Make(sloghuman.Sink(os.Stderr)),
105105
[]netaddr.IPPrefix{netaddr.IPPrefixFrom(ipv6, 128)},
106106
)
107107
if err != nil {
108108
return xerrors.Errorf("create wireguard network: %w", err)
109109
}
110110

111-
err = client.PostWireguardPeer(cmd.Context(), workspace.ID, peerwg.WireguardPeerMessage{
112-
Recipient: workspaceAgent.ID,
113-
Public: wgn.Private.Public(),
114-
Disco: wgn.Disco,
115-
IPv6: ipv6,
111+
err = client.PostWireguardPeer(cmd.Context(), workspace.ID, peerwg.Handshake{
112+
Recipient: workspaceAgent.ID,
113+
NodePublicKey: wgn.NodePrivateKey.Public(),
114+
DiscoPublicKey: wgn.DiscoPublicKey,
115+
IPv6: ipv6,
116116
})
117117
if err != nil {
118118
return xerrors.Errorf("post wireguard peer: %w", err)
119119
}
120120

121-
err = wgn.AddPeer(peerwg.WireguardPeerMessage{
122-
Recipient: workspaceAgent.ID,
123-
Disco: workspaceAgent.DiscoPublicKey,
124-
Public: workspaceAgent.WireguardPublicKey,
125-
IPv6: workspaceAgent.IPv6.IP(),
121+
err = wgn.AddPeer(peerwg.Handshake{
122+
Recipient: workspaceAgent.ID,
123+
DiscoPublicKey: workspaceAgent.DiscoPublicKey,
124+
NodePublicKey: workspaceAgent.WireguardPublicKey,
125+
IPv6: workspaceAgent.IPv6.IP(),
126126
})
127127
if err != nil {
128128
return xerrors.Errorf("add workspace agent as peer: %w", err)
@@ -177,6 +177,8 @@ func wireguardPortForward() *cobra.Command {
177177
},
178178
}
179179

180+
// Hide all wireguard commands for now while we test!
181+
cmd.Hidden = true
180182
cmd.Flags().StringArrayVarP(&tcpForwards, "tcp", "p", []string{}, "Forward a TCP port from the workspace to the local machine")
181183
cmd.Flags().StringArrayVar(&udpForwards, "udp", []string{}, "Forward a UDP port from the workspace to the local machine. The UDP connection has TCP-like semantics to support stateful UDP protocols")
182184
cmd.Flags().StringArrayVar(&unixForwards, "unix", []string{}, "Forward a Unix socket in the workspace to a local Unix socket or TCP port")
@@ -185,7 +187,7 @@ func wireguardPortForward() *cobra.Command {
185187
}
186188

187189
func listenAndPortForwardWireguard(ctx context.Context, cmd *cobra.Command,
188-
wgn *peerwg.WireguardNetwork,
190+
wgn *peerwg.Network,
189191
wg *sync.WaitGroup,
190192
spec portForwardSpec,
191193
agentIP netaddr.IP,

coderd/database/databasefake/databasefake.go

+19-19
Original file line numberDiff line numberDiff line change
@@ -1599,23 +1599,23 @@ func (q *fakeQuerier) InsertWorkspaceAgent(_ context.Context, arg database.Inser
15991599
defer q.mutex.Unlock()
16001600

16011601
agent := database.WorkspaceAgent{
1602-
ID: arg.ID,
1603-
CreatedAt: arg.CreatedAt,
1604-
UpdatedAt: arg.UpdatedAt,
1605-
ResourceID: arg.ResourceID,
1606-
AuthToken: arg.AuthToken,
1607-
AuthInstanceID: arg.AuthInstanceID,
1608-
EnvironmentVariables: arg.EnvironmentVariables,
1609-
Name: arg.Name,
1610-
Architecture: arg.Architecture,
1611-
OperatingSystem: arg.OperatingSystem,
1612-
Directory: arg.Directory,
1613-
StartupScript: arg.StartupScript,
1614-
InstanceMetadata: arg.InstanceMetadata,
1615-
ResourceMetadata: arg.ResourceMetadata,
1616-
Ipv6: arg.Ipv6,
1617-
WireguardPublicKey: arg.WireguardPublicKey,
1618-
DiscoPublicKey: arg.DiscoPublicKey,
1602+
ID: arg.ID,
1603+
CreatedAt: arg.CreatedAt,
1604+
UpdatedAt: arg.UpdatedAt,
1605+
ResourceID: arg.ResourceID,
1606+
AuthToken: arg.AuthToken,
1607+
AuthInstanceID: arg.AuthInstanceID,
1608+
EnvironmentVariables: arg.EnvironmentVariables,
1609+
Name: arg.Name,
1610+
Architecture: arg.Architecture,
1611+
OperatingSystem: arg.OperatingSystem,
1612+
Directory: arg.Directory,
1613+
StartupScript: arg.StartupScript,
1614+
InstanceMetadata: arg.InstanceMetadata,
1615+
ResourceMetadata: arg.ResourceMetadata,
1616+
WireguardNodeIPv6: arg.WireguardNodeIPv6,
1617+
WireguardNodePublicKey: arg.WireguardNodePublicKey,
1618+
WireguardDiscoPublicKey: arg.WireguardDiscoPublicKey,
16191619
}
16201620

16211621
q.provisionerJobAgents = append(q.provisionerJobAgents, agent)
@@ -1920,8 +1920,8 @@ func (q *fakeQuerier) UpdateWorkspaceAgentKeysByID(_ context.Context, arg databa
19201920
continue
19211921
}
19221922

1923-
agent.WireguardPublicKey = arg.WireguardPublicKey
1924-
agent.DiscoPublicKey = arg.DiscoPublicKey
1923+
agent.WireguardNodePublicKey = arg.WireguardNodePublicKey
1924+
agent.WireguardDiscoPublicKey = arg.WireguardDiscoPublicKey
19251925
agent.UpdatedAt = database.Now()
19261926
q.provisionerJobAgents[index] = agent
19271927
return nil

coderd/database/dump.sql

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
ALTER TABLE workspace_agents
2-
DROP COLUMN ipv6,
3-
DROP COLUMN wireguard_public_key,
2+
DROP COLUMN wireguard_ipv6,
3+
DROP COLUMN node_public_key,
44
DROP COLUMN disco_public_key;
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
ALTER TABLE workspace_agents
2-
ADD COLUMN ipv6 inet NOT NULL DEFAULT '::/128',
3-
ADD COLUMN wireguard_public_key varchar(128) NOT NULL DEFAULT 'mkey:0000000000000000000000000000000000000000000000000000000000000000',
4-
ADD COLUMN disco_public_key varchar(128) NOT NULL DEFAULT 'discokey:0000000000000000000000000000000000000000000000000000000000000000';
2+
ADD COLUMN wireguard_node_ipv6 inet NOT NULL DEFAULT '::/128',
3+
ADD COLUMN wireguard_node_public_key varchar(128) NOT NULL DEFAULT 'mkey:0000000000000000000000000000000000000000000000000000000000000000',
4+
ADD COLUMN wireguard_disco_public_key varchar(128) NOT NULL DEFAULT 'discokey:0000000000000000000000000000000000000000000000000000000000000000';

coderd/database/models.go

+20-20
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)