를 사용하여 생성된 SOCKS 프록시를 사용할 때 DNS 확인이 다른 쪽 끝으로 터널링됩니까 ssh -D
? 설명서를 읽고 인터넷에서 검색했지만 문서를 찾을 수 없습니다.
답변1
Socks를 통한 DNS 확인은 클라이언트에 의해 결정됩니다. Socks를 통해 DNS를 조회하도록 애플리케이션에 명시적으로 지시해야 합니다.
이름 확인은 호스트에 연결하는 것과 마찬가지로 시스템 호출로 수행됩니다.gethostbyname()
또는getaddrinfo()
.
달리 명시하지 않는 한, 프로그램은 이름 확인을 위해서만 이 기능을 사용할 수 있으며 물론 터널에 대한 지식은 없습니다.
socks5h://
예를 들어, 컬은 가 아닌 지정된 경우 에만 DNS를 찾습니다 socks5://
.
답변2
애플리케이션은 SOCKS 프록시를 사용하여 표시된 이름을 확인할 수 있습니다. 여기.
여부를 묻는다면 시스템 전체 조회는 터널을 통해 수행됩니다., 그렇다면 대답은아니요.
서버 측을 제어하는 경우 다음과 같이 클라이언트에서 UDP-TCP 프록시를 시작할 수 있습니다. 여기:
socat -T15 udp4-recvfrom:53,reuseaddr,fork tcp:localhost:5353
그런 다음 SSH를 통해 TCP-UDP 데몬을 시작한 서버로 TCP 연결을 전달합니다.
socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
당신은 이것에 눈살을 찌푸릴 수도 있고 당연히 그렇습니다. 다행히도 SSH 셔틀(예를 들어 언급 여기). DNS 쿼리를 쉽게 전달할 수 있는 패치가 있습니다.
YMMV이지만 다음과 같이 성공했습니다.
#!/bin/bash
# Taken from http://stackoverflow.com/questions/4594319/shell-replace-cr-lf-by-comma
DNSSERVERS=$(nmcli d show | grep DNS | awk '{print $2}' | sed -e 'H;${x;s/\n/,/g;s/^,//;p;};d' )
sshuttle \
-vvv \
--dns-hosts ${DNSSERVERS} \
-r server \
254.254.254.254/32
답변3
ssh -D 작동(man ssh를 통해)
로컬 "동적" 애플리케이션 수준 포트 전달을 지정합니다. 이는 로컬 측 포트에서 수신 대기하도록 소켓을 할당하여 수행됩니다.
그럼 소켓이란 무엇인가? 통과하다
소켓은 단지 통신을 위한 논리적 종점일 뿐입니다. 전송 계층에 존재합니다. 소켓에서 콘텐츠를 보내고 받을 수 있으며, 소켓을 바인딩하고 수신할 수 있습니다. 소켓은 프로토콜, 시스템 및 포트별로 다르며 패킷 헤더에 주소가 지정됩니다.
그리고
클라이언트는 소켓 프록시를 통해 DNS 조회를 수행할 수 있습니다.