편집하다

편집하다

내 네트워크 구성은 다음과 같습니다.

내 네트워크 구성 http://daveden.files.wordpress.com/2013/05/network-configuration.png

프록시 서버는 포트 3128에서 Squid를 사용하고 포트 8080에서 DansGuardian을 사용하여 Ubuntu를 실행하고 있습니다.

모든 클라이언트가 모든 HTTP/HTTPS 액세스에 대해 프록시 서버(특히 포트 8080)를 사용하도록 하고 싶습니다.

그러나 HTTPS에서는 작동하지 않기 때문에 투명하게 리디렉션하고 싶지 않습니다. 나는 각 클라이언트를 구성하는 데 신경 쓰지 않으며 각 클라이언트가 프록시 서버를 사용하고 있다는 것을 알고 있다는 점도 신경 쓰지 않습니다. 나는 클라이언트가 프록시 설정 없이 웹 서핑을 할 수 있는 것을 원하지 않습니다.

어떻게 해야 하나요? 클라이언트가 포트 8080에서 프록시 서버를 사용하도록 구성되지 않은 경우 패킷을 삭제할 수 있습니까?

iptables를 사용하여 8080 이외의 dport가 있는 패킷을 삭제하려고 시도했지만 너무 많이 거부되어 더 이상 아무것도 액세스할 수 없었습니다.

편집하다

나는 이 질문을 iptables에 국한되지 않도록 다시 작성했지만 iptables 사용에 전혀 반대하지는 않습니다. 나는 단지 더 넓은 범위의 가능한 솔루션을 끌어들이고 싶을 뿐입니다.

편집 2

제가 뭔가 잘못된 인상을 주었을 수도 있겠다는 생각이 듭니다. 분명히 말씀드리자면 저는 전혀 관심이 없습니다.필터링HTTPS 트래픽(즉, 프록시에서 패킷을 분리하여 내용을 검사하는 것) 나는 그것에 더 관심이있다블로킹HTTP 또는 HTTPS(패킷의 대상을 확인하여)를 통해 DansGuardian을 사용하는 사이트.

편집 3

아래 Alexandru-Florin Vintil의 제안을 바탕으로 현재 수행 중인 작업은 다음과 같습니다.

# Redirect HTTP traffic to port 8080 (DansGuardian)
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080

# Check TCP and UDP traffic against whitelist
iptables -A FORWARD -i eth1 -p tcp --dport 443 -j whitelist
iptables -A FORWARD -i eth1 -p udp --dport 443 -j whitelist

# Drop all other HTTPS traffic
iptables -A FORWARD -i eth1 -p tcp --dport 443 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 443 -j DROP

# Drop all traffic aimed straight at the proxy
iptables -A FORWARD -i eth1 -p tcp --dport 3128 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 3128 -j DROP
iptables -A FORWARD -i eth1 -p tcp --dport 8080 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 8080 -j DROP

간단히 말해서, HTTP 트래픽을 포트 8080으로 리디렉션하고, 화이트리스트에 포함되지 않은 모든 HTTPS 트래픽을 삭제하고(별도의 체인에서) 프록시를 명시적으로 사용하는 모든 트래픽을 삭제합니다. 마지막 규칙이 없으면 클라이언트는 프록시를 사용하도록 브라우저를 구성하는 한 HTTPS를 사용하여 모든 웹 사이트에 액세스할 수 있습니다. 그 이유는 대상 포트가 443이 아닌 8080이기 때문입니다. 따라서 443에 바인딩된 모든 트래픽을 삭제하더라도 HTTPS가 완전히 차단되지는 않습니다. .

답변1

내 2센트:

HTTP 관련: 방화벽이 포트 80 트래픽을 프록시/필터로 투명하게 전달하도록 하는 것이 작업을 수행하는 가장 간단한 방법입니다. 클라이언트 구성이 필요하지 않습니다. + 클라이언트를 재구성할 필요 없이 프록시 사용에서 모든 호스트/서브넷을 제외할 수 있습니다. 이것이 프록시를 통과해야 하는 모든 것이 제대로 작동하는지 확인할 수 있는 유일한 방법입니다.

나가는 모든 HTTPS 443 트래픽을 차단하고 나가는 포트 443에 허용되는 IP 기반 사이트의 하위 집합만 허용하는 것 이외의 방법은 예상대로 작동하지 않습니다. HTTPS의 보안 프로토콜은 중간자 공격(프록시는 "합법적" MITM임)을 방지하도록 설계되었습니다(몇 가지 결함 제외). 이런 방식으로 HTTPS는 설계된 대로 작업을 수행할 수 있습니다. 그러나 당신이 원한다면무시하다HTTPS의 경우 CONNECT(태핑)를 사용하지 않고 DIRECT를 사용하도록 오징어를 설정해야 하지만, 이 경우에도 여전히 HTTP/HTTPS 부분이 혼합되어 문제가 있는 웹 사이트가 발생할 수 있습니다. 이렇게 하면 Squid 프록시가 HTTPS도 관리하게 됩니다. 이는 방화벽의 투명한 전달 부분에도 반영되어야 합니다.

답변2

작동해야 할 것이 작동하지 않는 것을 볼 때마다, 보지 못하는 다른 요소가 관련되어 있는지 물어봐야 합니다. 규칙

sudo iptables -A INPUT -p tcp ! --dport 8080 -j REJECT

작동해야 할 것 같지만첨부됨INPUT 체인에 연결되므로 체인의 이전 규칙에 의해 우회되었을 수 있습니다. INPUT 체인은 들어오는 패킷이 도달하는 첫 번째 체인이므로 이 규칙은 그 자체로 적합해야 합니다. INPUT 체인에서 REJECT되면 FORWARD 또는 OUTPUT 체인에 도달하지 못합니다. 물론 이 규칙은 차단됩니다.모든 것포트 8080으로 향하지 않는 TCP는 8080의 프록시가 시스템의 유일한 서비스이고 콘솔에서만 로그인하지 않는 한 결국 실제로 원하는 것이 아닐 것입니다.

따라서 가장 먼저 해야 할 일은 규칙을 나열하고 패킷 통과의 원인이 무엇인지 찾는 것입니다.

sudo iptables -L

방화벽이 역방향 NAT를 사용하는 경우 NAT 테이블도 나열해야 합니다.

sudo iptables -L -t nat

그런 다음 동일한 규칙을시작체인의:

sudo iptables -I INPUT -p tcp ! --dport 8080 -j REJECT

iptables그래도 문제가 해결되지 않는지 확인하거나 최소한 규칙 세트를 완료할 수 있도록 작동 방식을 이해했다는 확신을 더 많이 주세요 . 이 호스트에서 원격으로 작업하는 경우 제 제안에 따라 작업이 중단될 수 있으므로 콘솔에서만 이 작업을 수행해야 합니다. 원격에서 안전하게 작업하려면 동료를 만나세요원격에서 방화벽을 조정하는 방법에 대한 Eli Rosencruft의 게시물.

답변3

기준

별도의 (사용자 정의) 체인이 도움이 될 수 있습니다.

# create a chain just for user 100 (192.168.1.100)
iptables -N custom_user_100

# redirect all traffic FROM user 100 to custom chain
iptables -A INPUT -p tcp -s 192.168.1.100 -j custom_user_100

# return from user chain for valid traffic, drop all other
iptables -A custom_user_100 -p tcp --dport 8080 -j RETURN
iptables -A custom_user_100 -j DROP

따라서 이것이 수행하는 작업은 192.168.1.100의 모든 트래픽을 사용자 지정 체인으로 리디렉션하는 것입니다. 이 사용자 정의(사용자 정의) 체인은 유효한 일치 항목(포트 8080으로 향하는 트래픽)이 발견된 경우에만 반환됩니다. 체인에서 반환되지 않는 기타 모든 일치하지 않는 트래픽은떨어졌다.

나중에 테이블 통계를 보고 무슨 일이 일어났는지 확인할 수 있습니다.

iptables -L -v -n

전송

이제 전달 트래픽을 처리하는 경우에는 다른 규칙 세트가 있지만 사용자 정의(사용자 정의) 체인을 사용하는 아이디어는 동일합니다. 다음 링크의 다이어그램을 참조하고 싶습니다.http://www.csie.ntu.edu.tw/~b93070/CNL/v4.0/CNLv4.0.files/Page697.htm패킷의 흐름을 이해하려고 할 때.

이 경우 다음과 같은 작업을 수행할 수 있습니다.

# create a chain just for user 100 (192.168.1.100)
iptables -N custom_user_100

# redirect all traffic FROM user 100 to custom chain
iptables -A FORWARD -p tcp -s 192.168.1.100 -j custom_user_100

# return from user chain for valid traffic, drop all other
iptables -A custom_user_100 -p tcp --dport 8080 -j RETURN
iptables -A custom_user_100 -j DROP

이는 INPUT 체인에 적용된 규칙이 대신 FORWARD 체인에 적용된다는 점을 제외하면 첫 번째와 동일합니다.

업데이트 2013-05-24

귀하의 질문을 다시 읽었습니다. 그래서 다시 시작하겠습니다.

"프록시"가 실제로 라우터라고 가정해 보겠습니다. 즉, NAT를 사용하여 한 인터페이스에서 다른 인터페이스로 모든 패킷을 전달하는 것입니다. 이는 관심 있는 모든 패킷이 FORWARD 체인을 통해 흐르고 있음을 의미합니다.

다음: 프록시 자체에 도달하도록 포트 8080을 사용하는 모든 클라이언트를 구성한다고 말합니다. 괜찮은. 이는 모든저것들패킷은 INPUT 체인을 통해 "프록시"로 들어갑니다.

따라서 FORWARD 체인의 포트 8080으로 나가는 사람을 방지하고 싶을 뿐입니다.

iptables -A FORWARD -p tcp --dport 8080 -j REJECT

이 규칙은 8080의 대상 포트로 전달될 모든 것이 거부되도록 보장합니다(ICMP 패킷은 프록시를 통해 패킷을 전달하려고 시도한 클라이언트로 전송됩니다).

이 규칙을 구현한 후에는 금지된 연결을 시도하여 이를 테스트하는 것이 중요합니다. 그런 다음 다음을 입력하여 규칙을 나열합니다.

iptables -L -v -n |grep 8080

카운터가 증가했는지 확인하세요. 그렇지 않다면 라우터 구성에 문제가 있는 것입니다.

답변4

클라이언트가 프록시 없이 http{s} 사이트에만 액세스하는 것을 원하지 않으면 패킷을 포트 80 및 443으로 전달하거나 DROP다음 과 같이 하십시오.REJECT

IPTABLES -I FORWARD -i eth1 -p tcp -m multiport --dports 80,443 -j REJECT

eth1내부 인터페이스는 어디에 있습니까? 이렇게 하면 다른 포트/액세스를 조작할 필요가 없습니다.

관련 정보