@shibao @reldred Have you tcpdumped your external interface to verify though? Instead of modifying your main routing table, Wireguard uses packet marking and routing rules. It marks its own packets with a tag, and adds a routing rule to redirect all non-tagged packets to a different routing table that sends them through the tunnel.
~ % ip rule 0: from all lookup local 31492: from all lookup main suppress_prefixlength 0 31493: not from all fwmark 0x1337 lookup 4919 32766: from all lookup main 32767: from all lookup default ~ % ip route sh table 4919 default dev wg0 proto static scope link metric 50