iptables를 사용하여 모든 포트에서 단일 로컬 포트로 나가는 트래픽 프록시

iptables를 사용하여 모든 포트에서 단일 로컬 포트로 나가는 트래픽 프록시

저는 Linux 시스템과 프록시 서버가 동일한 시스템에서 실행 중이며 127.0.0.1:1080을 수신하고 있습니다. 나는 iptables그것을 사용하여 다음을 달성 하고 싶습니다 .

  1. 포트 1080을 통한 모든 HTTP(S) 요청의 경우 처리 없이 직접 연결
  2. 다른 포트의 모든 HTTP(S) 요청의 경우 127.0.0.1:1080을 통해 프록시
  3. 들어오는 요청은 건드리지 않고 정상적으로 수신됩니다.

내가 왜 나가는 요청을 자체적으로 프록시 처리하는지 궁금할 수도 있습니다. 그 이유는 프록시 서버가 난독화 및 기타 멋진 작업도 수행하기 때문입니다.

나는 많은 답변을 읽었지만 대부분은 일부 특정 포트(예: 80)를 통한 요청에만 관심이 있는 반면, 나는 하나의 포트를 제외한 모든 것을 원합니다.

다음과 같은 명령을 사용할 수 있다는 것을 알고 있습니다.

iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination 127.0.0.1:1080

하지만 이것이 자체 라우팅 루프를 일으킬 수도 있다고 생각합니다.

존재하다이 블로그, 저자는 솔루션을 제공합니다

서버와 동일한 시스템에서 클라이언트를 실행하려는 경우(커피숍에서 노트북을 사용합니다. 패스트리를 주세요) PREROUTING 테이블은 외부의 패킷에만 작동하므로 사용할 수 없습니다. 우리가 할 수 있는 일은 클라이언트 프로세스가 출력하는 패킷의 대상 포트를 수정하는 것입니다. 문제는 이것이 mitmproxy의 패킷 출력에도 영향을 미치고 라우팅 루프에 갇히게 된다는 것입니다.

이 문제를 해결하는 방법은 여러 가지가 있을 수 있지만 저에게 효과가 있었던 방법은 mitmproxy를 루트로 실행하고 iptables 규칙이 루트 소유 프로세스에 적용되지 않도록 만드는 것이었습니다.

sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner root --dport 443 -j REDIRECT --to-port 8080

  • -m owner: 소유자 모듈을 로드합니다.
  • ! –uid-owner root:루트 소유 프로세스에는 규칙이 적용되지 않습니다.

하지만 내 컴퓨터에는 사용자가 한 명뿐 root이므로 이를 위해 다른 사용자를 만들 생각은 없습니다.

/proc/sys/net/ipv4/ip_forward그런데 이 경우에는 1로 설정해야 하는지 잘 모르겠습니다 .

운영 체제가 새로 설치된 Ubuntu 20.04라고 가정할 수 있습니다.

편집: "트래픽"이 HTTP 요청을 참조한다는 설명입니다.

답변1

# Enable routing
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
# Enable forwarding to loopback interface
sudo sysctl -w net.ipv4.conf.eth0.route_localnet=1
# Forward all TCP  except TCP/1080
iptables -t nat -A OUTPUT -p tcp ! --dport 1080 -j DNAT --to-destination 127.0.0.1:1080
# Enable NAT (aka Masqurade)
sudo iptables -t nat -A POSTROUTING -j MASQUERADE

관련 정보