Could you please, post updated version to the list? //mxb
On 27 jun 2014, at 20:09, Leclerc, Sebastien <sebastien.lecl...@saint-georges.ca> wrote: >> Stuart Henderson <st...@openbsd.org>, 2014-06-27 11:00 >> >>> +/* Stolen from ftp-proxy */ >> >> Old version of ftp-proxy I guess. It hasn't used DIOCNATLOOK for several >> releases, it has switched to the much easier-to-use divert-to / >> getsockname(). > > And also : > >> Henning Brauer <lists-openbsdt...@bsws.de>, 2014-06-27 14:07 >> nooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo >> >> DIOCNATLOOK is stupid. I'll celebrate the day when I can kill it. >> Please look at less ancient ftp-proxy/*-proxy code for inspiration. > > Way simpler, indeed! > Thank you > > > --- tarpitd.c.bak Fri Jun 27 13:25:06 2014 > +++ tarpitd.c Fri Jun 27 14:01:35 2014 > @@ -56,21 +56,11 @@ struct con { > int il; > } *con; > > -/* From netinet/in.h, but only _KERNEL_ gets them. */ > -#define satosin(sa) ((struct sockaddr_in *)(sa)) > -#define satosin6(sa) ((struct sockaddr_in6 *)(sa)) > -int server_lookup4(struct sockaddr_in *, struct sockaddr_in *, > - struct sockaddr_in *); > -int server_lookup6(struct sockaddr_in6 *, struct sockaddr_in6 *, > - struct sockaddr_in6 *); > - > void usage(void); > void initcon(struct con *, int, struct sockaddr *); > void closecon(struct con *); > void handler(struct con *); > void getcaddr(struct con *); > -int server_lookup(struct sockaddr *, struct sockaddr *, > - struct sockaddr *); > int blockhost(char *); > int blocklistener(void); > > @@ -84,7 +74,6 @@ int maxfiles; > int maxcon = MAXCON; > int clients; > int debug; > -int pfdev; > int window = 0; > int autoblock = 1; > int pipel[2] = { -1, -1 }; > @@ -160,90 +149,11 @@ int blocklistener(void) > return(ret); > } > > -/* Stolen from ftp-proxy */ > -int > -server_lookup(struct sockaddr *client, struct sockaddr *proxy, > - struct sockaddr *server) > -{ > - if (client->sa_family == AF_INET) > - return (server_lookup4(satosin(client), satosin(proxy), > - satosin(server))); > - > - if (client->sa_family == AF_INET6) > - return (server_lookup6(satosin6(client), satosin6(proxy), > - satosin6(server))); > - > - errno = EPROTONOSUPPORT; > - return (-1); > -} > - > -int > -server_lookup4(struct sockaddr_in *client, struct sockaddr_in *proxy, > - struct sockaddr_in *server) > -{ > - struct pfioc_natlook pnl; > - > - memset(&pnl, 0, sizeof pnl); > - pnl.direction = PF_OUT; > - pnl.af = AF_INET; > - pnl.proto = IPPROTO_TCP; > - memcpy(&pnl.saddr.v4, &client->sin_addr.s_addr, sizeof pnl.saddr.v4); > - memcpy(&pnl.daddr.v4, &proxy->sin_addr.s_addr, sizeof pnl.daddr.v4); > - pnl.sport = client->sin_port; > - pnl.dport = proxy->sin_port; > - > - if (ioctl(pfdev, DIOCNATLOOK, &pnl) == -1) > - return (-1); > - > - memset(server, 0, sizeof(struct sockaddr_in)); > - server->sin_len = sizeof(struct sockaddr_in); > - server->sin_family = AF_INET; > - memcpy(&server->sin_addr.s_addr, &pnl.rdaddr.v4, > - sizeof server->sin_addr.s_addr); > - server->sin_port = pnl.rdport; > - > - return (0); > -} > - > -int > -server_lookup6(struct sockaddr_in6 *client, struct sockaddr_in6 *proxy, > - struct sockaddr_in6 *server) > -{ > - struct pfioc_natlook pnl; > - > - memset(&pnl, 0, sizeof pnl); > - pnl.direction = PF_OUT; > - pnl.af = AF_INET6; > - pnl.proto = IPPROTO_TCP; > - memcpy(&pnl.saddr.v6, &client->sin6_addr.s6_addr, sizeof > pnl.saddr.v6); > - memcpy(&pnl.daddr.v6, &proxy->sin6_addr.s6_addr, sizeof pnl.daddr.v6); > - pnl.sport = client->sin6_port; > - pnl.dport = proxy->sin6_port; > - > - if (ioctl(pfdev, DIOCNATLOOK, &pnl) == -1) > - return (-1); > - > - memset(server, 0, sizeof(struct sockaddr_in6)); > - server->sin6_len = sizeof(struct sockaddr_in6); > - server->sin6_family = AF_INET6; > - memcpy(&server->sin6_addr.s6_addr, &pnl.rdaddr.v6, > - sizeof server->sin6_addr); > - server->sin6_port = pnl.rdport; > - > - return (0); > -} > - > -/* > - * Get address client connected to, by doing a DIOCNATLOOK call. > - * Uses server_lookup code from ftp-proxy. > - */ > void > getcaddr(struct con *cp) > { > struct sockaddr_storage spamd_end; > struct sockaddr *sep = (struct sockaddr *) &spamd_end; > - struct sockaddr_storage original_destination; > - struct sockaddr *odp = (struct sockaddr *) &original_destination; > socklen_t len = sizeof(struct sockaddr_storage); > int error; > > @@ -251,9 +161,7 @@ getcaddr(struct con *cp) > cp->cport[0] = '\0'; > if (getsockname(cp->fd, sep, &len) == -1) > return; > - if (server_lookup((struct sockaddr *)&cp->ss, sep, odp) != 0) > - return; > - error = getnameinfo(odp, odp->sa_len, cp->caddr, sizeof(cp->caddr), > + error = getnameinfo(sep, sep->sa_len, cp->caddr, sizeof(cp->caddr), > cp->cport, sizeof(cp->cport), NI_NUMERICHOST | NI_NUMERICSERV); > if (error) { > syslog_r(LOG_WARNING, &sdata, "cannot get original destination > address."); > @@ -489,12 +397,6 @@ main(int argc, char *argv[]) > if (debug == 0) { > if (daemon(1, 1) == -1) > err(1, "daemon"); > - } > - > - pfdev = open("/dev/pf", O_RDWR); > - if (pfdev == -1) { > - syslog_r(LOG_ERR, &sdata, "open /dev/pf: %m"); > - exit(1); > } > > if (chroot("/var/empty") == -1 || chdir("/") == -1) { >