Aqui é assim:
static int getdestaddr_iptables(int fd, const struct sockaddr_in *client, const struct sockaddr_in *bindaddr, struct sockaddr_in *destaddr)
{
socklen_t socklen = sizeof(*destaddr);
int error;
error = getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, destaddr, &socklen);
if (error) {
log_errno(LOG_WARNING, "getsockopt");
return -1;
}
return 0;
}
O iptables substitui o endereço de destino original, mas lembra o antigo. O código do aplicativo pode então buscá-lo solicitando uma opção de soquete especial, SO_ORIGINAL_DST
.