curl socks5h 대 socks5: 호스트 이름을 푸는 쪽은 누구인가
추가된 글자가 옮기는 것은 DNS 조회이지 암호화가 아니다. 두 형식을 비교한 뒤 어떤 호스트 이름이 아직 로컬 리졸버를 필요로 하는지 확인하자.
사람들은 socks5h를 socks5의 더 친숙한 표기로 여기고, 둘 다 같은 요청을 같은 곳으로 보낼 것이라 기대한다. 추가된 글자가 옮기는 것은 오히려 DNS 조회다. 리졸버와 프록시가 서로 다른 네트워크에 있는 기계라면, 그것이 성공하는 요청과 실패하는 요청의 차이다.
한 글자, 두 리졸버
스킴은 목적지 이름이 어디서 주소로 바뀌는지를 정한다. 로컬 해석은 당신의 기계에 설정된 리졸버를 쓴다. 원격 해석은 호스트 이름을 SOCKS 요청 안에 넣고, 프록시가 자기 리졸버와 자기 네트워크관으로 그것을 찾는다. 두 형식 모두 같은 포트의 같은 프록시 주소로 접속하므로, 차이는 경로가 아니라 요청 본문에 있다.
스킴이 암호화나 인증을 바꾸지는 않는다. 움직이는 것은 DNS 경로뿐이다. 그래서 이 글자는 놓치기 쉽고 틀리면 비싸다.
같은 프록시, 다른 요청
두 호출은 한 글자만 다르다. 나머지는 모두 같다.
curl --proxy socks5://proxy.example:1080 https://service.example/
curl --proxy socks5h://proxy.example:1080 https://service.example/The curl 프록시 레퍼런스는 이 스킴들을 따로 기록하며, 이것이 둘을 별칭으로 취급하지 않아야 하는 권위 있는 이유다. 허가받은 무해한 엔드포인트를 상대로 둘 다 실행하고 차이를 읽어 보라. 원격 조회가 성공해도 다른 애플리케이션에 대해서는 아무 말도 하지 않는다. 왜냐하면 브라우저, 패키지 관리자, 언어 런타임은 각자 스스로 고르기 때문이다.
프록시 자신의 이름은 로컬에서 해석된다
그 명령에서 proxy.example은 다른 어떤 일이 일어나기 전에 주소가 되어야 하고, 그 조회는 항상 로컬이다. service.example의 해석을 프록시로 옮겨도 프록시 자신의 이름에는 아무 효과가 없다. 그 이름에는 여전히 당신의 기계가 닿을 수 있는 리졸버가 필요하다. 여기서 VPN이 그림을 바꾼다.
프록시 이름이 터널 안에서만 해석된다면, 연결은 curl이 시작되기 전에 터널이 올라와 있는지에 달려 있다. 어느 스킴이 이길지는 어느 쪽이 답할 수 있는지에 달려 있다. 기계가 목적지를 해석하지 못하지만 프록시는 할 수 있으면 socks5는 실패하고 socks5h는 성공한다. 기계가 터널을 통해 해석하고 프록시는 못 하면 socks5는 되고 socks5h는 실패한다.
스킴은 프록시로 가는 연결을 VPN 안이나 밖에 두지 않는다. 그것은 라우팅 테이블이 하고, 스킴은 그것을 결코 보지 않는다. 그래서 같은 기계에서 한 터널이 한 스킴을 고치고 다른 스킴을 깨뜨릴 수 있다. 글자는 누가 질문하는지만 정한다.
각 쪽이 해석할 수 있는 것
공용 프록시는 회사 안에만 있는 이름을 해석할 수 없으므로, 그곳으로 호스트 이름을 보내면 프록시에서 실패하고 로컬 DNS 오류가 아니라 프록시 오류로 나타난다. 같은 사설 네트워크 안의 프록시는 보통 그런 이름을 해석할 수 있고, 바로 거기서 socks5h가 값을 한다. 리졸버의 위치는 정말로 필요한 정책에 따라 고르라. 원격 DNS가 자동으로 더 유능한 것도 아니고, 이름을 제삼자에게 넘기는 일이기도 하다. 공개 목적지라면 두 형식 모두 되므로 다른 도구가 이미 쓰는 쪽을 택하라.
그 선택은 주석이 아니라 런북에 적고, 자격 증명은 공유 기록과 진단 출력에 남기지 않는다. 그다음 한 번에 변수 하나만 바꾼다. 같은 목적지, 같은 바이너리, 같은 리졸버, 한 글자.
어느 바이너리가 답했나
같은 기계의 두 curl 바이너리는 버전과 빌드 기능이 다를 수 있다. Unix 계열 셸에서는 type -a curl이 경로의 모든 일치를 나열하고 curl --version은 실제로 실행될 쪽의 기능을 보여 준다. 경로 앞쪽의 래퍼 스크립트나 별칭은 결과가 테스트한다고 생각한 바이너리와 맞지 않는 흔한 이유다.
지원되지 않는 스킴, 이름을 해석하지 못하는 프록시, 닿을 수 없는 목적지는 서로 다른 세 가지 오류다. 그러니 글자를 바꾸기 전에 메시지를 읽어라. socks5h 문법이 없는 빌드는 프록시 문자열을 지원되지 않는다고 보고하는데, 이는 해석에 실패한 이름과 같지 않다. 시스템 curl에 관한 오래된 보고 하나를 모든 플랫폼의 영구 규칙으로 만들지 마라.