내가 아는 한, 나가는 TCP 연결의 투명한 프록시를 지원하는 두 개의 SOCKS 프록시가 있습니다.토르그리고레드 삭스. HTTP 프록시와 달리 이러한 SOCKS 프록시는 투명하게 프록시를 사용할 수 있습니다.어느암호화된 프로토콜과 메타데이터나 헤더가 없는 프로토콜을 포함한 나가는 TCP 연결입니다.
두 프록시 모두 나가는 TCP 트래픽을 프록시의 로컬 포트로 리디렉션하려면 NAT가 필요합니다. 예를 들어 TransPort 9040
로컬 컴퓨터에서 Tor를 실행하는 경우 다음과 같은 iptables 규칙을 추가해야 합니다.
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 9040
127.0.0.1
내가 아는 한 이것은 원래 대상 IP와 포트를 다음으로 대체하므로 9040
이것이 암호화된 스트림(예: SSH) 또는 헤더가 없는 스트림(예:누구인가?), 프록시는 원래 대상 IP와 포트를 어떻게 알 수 있나요?
답변1
여기수행 방법:
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;
}
iptables는 원래 대상 주소를 덮어쓰지만 이전 주소는 기억합니다. 그런 다음 응용프로그램 코드는 특수 소켓 옵션을 요청하여 이를 얻을 수 있습니다 SO_ORIGINAL_DST
.