IPTable 및 투명 프록시

IPTable 및 투명 프록시

에 로컬 투명 TCP 프록시를 설정했습니다 localhost. 모든 TCP 트래픽을 해당 프록시로 리디렉션하여 처리할 수 있고 아무것도 "유출"되지 않도록 하여 프록시를 우회하고 싶습니다. 트래픽을 리디렉션하려면 IPTable을 사용해야 합니다. TPROXY 사용을 고려했지만 이를 위해서는 애플리케이션 지원이 필요하며 현재는 REDIRECT 대상만 지원합니다.

다음 IPTables 규칙을 사용했습니다.

iptables -t nat -A OUTPUT -o lo -j RETURN
iptables -t nat -A OUTPUT -d 127.0.0.0/8 -j RETURN
iptables -t nat -A OUTPUT -d 192.168.0.0/16 -j RETURN
iptables -t nat -A OUTPUT -m owner --uid-owner proxy-owner -j RETURN
iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports $PROXY_PORT

iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -d 127.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner proxy-owner -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -j LOG
iptables -P OUTPUT DROP

그들을~인 것 같다잘 작동하는데 왜 그런지 궁금합니다.

아직 답을 모르는 두 가지 질문은 다음과 같습니다.

1) NAT 테이블의 마지막 규칙에 대해,--synSYN 패킷을 로컬 프록시 포트( ) 로만 리디렉션하려는 이유는 무엇입니까 ? 모든 TCP 패킷을 리디렉션하고 싶습니다. 현재 구성에서는 SYN 패킷만 로컬 프록시로 리디렉션되고 다른 모든 패킷은 대상으로 직접 흐르도록 허용되어 (이론적으로) 완전한 혼란을 초래하는 것으로 보입니다(또는 SYN을 제외한 모든 패킷은 필터링된 장치 블록임) 테이블 ). 그러나 해당 --syn옵션을 제거하고 모든 패킷을 로컬 프록시로 리디렉션하면 프록시가 전혀 작동하지 않습니다. 왜?

2) 필터 테이블의 4번째 규칙에 대해,나가는 설정된 연결을 명시적으로 허용해야 하는 이유는 무엇입니까?어쨌든, 프록시는 로컬 호스트가 아닌 대상으로 패킷을 보낼 수 있는 유일한 응용 프로그램이며 이미 그렇게 할 수 있도록 허용되어 있습니다(규칙 3). 그러면 네 번째 규칙으로 무엇을 해야 합니까? 프록시가 아닌 연결이 프록시를 우회하도록 허용하는 것 같습니다.

감사합니다!

답변1

답변:

  1. SYN만 일치시키려는 데에는 두 가지 이유가 있습니다. 첫째, 이후에 설정된 모든 패킷은 conntrack(사용자가 요청한 두 번째 줄)을 통해 전달됩니다. 무엇이든아니요SYN이 아닌 conntrack과 일치하는 것은 확립되지 않은 패킷이며 속하지 않습니다. 따라서 이 시점에서는 무시되고 결국 필터 테이블의 마지막 규칙에 의해 삭제됩니다. 이는 사용자 활동으로부터 에이전트 프로세스를 보호하는 방법입니다. 예를 들어, 일부 형태의 네트워크 검색은 단지 원격 장치가 어떻게 반응하는지 확인하기 위해 ACK 또는 FIN 전송을 시작하는 반면, 일부 응용 프로그램은 잘못된 형식/예기치 못한 패킷을 수신할 때 심하게 정지됩니다.

  2. 추적된 트래픽을 명시적으로 허용하는 이유는 무엇입니까? 마지막 줄은 모든 것을 무차별적으로 버리기 때문입니다. Discard를 그대로 두고 conntrack을 제거하면 프록시-클라이언트 통신을 위한 패킷이 삭제됩니다. 여기에는 매우 미묘한 차이가 있습니다. uid 소유자를 기준으로 일치하는 행은 패킷과만 일치합니다.생성됨대리 소유자별. 클라이언트에서 프록시로 전송되는 수신 패킷은 다음과 같습니다.아니요대리인이 소유합니다.

다음 다이어그램을 고려하십시오.

[ client ] <---traffic---> [ proxy ] <---traffic---> [ target ]

왼쪽에는 클라이언트와 프록시 간의 트래픽이 있습니다.아니요에이전트가 소유하므로(시스템 외부의 신뢰할 수 없는 소스에 의해 생성됨) 필터 라인 3과 일치하지 않습니다. 즉, 필터 라인 4가 없으면 필터 라인 6에 의해 삭제됩니다.

올바른 프록시와 대상 간의 트래픽에이전트가 소유하므로(로컬 UID에서 실행되는 프로세스에 의해 생성됨) 항상 nat 라인 4와 필터 라인 3에서 허용됩니다.

귀하의 경우에는 모두 로컬에서 실행되므로 이것이 최선의 방법이 아닐 수도 있습니다. 다양한 방법으로 iptables규칙을 만들 수 있습니다. 결국에는 이것이 여전히 효과가 있을 것입니다. iptables에 대해 더 많이 알고 있다면 규칙을 수정할 수 있지만 그대로 둘 수도 있습니다.

이게 도움이 되길 바란다. 이것은 상당히 복잡한 주제입니다.

답변2

질문의 두 부분이 모두 관련되어 있습니다.

파트 (1)은 SYN 패킷을 캡처하고 제안한 대로 리디렉션합니다. 이 시점부터 conntrack(2)이 스트림의 모든 후속 패킷이 동일한 연결의 일부임을 인계받아 인식하고 원래 SYN 패킷과 동일한 방식으로 리디렉션합니다.

연결 추적에 대한 개요는 다음에서 확인할 수 있습니다.http://en.wikipedia.org/wiki/Netfilter#Connection_Tracking

답변3

트래픽을 리디렉션하려면 iptables를 사용해야 합니다.

아니요. 이 호스트가 인터넷에 액세스할 수 있는 유일한 호스트가 되도록 네트워크를 설정하고 다른 모든 호스트에게 이를 라우터로 사용하도록 지시하면 됩니다.

필요한 또 다른 것은 NAT/가면입니다. 이를 프록시로 작동시키려는 것은 어리석은 일입니다.

관련 정보