Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

WireGuard endpoint with system: true on macOS counts the 4-byte utun header as packet data; packets in the last 4 bytes of the MTU are padded to mtu+76 and dropped

Open Beginner friendly
#4,632 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
76/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
go, macos
Domain
networking

Research direction

Start in transport/wireguard/device_system.go, at systemDevice.Read around the non-batch w.device.Read call; compare the reported PacketOffset behavior in the linked sing-tun Darwin implementation and the upstream wireguard-go Darwin TUN code. Adjust the byte count as described in the issue, then verify that packets near the configured MTU no longer produce oversized WireGuard messages; the issue provides a ping and tcpdump reproduction.

Written by the indexing model from the issue text.

Description

Operating system

macOS

System version

macOS 27.0.1 (26A434), Apple silicon (arm64)

Installation type

Original sing-box Command Line

If you are using a graphical client, please provide the version of the client.

No response

Version
sing-box version 1.14.3

Environment: go1.26.9 darwin/arm64
Tags: with_gvisor,with_quic,with_dhcp,with_wireguard,with_utls,with_acme,with_clash_api,with_tailscale,with_ccm,with_ocm,with_cloudflared,with_naive_outbound,with_usbip,with_openvpn,with_openconnect,badlinkname,tfogo_checklinkname0
CGO: enabled
Description

On macOS, a WireGuard endpoint with system: true treats every packet it reads from the utun device as 4 bytes longer than it really is. The extra 4 bytes are the utun protocol-family header.

Where it happens

Consequences

  1. wireguard-go encrypts 4 trailing garbage bytes with every packet. The receiver trims them using the IP total length, so this alone is harmless.
  2. Padding is computed on the wrong length (device/send.go#L660-L674, called at #L701). When an inner packet is within the last 4 bytes of the MTU (mtu-3 … mtu), the inflated length exceeds mtu:
    • calculatePaddingSize wraps it (lastUnit %= mtu) and pads by up to 15 more bytes.
    • The plaintext becomes mtu + 16 and the transport message mtu + 48.
    • The outer IPv4 packet becomes mtu + 76, instead of at most mtu + 60 as with any other WireGuard implementation.

Real-world impact

  • The path to the peer has an MTU of 1492 (PPPoE).
  • With mtu: 1428, inner packets of 1425–1428 bytes became 1504-byte outer packets. These exceed the 1500-byte physical interface MTU, and the outer socket sets DF, so they were silently dropped on the sender.
  • mtu: 1432 behaves the same for 1429–1432.
  • The kernel does not fragment these packets, because they fit the utun MTU. The result is a 4-byte black hole just below the tunnel MTU, and full-size TCP segments (exactly mtu) fall into it.
  • ping -D confirms it: 1–(mtu−4) bytes pass, (mtu−3)–mtu bytes are lost, and mtu+1 gives "Message too long".
  • Workaround: choose mtu ≤ path MTU − 76, which is 1416 here.

Suggested fix (untested)

Subtract tun.PacketOffset in the non-batch branch of systemDevice.Read, as upstream does:

sizes[0], err = w.device.Read(bufs[0][offset-tun.PacketOffset:])
if err == nil {
	if sizes[0] < tun.PacketOffset {
		return 0, nil
	}
	sizes[0] -= tun.PacketOffset
	count = 1
}

On Linux PacketOffset is 0, so only darwin and other platforms with a non-zero offset are affected.

Reproduction

The reproduction uses two endpoints on the same Mac, connected over 127.0.0.1:

  • A uses system: true, which creates utun121 and shows the bug.
  • B is a userspace endpoint and serves as the control.
  • The keys were generated for this reproduction only.
  • No tun inbound or remote server is involved. The only TUN in play is the one the system: true endpoint creates by itself, and that is the subject of this report.

a.json:

{
  "log": {"level": "debug"},
  "endpoints": [
    {
      "type": "wireguard",
      "tag": "wg-a",
      "system": true,
      "name": "utun121",
      "mtu": 1420,
      "address": ["10.200.0.1/30"],
      "private_key": "EN/DJ1LPZIoRjQh4fuP9bBnliQkjzk5amNUOADoZaVs=",
      "listen_port": 51830,
      "peers": [
        {
          "address": "127.0.0.1",
          "port": 51831,
          "public_key": "am5tSz3SB8IrAK8agc3cv9G0uzl+JFemmpw5xcQ4OmI=",
          "allowed_ips": ["10.200.0.2/32"]
        }
      ]
    }
  ]
}

b.json:

{
  "log": {"level": "debug"},
  "endpoints": [
    {
      "type": "wireguard",
      "tag": "wg-b",
      "mtu": 1420,
      "address": ["10.200.0.2/30"],
      "private_key": "sEQM+elu4HIzcnLC8Ugr8iiHUOw+GRaX+3Z/T6KOGHc=",
      "listen_port": 51831,
      "peers": [
        {
          "address": "127.0.0.1",
          "port": 51830,
          "public_key": "BQVpqo81ZSGSI0JAw7YSiuKhvNSvdL/SDN4vsOUyJk8=",
          "allowed_ips": ["10.200.0.1/32"]
        }
      ]
    }
  ]
}

Steps:

sing-box run -c b.json
sudo sing-box run -c a.json
ping -c 2 -b utun121 10.200.0.2        # complete the handshake
sudo tcpdump -i lo0 -n 'udp and (port 51830 or port 51831) and greater 1000'
for n in 1404 1405 1416 1417 1420; do ping -D -c 1 -b utun121 -s $((n-28)) 10.200.0.2; done

Expected WireGuard transport message length (the tcpdump UDP, length) for an inner packet of n bytes is 32 + min(roundup16(n), mtu), so never more than mtu + 32 = 1452. Observed:

inner packet (bytes) expected A → B (system: true) B → A (userspace, echo reply of same size)
1404 1440 1440 1440
1405 1440 1452 1440
1416 1452 1452 1452
1417 1452 1468 1452
1420 1452 1468 1452

How to read the table:

  • A is always sized as if the packet were 4 bytes longer.
  • For 1417–1420 (mtu-3 … mtu), A's message is 1468 bytes. That means a 1436-byte plaintext, which is larger than the configured MTU of 1420, and a 1496-byte outer IPv4 packet (mtu + 76).
  • The userspace endpoint B is always correct.

Over loopback the oversized packets still get through, because lo0's MTU is 16384. On a real path they exceed the path MTU, as described above.

Logs

Debug logs of both endpoints during the run above. The gateway IP and MAC in the network environment line are redacted; nothing else is removed.

A (system: true):

INFO[0000] endpoint/wireguard[wg-a]: started at utun121
DEBUG[0000] endpoint/wireguard[wg-a]: uapi: updating private key
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 4 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: event worker - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 5 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 7 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 4 - started
DEBUG[0000] endpoint/wireguard[wg-a]: uapi: updating listen port
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 3 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 6 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 2 - started
DEBUG[0000] endpoint/wireguard[wg-a]: interface up requested
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 3 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 6 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 1 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 5 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 6 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 8 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 2 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 8 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 7 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 1 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 7 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 1 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 2 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 10 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 10 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 10 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 9 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 9 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 3 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: tun reader - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 8 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 4 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 9 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 5 - started
DEBUG[0000] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - uapi: created
DEBUG[0000] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - uapi: updating endpoint
DEBUG[0000] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - uapi: Adding allowedip
DEBUG[0000] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - starting
DEBUG[0000] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - routine: sequential receiver - started
DEBUG[0000] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - routine: sequential sender - started
DEBUG[0000] endpoint/wireguard[wg-a]: udp bind has been updated
DEBUG[0000] endpoint/wireguard[wg-a]: interface state was Down, requested Up, now Up
DEBUG[0000] endpoint/wireguard[wg-a]: routine: receive incoming makeReceiveMsgX - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: receive incoming makeReceiveMsgX - started
INFO[0000] network: updated default interface en0, index 13
INFO[0000] sing-box started (0.00s)
INFO[0000] network: updated network environment: gateway [redacted], gateway_mac [redacted]
DEBUG[0002] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - sending handshake initiation
DEBUG[0002] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - received handshake response
DEBUG[0009] endpoint/wireguard[wg-a]: routine: receive incoming makeReceiveMsgX - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: receive incoming makeReceiveMsgX - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - stopping
DEBUG[0009] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - routine: sequential sender - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - routine: sequential receiver - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: interface state was Up, requested Down, now Down
DEBUG[0009] endpoint/wireguard[wg-a]: device closing
DEBUG[0009] endpoint/wireguard[wg-a]: routine: event worker - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: tun reader - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: device closed
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 3 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 9 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 10 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 7 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 5 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 4 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 1 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 7 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 2 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 8 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 5 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 6 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 4 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 3 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 9 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 8 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 10 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 2 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 6 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 1 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 10 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 1 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 7 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 4 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 9 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 8 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 6 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 3 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 5 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 2 - stopped

B (userspace):

DEBUG[0000] endpoint/wireguard[wg-b]: uapi: updating private key
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 5 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 8 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 1 - started
DEBUG[0000] endpoint/wireguard[wg-b]: uapi: updating listen port
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 4 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 1 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 10 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 7 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 5 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 6 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 2 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 4 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: tun reader - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 6 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 3 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 6 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 2 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 8 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 1 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 9 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 3 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 4 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 7 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 3 - started
DEBUG[0000] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - uapi: created
DEBUG[0000] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - uapi: updating endpoint
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 9 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 8 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 7 - started
DEBUG[0000] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - uapi: Adding allowedip
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 10 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 10 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 5 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 2 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: event worker - started
DEBUG[0000] endpoint/wireguard[wg-b]: interface up requested
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 9 - started
DEBUG[0000] endpoint/wireguard[wg-b]: udp bind has been updated
DEBUG[0000] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - starting
DEBUG[0000] endpoint/wireguard[wg-b]: interface state was Down, requested Up, now Up
INFO[0000] network: updated default interface en0, index 13
INFO[0000] network: updated network environment: gateway [redacted], gateway_mac [redacted]
DEBUG[0000] endpoint/wireguard[wg-b]: routine: receive incoming makeReceiveMsgX - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: receive incoming makeReceiveMsgX - started
DEBUG[0000] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - routine: sequential receiver - started
DEBUG[0000] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - routine: sequential sender - started
INFO[0000] sing-box started (0.00s)
DEBUG[0002] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - received handshake initiation
DEBUG[0002] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - sending handshake response
DEBUG[0009] endpoint/wireguard[wg-b]: routine: receive incoming makeReceiveMsgX - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: receive incoming makeReceiveMsgX - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - stopping
DEBUG[0009] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - routine: sequential sender - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - routine: sequential receiver - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: interface state was Up, requested Down, now Down
DEBUG[0009] endpoint/wireguard[wg-b]: device closing
DEBUG[0009] endpoint/wireguard[wg-b]: routine: event worker - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: tun reader - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: device closed
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 3 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 5 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 2 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 4 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 6 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 2 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 7 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 1 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 8 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 5 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 9 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 10 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 4 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 9 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 10 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 7 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 3 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 8 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 1 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 6 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: encryption worker 9 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: encryption worker 7 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: encryption worker 4 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: encryption worker 6 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: encryption worker 3 - stopped
Supporter
Integrity requirements
  • I confirm that I have read the documentation, understand the meaning of all the configuration items I wrote, and did not pile up seemingly useful options or default values.
  • I confirm that I have provided the server and client configuration files and process that can be reproduced locally, instead of a complicated client configuration file that has been stripped of sensitive data.
  • I confirm that I have provided the simplest configuration that can be used to reproduce the error I reported, instead of depending on remote servers, TUN, graphical interface clients, or other closed-source software.
  • I confirm that I have provided the complete configuration files and logs, rather than just providing parts I think are useful out of confidence in my own intelligence.
Dominant language
Go
Stars
39.1k
Forks
4.8k
PR merge metrics
No merged PRs in 30d

Getting set up

  • Ships a Dockerfile or Docker Compose file
  • No pull request template
  • No contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from SagerNet/sing-box

All issues in SagerNet/sing-box

Similar issues

More Go issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.