다른 로컬 포트를 통해 나간 후 TCP 패킷의 대상 포트를 유지합니다.

다른 로컬 포트를 통해 나간 후 TCP 패킷의 대상 포트를 유지합니다.

질문:

host1TLS 암호화된 TCP 패킷을 다른 호스트(호칭)의 포트 5015로 보내는 호스트(호칭)에 상주하는 애플리케이션이 있습니다 host2. 네트워크 제한으로 인해 host1모든 인바운드 및 아웃바운드 트래픽은 80 또는 443을 통해 들어오고 나가야 합니다. 에 액세스할 수 없습니다 host2.

방법:

host1내 생각은 5015에서 443 트래픽을 라우팅/리디렉션/전달하고 도착하도록 하는 iptables 규칙을 만들 수 있다는 것입니다 host2:5015. 내가 겪고 있는 문제는 올바른 규칙을 만드는 것입니다. 이것이 내가 지금까지 가지고 있는 것입니다:

TCP_TRAFFIC_PORT=5015
PROXY_PORT=443

_apply_outbound_rules() {
    # Forward outgoing packets through the proxy port
    sudo iptables -t nat \
        -I OUTPUT 1 \
        -p tcp --destination-port $TCP_TRAFFIC_PORT \
        -j DNAT --to-destination :$PROXY_PORT

    # Send packets to host2:5015 port (this is likely the rule to fix)
    sudo iptables -t nat \
        -I POSTROUTING 1 \
        -p tcp --destination-port $PROXY_PORT \
        -j SNAT --to-source :$TCP_TRAFFIC_PORT
}

apply_outbound_rules

이 작업을 수행하는 방법을 아는 사람이 있나요? 이게 흔한 일인 것 같은데 고민이 되네요.

답변1

첫째, Linux의 NAT는 상태 저장입니다. 즉, 아웃바운드 및 인바운드 규칙이 필요하지 않습니다. 트래픽이 NAT를 통해 아웃바운드로 반환되면 Linux는 자동으로 반환 트래픽의 NAT를 해제합니다.

하지만 직면하게 될 주요 문제는 TCP 세션이 다음의 조합으로 정의된다는 것입니다.

  • 소스 IP
  • 소스 포트
  • 대상 IP
  • 목적지 포트

소스 IP는 단일 값(host1의 IP)으로 제한됩니다. 대상 IP는 이미 단일 값(호스트 2의 IP)입니다. 소스 포트에는 2가지 값(80과 443)만 가능합니다. 그리고 대상 포트는 단일 값(5015)으로 제한됩니다.
이는 최대 2개의 동시 연결만 가질 수 있음을 의미합니다(2개의 포트에 걸쳐 SNAT의 부하를 분산하는 경우). 순차 연결을 사용하더라도 TIME_WAIT 상태의 포트와 같은 포트 재사용 문제가 발생할 수 있습니다.

하지만 정말로 이것을 시도하고 싶다면 따라야 할 규칙은 다음과 같습니다.

iptables -t nat -I POSTROUTING \
  -d $HOST2_IP -p tcp --dport $TCP_TRAFFIC_PORT \
  -j SNAT --to-source :$PROXY_PORT

답변2

애플리케이션이 호스트에서 실행 중인 포트를 알고 있습니까? 그렇지 않은 경우 모든 소스 포트를 80 또는 443에 매핑해야 합니다.

아래에서 host2ip를 바꿔보세요.

iptables -t nat -A POSTROUTING -p tcp -d host2ip -j SNAT -m multiport  --sports 1:65535 --to-source :443

관련 정보