XTLS/Xray-core · warning
failed to delete interface address {address}
Error message
failed to delete interface address {address} What it means
During teardown (unsetInterfaceAddresses), Xray removes each address it previously added to the TUN link. If netlink.AddrDel fails for any address, this error is collected into a combined error. This is cleanup-path noise: it usually indicates the address was already removed or the link is already gone.
Source
Thrown at proxy/tun/tun_linux.go:259
if err != nil {
_ = t.unsetInterfaceAddresses()
return errors.New("invalid interface address ", address).Base(err)
}
if err := netlink.AddrAdd(t.tunLink, addr); err != nil {
_ = t.unsetInterfaceAddresses()
return errors.New("failed to add interface address ", address).Base(err)
}
t.interfaceAddresses = append(t.interfaceAddresses, *addr)
}
return nil
}
func (t *LinuxTun) unsetInterfaceAddresses() error {
var errs []error
for i := len(t.interfaceAddresses) - 1; i >= 0; i-- {
address := t.interfaceAddresses[i]
if err := netlink.AddrDel(t.tunLink, &address); err != nil {
errs = append(errs, errors.New("failed to delete interface address ", address.String()).Base(err))
}
}
t.interfaceAddresses = nil
return errors.Combine(errs...)
}
func (t *LinuxTun) setSystemRoutes() error {
if len(t.options.AutoSystemRoutingTable) == 0 {
return nil
}
tunIndex := t.tunLink.Attrs().Index
for _, cidr := range t.options.AutoSystemRoutingTable {
prefix, err := netip.ParsePrefix(cidr)
if err != nil {
return errors.New("invalid system route ", cidr).Base(err)
}
prefix = prefix.Masked()
_, ipNet, _ := net.ParseCIDR(prefix.String())View on GitHub (pinned to 7d214f8b09)
Solutions
- Treat as non-fatal if addresses are verified absent afterwards (`ip addr show <tun>`)
- Avoid externally manipulating TUN addresses while Xray owns the device
- Stop Xray cleanly (SIGTERM) so its own teardown runs before any interface destruction
Defensive patterns
Strategy: try-catch
Try / catch
// cleanup errors are collected; treat combined error as non-fatal
if err := tun.Close(); err != nil {
log.Warnf("tun cleanup: %v (verify with `ip addr show`)", err)
} Prevention
- Stop xray gracefully so teardown sees a live link
- Do not manually flush TUN addresses while xray runs
- Log cleanup failures at warn level instead of aborting
When it happens
Trigger: Another process (network manager, `ip addr flush`, a prior crash cleanup) removed the address first; the TUN link destroyed before teardown; addresses modified externally while Xray ran.
Common situations: System shutdown racing Xray shutdown; manual `ip addr flush dev tun0` while the proxy runs; repeated start/stop cycles where the kernel already reclaimed the ephemeral device.
Related errors
- invalid interface address {address}
- failed to add interface address {address}
- failed to delete system route
- failed to add system route {cidr}
- invalid xray.tun.fd: file descriptor is not a TUN device
AI-assisted analysis of XTLS/Xray-core@7d214f8b09 (2026-08-15).
Data as JSON: /api/errors/6e50c7a4f119d9b0.
Report an issue: GitHub.