Skip to content
This repository has been archived by the owner on Jun 22, 2021. It is now read-only.

Get TProxy destination addr #199

Open
caobug opened this issue Jun 7, 2021 · 1 comment
Open

Get TProxy destination addr #199

caobug opened this issue Jun 7, 2021 · 1 comment

Comments

@caobug
Copy link

caobug commented Jun 7, 2021

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
Copy link
Member

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.

@bnoordhuis bnoordhuis transferred this issue from libuv/libuv Jun 19, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants