experimental new HTTP client API for #golang (WIP)
embiggden-disk live-resizes a filesystem after first live-resizing any necessary layers below it: an optional LVM LV and PV, and an MBR or GPT partition table
brute-force a git commit hash
Get LetsEncrypt TLS certs for internal-only TLS servers via a delegated golang.org/x/crypto/acme/autocert server.
bmizerany/perks 162
Effective Computation of Things
bradfitz/campher 128
Embed Perl in Go. This works, but was a joke for a presentation. Don't use.
Gimmicky commit hash made using bradfitz/gitbrute
bradfitz/android-garage-opener 83
Android Garage Door Opener
bradfitz/art 51
Allotment Routing Table
Utilities for working with git and Gerrit
issue closedtailscale/tailscale
Ubuntu in VMware workstation, connectivity lost after vm pause/resume
Hello!
I run Ubuntu in VMware workstation (Windows 10 host, Ubuntu guest).
If I pause and then resume Ubuntu VM, then I could no longer send or receive data through Tailscale interface.
After I resume the VM, I could see link/none in the output of ip addr show tailscale0 and no data could go through.
The following is the log of such case:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.2 LTS
Release: 20.04
Codename: focal
$ uname -a
Linux june-workstation 5.8.0-63-generic #71~20.04.1-Ubuntu SMP Thu Jul 15 17:46:08 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ tailscale version
1.10.2
tailscale commit: 50371bb8fa07fd302bc2429907de6f8197f3fedd
other commit: 80dcd5480a46fe819462fdbc4564379e18bc6566
go version: go1.16.6-ts3297502
$ tailscale netcheck
Report:
* UDP: true
* IPv4: yes, <REDACTED>:28105
* IPv6: no
* MappingVariesByDestIP: false
* HairPinning: false
* PortMapping:
* Nearest DERP: Frankfurt
* DERP latency:
<REDACTED>
$ tailscale ip
100.111.154.5
fd7a:115c:a1e0:ab12:4843:cd96:626f:9a05
$ tailscale status
100.111.154.5 june-workstation <REDACTED>@ linux -
100.74.91.100 backup-pi <REDACTED>@ linux -
<REDACTED>
$ tailscale ping backup-pi
pong from backup-pi (100.74.91.100) via 192.168.3.2:41641 in 40ms
$ ping -c 3 backup-pi
PING backup-pi.<REDACTED>.beta.tailscale.net (100.74.91.100) 56(84) bytes of data.
64 bytes from backup-pi.<REDACTED>.beta.tailscale.net (100.74.91.100): icmp_seq=1 ttl=64 time=3.08 ms
64 bytes from backup-pi.<REDACTED>.beta.tailscale.net (100.74.91.100): icmp_seq=2 ttl=64 time=2.36 ms
64 bytes from backup-pi.<REDACTED>.beta.tailscale.net (100.74.91.100): icmp_seq=3 ttl=64 time=2.65 ms
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:92:87:56 brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 192.168.80.143/24 brd 192.168.80.255 scope global dynamic noprefixroute ens33
valid_lft 1742sec preferred_lft 1742sec
inet6 fe80::cccf:b7c0:c7a3:59e4/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: tailscale0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
inet 100.111.154.5/32 scope global tailscale0
valid_lft forever preferred_lft forever
inet6 fd7a:115c:a1e0:ab12:4843:cd96:626f:9a05/128 scope global
valid_lft forever preferred_lft forever
inet6 fe80::82c5:9a8d:f6d1:2dc0/64 scope link stable-privacy
valid_lft forever preferred_lft forever
<AT THIS POINT VM WAS PAUSED AND THEN RESUMED RIGHT AWAY>
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:92:87:56 brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 192.168.80.143/24 brd 192.168.80.255 scope global dynamic noprefixroute ens33
valid_lft 1788sec preferred_lft 1788sec
inet6 fe80::cccf:b7c0:c7a3:59e4/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: tailscale0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
<note the "link/none" in tailscale0 interface>
$ tailscale ping backup-pi
pong from backup-pi (100.74.91.100) via 192.168.3.2:41641 in 3ms
$ ping -c 3 backup-pi
PING backup-pi.localdomain (100.74.91.100) 56(84) bytes of data.
--- backup-pi.localdomain ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2035ms
$ tailscale bugreport
BUG-16f4d03af97fb3863b43f18ac230f9cf1b989215ce0f32ba09dacbac9db7fa06-20210728161547Z-119e0364f8aeb55f
$ tailscale netcheck
Report:
* UDP: true
* IPv4: yes, <REDACTED>:28739
* IPv6: no
* MappingVariesByDestIP: false
* HairPinning: false
* PortMapping:
* Nearest DERP: Frankfurt
* DERP latency:
<REDACTED>
$ tailscale ip
100.111.154.5
fd7a:115c:a1e0:ab12:4843:cd96:626f:9a05
$ tailscale status
100.111.154.5 june-workstation <REDACTED>@ linux -
100.74.91.100 backup-pi <REDACTED>@ linux active; direct 192.168.3.2:41641, tx 1076 rx 988
<REDACTED>
$ ping -c 3 backup-pi
PING backup-pi.localdomain (100.74.91.100) 56(84) bytes of data.
--- backup-pi.localdomain ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2035ms
<trying to reload with tailscale down/up>
$ sudo tailscale down
$ sudo tailscale up
$ ip addr show tailscale0
4: tailscale0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
$ ping -c 3 backup-pi
PING backup-pi.<REDACTED>.beta.tailscale.net (100.74.91.100) 56(84) bytes of data.
--- backup-pi.<REDACTED>.beta.tailscale.net ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2047ms
<still not working>
$ sudo systemctl restart tailscaled
$ ip addr show tailscale0
5: tailscale0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
inet 100.111.154.5/32 scope global tailscale0
valid_lft forever preferred_lft forever
inet6 fd7a:115c:a1e0:ab12:4843:cd96:626f:9a05/128 scope global
valid_lft forever preferred_lft forever
inet6 fe80::e692:2a42:52d5:bafd/64 scope link stable-privacy
valid_lft forever preferred_lft forever
<it's back!>
$ ping -c 3 backup-pi
PING backup-pi.localdomain (100.74.91.100) 56(84) bytes of data.
64 bytes from backup-pi.<REDACTED>.beta.tailscale.net (100.74.91.100): icmp_seq=1 ttl=64 time=138 ms
64 bytes from backup-pi.<REDACTED>.beta.tailscale.net (100.74.91.100): icmp_seq=2 ttl=64 time=5.12 ms
64 bytes from backup-pi.<REDACTED>.beta.tailscale.net (100.74.91.100): icmp_seq=3 ttl=64 time=3.43 ms
--- backup-pi.localdomain ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 3.428/48.781/137.795/62.946 ms
Thank you for your time!
closed time in a minute
senotrusovissue commenttailscale/tailscale
Ubuntu in VMware workstation, connectivity lost after vm pause/resume
Sounds like #2458. Try updating to 1.12.1 which includes the fix. Reopen this bug if it doesn't fix it for you?
comment created time in a minute
issue commenttailscale/tailscale
Provide better messaging about IP forwarding
Oh, right. Great, let's call this fixed.
comment created time in 20 minutes
issue closedtailscale/tailscale
Provide better messaging about IP forwarding
A few users have written in, confused by an error about IP forwarding not being enabled when they try to set up a subnet.
I've updated our documentation to include instructions on how to enable IP forwarding, but it'd be nice if we could identify this error and give people the needed steps right in the CLI.
In short, they need to run these lines:
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
Maybe we could say:
$ tailscale up --advertise-routes=<routes>
Error: IP forwarding is not enabled, but is needed for --advertise-routes.
You can enable IP forwarding by editing /etc/sysctl.conf and trying again:
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
Having the documentation built-in would be a much better experience.
Also a valid fix, but more risky: maybe we should manage this setting on behalf of users?
closed time in 20 minutes
rosszurowskipush eventtailscale/tailscale
commit sha c179b9b535a4f70e88cd33c9bbcdef045e71e32c
cmd/tsshd: switch from github.com/kr/pty to github.com/creack/pty The kr/pty module moved to creack/pty per the kr/pty README[1]. creack/pty brings in support for a number of OS/arch combos that are lacking in kr/pty. Run `go mod tidy` while here. [1] https://github.com/kr/pty/blob/master/README.md Signed-off-by: Aaron Bieber <[email protected]>
push time in 41 minutes
PR merged tailscale/tailscale
The kr/pty module moved to creack/pty per the kr/pty README[1].
creack/pty brings in support for a number of OS/arch combos that are lacking in kr/pty.
Run go mod tidy while here.
[1] https://github.com/kr/pty/blob/master/README.md
pr closed time in 41 minutes
pull request commenttailscale/tailscale
cmd/tsshd: switch from github.com/kr/pty to github.com/creack/pty
Thanks. We require the DCO sign-off line in commit messages, though.
If you agree with https://developercertificate.org/ then git commit --amend -s to update your commit message, then git push -f the branch.
comment created time in an hour
Pull request review commenttailscale/tailscale
wgengine/userspace: add support to automatically enable/disable the tailscale protocol in BIRD.
func (e *userspaceEngine) updateActivityMapsLocked(trackDisco []tailcfg.DiscoKey e.tundev.SetDestIPActivityFuncs(e.destIPActivityFuncs) } +func hasOverlap(aips, rips []netaddr.IPPrefix) bool {
comment that this is different than
https://pkg.go.dev/inet.af/netaddr#IPPrefix.Overlaps https://pkg.go.dev/inet.af/netaddr#IPSet.Overlaps
This is not about any partial overlap.
comment created time in an hour
Pull request review commenttailscale/tailscale
wgengine/userspace: add support to automatically enable/disable the tailscale protocol in BIRD.
func (e *userspaceEngine) Reconfig(cfg *wgcfg.Config, routerCfg *router.Config, } } + if isSubnetRouterChanged && e.birdClient != nil {+ e.logf("wgengine: Reconfig: configuring BIRD")+ var err error+ if isSubnetRouter {+ err = e.birdClient.EnableProtocol("tailscale")+ } else {+ err = e.birdClient.DisableProtocol("tailscale")+ }+ if err != nil {+ // Log but don't fail here.+ e.logf("wgengine: Reconfig: configuring BIRD failed: %v", err)
I'm not 100% sure but I think we've been moving to getting the word "error" in all failure log prints to ease grepping logs for "error" to find bad stuff.
So like "error configuring BIRD: %v"
comment created time in an hour
Pull request review commenttailscale/tailscale
wgengine/userspace: add support to automatically enable/disable the tailscale protocol in BIRD.
type userspaceEngine struct { linkMon *monitor.Mon linkMonOwned bool // whether we created linkMon (and thus need to close it) linkMonUnregister func() // unsubscribes from changes; used regardless of linkMonOwned+ birdClient *chirp.BIRDClient
// or nil I assume?
comment created time in an hour
Pull request review commenttailscale/tailscale
wgengine/userspace: add support to automatically enable/disable the tailscale protocol in BIRD.
+// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved.+// Use of this source code is governed by a BSD-style+// license that can be found in the LICENSE file.++// Package chirp implements a client to communicate with BIRD.+package chirp++import (+ "fmt"+ "net"+ "strings"+)++// New creates a BIRDClient.+func New(socket string) (*BIRDClient, error) {+ conn, err := newConn(socket)+ if err != nil {+ return nil, fmt.Errorf("failed to connect to BIRD: %w", err)+ }+ return &BIRDClient{socket: socket, conn: conn}, nil+}++// BIRDClient handles communication with BIRD.+type BIRDClient struct {+ socket string+ conn net.Conn+}++// DisableProtocol disables the provided protocol.+func (b *BIRDClient) DisableProtocol(protocol string) error {+ out, err := b.exec(fmt.Sprintf("disable %s\n", protocol))+ if err != nil {+ return err+ }+ if strings.Contains(out, fmt.Sprintf("%s: already disabled", protocol)) {+ return nil+ } else if strings.Contains(out, fmt.Sprintf("%s: disabled", protocol)) {+ return nil+ }+ return fmt.Errorf("failed to disable %s: %v", protocol, out)+}++// EnableProtocol enables the provided protocol.+func (b *BIRDClient) EnableProtocol(protocol string) error {+ out, err := b.exec(fmt.Sprintf("enable %s\n", protocol))+ if err != nil {+ return err+ }+ if strings.Contains(out, fmt.Sprintf("%s: already enabled", protocol)) {+ return nil+ } else if strings.Contains(out, fmt.Sprintf("%s: enabled", protocol)) {+ return nil+ }+ return fmt.Errorf("failed to enable %s: %v", protocol, out)+}++func (b *BIRDClient) exec(cmd string) (string, error) {+ if _, err := b.conn.Write([]byte(cmd)); err != nil {+ return "", err+ }+ buf := make([]byte, 4096)+ if _, err := b.conn.Read(buf); err != nil {
this isn't a safe way to read from a net.Conn. there are zero guarantees about how much will be returned. you need to loop.
I assume the output is framed somehow? with a length? with a newline character?
comment created time in an hour
issue commenttailscale/tailscale
sort and export to CSV option on machine tab in UI.
I think I'd rather this be a CLI command, like tailscale admin users list --csv or tailscale admin users list --sort=connected.
/cc @rosszurowski
comment created time in 2 hours
issue commenttailscale/tailscale
dns: skipping bad resolver: [unexpected] non-IP resolver "0.0.0.0/0"
Ping @danderson for ideas.
comment created time in 2 hours
issue commenttailscale/tailscale
Report local subnet routes to control
Example of what we currently log:
link state: interfaces.State{defaultRoute=ens18 ifs={docker0:[172.17.0.1/16] ens18:[10.0.0.52/16 2602:d1:b4cf:c100:xxxx:4148/64]} v4=true v6=true}
That at least tells us the default route and the interfaces subnet sizes, which is usually enough.
This can probably be closed. It's hard for me to think of cases where more precise route information would've been helpful while debugging.
comment created time in 2 hours
issue commenttailscale/tailscale
Provide better messaging about IP forwarding
Added the /kb/ URL to the error message. Let's not break them. :)
Leaving bug open to track plumbing this more to the admin panel (we plumb it to control already) and showing the brokeness is tailscale status (which is really #2528), and also maybe just fixing this for users automatically.
comment created time in 2 hours
push eventtailscale/tailscale
commit sha 690ade4ee1c0e4e30f95226f6e6ffaadbd803813
ipn/ipnlocal: add URL to IP forwarding error message Updates #606 Signed-off-by: Brad Fitzpatrick <[email protected]>
push time in 2 hours
Pull request review commenttailscale/tailscale
tstime/mono: add new package, use everywhere
+// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved.+// Use of this source code is governed by a BSD-style+// license that can be found in the LICENSE file.++// Package mono provides fast monotonic time.
Maybe flesh out this package comment a bit with some numbers and a big scary warning that it should almost never be used and std time is plenty fast?
comment created time in 13 hours
Pull request review commenttailscale/tailscale
tstime/mono: add new package, use everywhere
type Wrapper struct { closeOnce sync.Once - lastActivityAtomic int64 // unix seconds of last send or receive+ lastActivity mono.Time // time of last send or receive, accessed atomically
keep the old variable name? the Atomic suffix is ugly and scary which is a feature.
I guess you didn't like the stutter in lastActivityAtomic.LoadAtomic etc? I'm fine with it if you are.
comment created time in 13 hours
push eventtailscale/tailscale-chocolatey
commit sha 668f9ba712ba6748b77577d344742525c1fb4767
Bump to 1.12.1 (#22)
push time in 13 hours
issue commenttailscale/tailscale
1.12.0 on Ubuntu fails to stay started
Can you systemctl stop tailscaled and then run tailscaled in the foreground, like:
$ sudo /usr/sbin/tailscaled --cleanup
$ sudo /usr/sbin/tailscaled --state=/var/lib/tailscale/tailscaled.state --socket=/run/tailscale/tailscaled.sock --port=41641
And then in another window, while that second tailscaled is running, then try to check its status, etc?
It seems like tailscaled is crashing but its crash logs aren't getting uploaded.
comment created time in 18 hours
issue commenttailscale/tailscale
1.12.0 on Ubuntu fails to stay started
I don't think it's #2321. It'd be different symptoms if it were.
Looking at logs (cd78e299c5ef11ecf4946362945b020ef28f0a423d872c47941eb0ccee3e3c62) I see the process restarting a lot, with no obvious crash in the logs for the previous generation:
2021-07-27 15:57:26.991721774 -0700 PDT: health("overall"): ok
2021-07-27 15:57:27.054284 -0700 PDT: LinkChange: minor
2021-07-27 15:57:27.05431515 -0700 PDT: magicsock: ReSTUN: endpoint update active, need another later ("link-change-minor")
2021-07-27 15:57:27.131133386 -0700 PDT: control: mapRoutine: netmap received: state:synchronized
2021-07-27 15:57:27.131163826 -0700 PDT: control: sendStatus: mapRoutine-got-netmap: state:synchronized
2021-07-27 15:57:27.131184696 -0700 PDT: netmap diff: (none)
2021-07-27 15:57:27.131374426 -0700 PDT: wgcfg: skipped unselected default routes from: "tailscale-relay-9c2da37" ([O2sn8])
2021-07-27 15:57:27.216271597 -0700 PDT: netcheck: report: udp=true v6=false mapvarydest=false hair=false portmap= v4a=52.129.39.162:41641 derp=10 derpdist=2v4:29ms,9v4:59ms,10v4:8ms
2021-07-27 15:57:27.468788047 -0700 PDT: netcheck: report: udp=true v6=false mapvarydest=false hair=false portmap= v4a=52.129.39.162:41641 derp=10 derpdist=2v4:30ms,9v4:59ms,10v4:7ms
2021-07-27 15:57:27.554920855 -0700 PDT: logtail started
2021-07-27 15:57:27.555015614 -0700 PDT: Program starting: v1.12.0-t359baa842-ge1013695a, Go 1.16.6-ts6fa85e8: []string{"/usr/sbin/tailscaled", "--cleanup"}
2021-07-27 15:57:27.555029764 -0700 PDT: LogID: cd78e299c5ef11ecf4946362945b020ef28f0a423d872c47941eb0ccee3e3c62
2021-07-27 15:57:27.555035704 -0700 PDT: logpolicy: using $STATE_DIRECTORY, "/var/lib/tailscale"
2021-07-27 15:57:27.557374108 -0700 PDT: dns: [rc=resolved nm=yes nm-resolved=yes nm-safe=no ret=*dns.resolvedManager]
2021-07-27 15:57:27.557416817 -0700 PDT: creating dns cleanup: route ip+net: no such network interface
2021-07-27 15:57:27.557427867 -0700 PDT: flushing log.
2021-07-27 15:57:27.557438917 -0700 PDT: logger closing down
2021-07-27 15:57:27.584641218 -0700 PDT: logtail: dialed "log.tailscale.io:443" in 29ms
2021-07-27 15:57:27.876012723 -0700 PDT: logtail started
2021-07-27 15:57:27.876087523 -0700 PDT: Program starting: v1.12.0-t359baa842-ge1013695a, Go 1.16.6-ts6fa85e8: []string{"/usr/sbin/tailscaled", "--cleanup"}
2021-07-27 15:57:27.876098493 -0700 PDT: LogID: cd78e299c5ef11ecf4946362945b020ef28f0a423d872c47941eb0ccee3e3c62
2021-07-27 15:57:27.876103963 -0700 PDT: logpolicy: using $STATE_DIRECTORY, "/var/lib/tailscale"
2021-07-27 15:57:27.878175457 -0700 PDT: dns: [rc=resolved nm=yes nm-resolved=yes nm-safe=no ret=*dns.resolvedManager]
2021-07-27 15:57:27.878368837 -0700 PDT: creating dns cleanup: route ip+net: no such network interface
2021-07-27 15:57:27.878413476 -0700 PDT: flushing log.
2021-07-27 15:57:27.878427036 -0700 PDT: logger closing down
2021-07-27 15:57:27.895315197 -0700 PDT: logtail: dialed "log.tailscale.io:443" in 18ms
2021-07-27 15:57:27.970173578 -0700 PDT: logtail started
2021-07-27 15:57:27.970230588 -0700 PDT: Program starting: v1.12.0-t359baa842-ge1013695a, Go 1.16.6-ts6fa85e8: []string{"/usr/sbin/tailscaled", "--state=/var/lib/tailscale/tailscaled.state", "--socket=/run/tailscale/tailscaled.sock", "--port", "416
41"}
comment created time in 18 hours
Pull request review commenttailscale/tailscale
tstime/mono: add new package, use everywhere
type PeerStatus struct { RxBytes int64 TxBytes int64 Created time.Time // time registered with tailcontrol- LastWrite time.Time // time last packet sent+ LastWrite mono.Time // time last packet sent
How does this serialize in JSON in tailscale status --json ?
comment created time in 20 hours