libuv / help

Need help with libuv? Post your question here.
28 stars 7 forks source link

Get TProxy destination addr #199

Open caobug opened 3 years ago

caobug commented 3 years ago

Hello, I forwarded udp to a local port through iptables. Originally, I could resolve the destination address from msghdr, However Libuv didn't open this struct to the outside world.

What should I do if I want to know the original destination of udp?

ip rule add fwmark 1 lookup 100
ip route add local default dev lo table 100
iptables -t mangle -A PREROUTING -p udp --dport 53 -j TPROXY --on-ip 127.0.0.1 --on-port 5353 --tproxy-mark 0x01/0x01
iptables -t mangle -A OUTPUT -p udp --dport 53 -j MARK --set-mark 1
static int
get_dstaddr(struct msghdr *msg, struct sockaddr_storage *dstaddr)
{
    struct cmsghdr *cmsg;

    for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {
        if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVORIGDSTADDR) {
            memcpy(dstaddr, CMSG_DATA(cmsg), sizeof(struct sockaddr_in));
            dstaddr->ss_family = AF_INET;
            return 0;
        } else if (cmsg->cmsg_level == SOL_IPV6 && cmsg->cmsg_type == IPV6_RECVORIGDSTADDR) {
            memcpy(dstaddr, CMSG_DATA(cmsg), sizeof(struct sockaddr_in6));
            dstaddr->ss_family = AF_INET6;
            return 0;
        }
    }

    return 1;
}

https://github.com/libuv/libuv/blob/47e0c5c575e92a25e0da10fc25b2732942c929f3/src/unix/udp.c#L304

bnoordhuis commented 3 years ago

I'm moving this to libuv/help because the feature you're asking for is not something libuv can support, it's non-portable. As a workaround, try using a uv_poll_t.