iptables: 투명한 TCP 트래픽 프록시

iptables: 투명한 TCP 트래픽 프록시

질문:

저는 TCP 서버와 클라이언트가 있고 각각 포트 9000을 수신하고 있습니다. 트래픽이 포트 80을 통해서만 전달되는 두 개의 서로 다른 호스트에 서버와 클라이언트를 배포했습니다. PREROUTING 규칙이 --source-port.

방법:

서버가 포트 9000에서 포트 80으로 트래픽을 라우팅하도록 iptables 규칙을 설정하려고 하고, 포트 80에서 들어오는 트래픽이 로컬에서 9000으로 라우팅되는 클라이언트에 대한 무료 규칙을 설정하려고 합니다.

규칙을 적용하기 위해 이 스크립트를 생각해 냈습니다. 몇 가지 변형을 시도해 보았는데 패킷이 서버 호스트에서는 허용되지만 PREROUTING(인바운드) 규칙에서는 허용되지 않는 것 같습니다.

#!/bin/bash

apply_inbound_rules() {
    # Allow incoming server traffic from port 80 to the TCP client
    sudo iptables -t nat \
        -I PREROUTING \
        -p tcp --destination-port $PROXY_PORT \
        -j REDIRECT --to-port $TCP_PORT
}

apply_outbound_rules() {
    # Setup outgoing packets created by the TCP server
    # to route through local port 80
    # and received on port 80 on the client host
    sudo iptables -t nat \
        -I OUTPUT \
        -p tcp --destination-port $TCP_PORT \
        -j DNAT --to-destination :$PROXY_PORT

    # To maintain the TCP_PORT
    sudo iptables -t nat \
        -I POSTROUTING \
        -p tcp --destination-port $PROXY_PORT \
        -j SNAT --to-source :$TCP_PORT
}

apply_inbound_rules
apply_outbound_rules

이런 규칙을 만들어 본 경험이 있는 사람이 있나요? 이것은 일반적인 문제인 것 같지만 알아낼 수 없는 것 같습니다.

답변1

이것은 내 댓글을 답글로 번역한 것입니다.

반환 패킷을 처리하기 위해 소스 포트의 아웃바운드 MASQUERADE에 의존하도록 규칙을 조정해야 합니다. 따라서 나가는 패킷은 보유한 규칙을 사용하여 DNAT로 처리되어야 하며 다음 규칙을 사용하여 MASQUERADE로 처리되어야 합니다.

iptables -t nat -A POSTROUTING -p tcp --destination-port $PROXY_PORT -j MASQUERADE --to-ports $TCP_PORT

이 규칙을 사용하세요대신에SNAT 규칙.

MASQUERADE 처리된 패킷과 관련된 수신 패킷은 적절한 반환 매핑 대상 포트를 얻습니다.

(댓글을 토대로 수정했습니다)

관련 정보