SQUID(Ubuntu 18.04의 3.5.27)를 투명 프록시로 구성하려고 합니다. 더 아래로 내려가면 인증과 요청 로깅을 처리해야 하지만 간단하게 시작해서 막히게 되었습니다.
로컬 네트워크에서 작업 중입니다. 간단한 웹 서버는 SQUID 서버(jarvis)의 포트 5000에서 실행됩니다. 네트워크의 다른 컴퓨터에서 액세스하려고 합니다.http://jarvis:5000(분명히 이것은 iptables가 꺼져 있을 때 작동합니다).
IPTABLES 구성이 적용됩니다.
iptables -t nat -A PREROUTING -i enp1s0 -p tcp -j REDIRECT --to-port 3128
내 squid.conf는 가능한 한 간단합니다.
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/htpasswd
acl authenticated proxy_auth REQUIRED
http_access allow authenticated
http_port 3128 transparent
visible_hostname jarvis
/usr/lib/squid/basic_ncsa_auth /etc/squid/htpasswd 작동합니다(사용자 이름과 비밀번호 사이에 콜론 없음:
# /usr/lib/squid/basic_ncsa_auth /etc/squid/htpasswd
me itsame
OK
내가하고있는 다른 컴퓨터에서
curl -v -u me:itsame http://jarvis:5000
인수하다
GET / HTTP/1.1
> Host: jarvis:5000
> Authorization: Basic bWU6aXRzYW1l
> User-Agent: curl/7.63.0
> Accept: */*
>
< HTTP/1.1 407 Proxy Authentication Required
< Server: squid/3.5.27
< Mime-Version: 1.0
< Date: Thu, 15 Aug 2019 16:41:13 GMT
< Content-Type: text/html;charset=utf-8
< Content-Length: 3538
< X-Squid-Error: ERR_CACHE_ACCESS_DENIED 0
< Vary: Accept-Language
< Content-Language: en
* Authentication problem. Ignoring this.
< Proxy-Authenticate: Basic realm="Squid proxy-caching web server"
< X-Cache: MISS from jarvis
< X-Cache-Lookup: NONE from jarvis:0
< Via: 1.1 jarvis (squid/3.5.27)
< Connection: keep-alive
내가 무엇을 놓치고 있나요?
답변1
인증을 통해 투명한 프록시(또는 Squid FAQ에서 부르는 "가로채기 프록시")를 수행하려는 것 같습니다.
Squid FAQ에서는 다음과 같이 매우 명확하게 설명합니다.
차단을 위해 "proxy_auth"를 사용할 수 있나요?
당신은 할 수 없습니다. 이전 질문에 대한 답변을 참조하세요. 클라이언트는 프록시를 가로채서 원본 서버와 통신하고 있다고 생각하고 프록시 인증 요청 헤더를 보내지 않습니다.
그리고 "이전 질문"은 다음과 같습니다.
차단 프록시로 인증을 사용할 수 없는 이유는 무엇입니까?
차단 프록시는 존재하지 않는 활성 프록시(프록시)를 설정하여 작동합니다. 브라우저는 그것이 거기에 있을 것이라고 기대하지 않으며 모든 효과와 목적은 속이거나 기껏해야 난독화됩니다. 이 브라우저의 사용자로서 의도하지 않은 당사자에게 자격 증명을 공개하지 말 것을 요청합니다. 동의하십니까? 특히 사용자 에이전트가 사용자에게 알리지 않고 이를 수행할 수 있는 경우 [...]
또한 사용 사례는 다음과 같습니다.역방향 프록시, 또한 ~으로 알려진네트워크 가속기http://jarvis:5000
, 웹 서버와 같은 애플리케이션에는 이러한 기능이 부족할 수 있으므로 인증 및 로깅과 같은 기능도 추가됩니다 .
ㅏ투명 프록시클라이언트가 브라우저의 프록시별 구성 없이 기본적으로 모든 웹 서버에 액세스할 수 있어야 하는 경우에 사용됩니다. 네트워크(일반적으로 라우터)는 브라우저와 유사한 연결을 프록시로 가로채서 리디렉션한 다음 프록시 캐싱을 적용할 수 있습니다. 국제 트래픽을 최소화하거나 맬웨어 검사 또는 성인 콘텐츠 필터링과 같은 기능이 구현되었습니다.
ㅏ역방향 프록시특정 웹 서버 또는 서버 그룹만 관련됩니다. 백엔드 서버 세트의 로드 밸런싱을 수행하거나 인증되지 않은 HTTP만 제공하는 장치에 인증 또는 HTTPS와 같은 항목을 추가하는 데 사용할 수 있습니다.
당신이 정말로 원하는 것이 실제로 더 비슷하다면역방향 프록시, 실제 웹 서버의 프록시 기능을 사용하는 것이 더 나을 수 있습니다. 이는 주요 요구 사항인 것으로 보이는 더 나은 HTTP 서버 측 인증 기능을 제공하기 때문입니다.
Apache를 사용하면 다음과 같은 작업을 수행할 수 있습니다.
<Location />
AuthType Basic
AuthName "Restricted Service"
# (Following line optional)
AuthBasicProvider file
AuthUserFile "/etc/apache/htpasswd"
Require user me
ProxyPass http://jarvis:5000
ProxyPassReverse http://jarvis:5000
</Location>
그리고 다음을 사용하여 파일을 초기화합니다 /etc/apache/htpasswd
.
# htpasswd -c /usr/local/apache/passwd/passwords me
New password: itsame
Re-type new password: itsame
Adding password for user me
서버가 http://jarvis:5000
출력하는 HTML에 자신에 대한 링크 또는 기타 참조를 포함하고 이러한 참조를 조정하도록 서버를 구성할 수 없는 경우 서버가 localhost 인터페이스에서만 수신하도록 하는 등 몇 가지 트릭을 사용해야 할 수 있습니다. 포트 5000에서 수신 대기하는 유일한 실제 네트워크 인터페이스입니다.
여기에서 서버의 기능에 대해 더 자세히 아는 것이 중요합니다 http://jarvis:5000
. 클라이언트가 액세스하는 데 사용한다고 말하는 호스트 이름과 포트를 사용하여 응답을 구성하는 경우("글쎄, 해당 정보로 인해 클라이언트가 나에게 연결되었으므로 정확해야 합니다" 원칙) 이는 쉬울 것입니다. 그러나 특정 프로토콜, 호스트 이름 및 포트를 사용하여 HTML을 하드코딩하고 자체에 대한 링크를 포함하며 구성할 수 없는 경우 원하는 결과를 얻으려면 호스트 이름을 사용하거나 응답 HTML URL에서 실시간 편집이 필요할 수 있습니다.