포트 포워딩 - iptables에 POSTROUTING 규칙이 필요한 이유는 무엇입니까?

포트 포워딩 - iptables에 POSTROUTING 규칙이 필요한 이유는 무엇입니까?

두 개의 서버가 있다고 가정해 보겠습니다.

-->서버 A의 IP는 XXX.XXX.XXX.XXX입니다.

-->서버 B의 IP 주소는 YYY.YYY.YYY.YYY입니다.

내가 원하는 것은 서버 A(포트 80)에서 서버 B(포트 80)로 트래픽을 리디렉션하는 것입니다.

간단한 접근 방식은 서버 A에 iptables에 다음 규칙을 적용하는 것입니다.

iptables -t nat -A PREROUTING -p tcp --dport port -j DNAT --to-destination server B:80

그러나 이 간단한 규칙은 작동하지 않습니다. 다음 규칙을 추가해야 합니다.

iptables -t nat -A POSTROUTING -j MASQUERADE

왜 이런거야? POSTROUTING 규칙을 추가해야 하는 이유는 무엇입니까? PREROUTING 후에 패킷은 자동으로 서버 B로 이동해야 합니다. 그렇죠?

답변1

* 저는 iptables나 Linux 네트워크 스케줄링에 대한 전문가는 아니지만 도움을 드리고자 노력하겠습니다!

설명에 따르면(네트워크 주소 해석) 테이블,iptables 매뉴얼 페이지:

"이 테이블은 새로운 연결을 생성하는 패킷이 발견될 때 참조됩니다. 이는 세 가지 내장 기능으로 구성됩니다: PREROUTING(패킷이 들어온 후 즉시 변경하는 데 사용됨), OUTPUT(패킷을 라우팅하기 전에 로컬 생성을 변경하는 데 사용됨) ) 그리고POSTROUTING(패킷이 전송되려고 할 때 변경하기 위해)".

POSTROUTING 체인은 패킷이 전송되기 전에 패킷을 변경합니다.

아래에는 MASQUERADE 설명이 있습니다.Linux 문서화 프로젝트나는 또한 귀하의 메시지를 의미있게 만듭니다.

  • 나는 기계에게 말한다.두번째내 PPP 또는 이더넷으로 연결된 Linux 상자그 관문이다.
  • 패킷이 리눅스 박스에 들어갈 때~에서두번째, 패킷에 새로운 TCP/IP 소스 포트 번호를 할당하고 패킷 헤더에 자체 IP 주소를 삽입합니다.원본을 저장하세요. 그러면 마스커레이드 서버는 수정된 패킷을 PPP/ETH 인터페이스를 통해 인터넷으로 보냅니다.
  • 패킷이 인터넷에서 Linux 상자로 돌아올 때, Linux는 포트 번호가 위에 할당된 포트 중 하나인지 확인합니다. 그렇다면 마스커레이드 서버는 원래의 포트와 IP 주소를 얻고 이를 반환된 패킷 헤더에 다시 넣은 다음 패킷을 다음으로 보냅니다.두번째.
  • 패킷을 보내는 호스트는 그 차이를 전혀 알 수 없습니다.

답변2

귀하의 질문은 두 부분으로 구성됩니다.

  1. MASQUERADE 규칙이 필요한 이유
  2. POSTROUING 체인에 있어야 하는 이유는 무엇입니까?
  3. 대안이 있나요?

첫 번째 질문에 대답하려면 먼저 iptables NAT의 작동 방식을 이해해야 합니다. NAT 테이블은 연결에 적용되어야 하는 변환을 결정하기 위해 연결의 첫 번째 패킷에서 사용됩니다. 첫 번째 패킷이 처리되면 연결에 대한 후속 패킷을 처리하는 데 사용되는 내부 매핑 테이블 항목이 생성되지만 상자는 표시된 패킷만 처리할 수 있습니다.

따라서 XXX.XXX.XXX.XXX 및 YYY.YYY.YYY.YYY는 특별한 경로가 구성되지 않은 인터넷상의 서버라고 가정합니다. 클라이언트도 방화벽이 없는 개방형 인터넷에 있고 IP가 ZZZ.ZZZ.ZZZ.ZZZ라고 가정합니다. 마스커레이드(MASQURADE) 규칙 없이 어떤 일이 일어나는지 살펴보겠습니다.

  • 클라이언트는 초기 데이터 패킷 ZZZ.ZZZ.ZZZ.ZZZ:1234 -> XXX.XXX.XXX.XXX:80을 보냅니다.
  • 패킷은 대상 NAT를 수행하는 서버 A에 도달하므로 이제 패킷은 ZZZ.ZZZ.ZZZ.ZZZ:1234 -> YYY.YYY.YYY.YYY:80이 되어 연결 추적 항목을 생성하고 패킷을 다시 네트워크에 넣습니다. .
  • ISP는 이 시점에서 "스푸핑"을 위해 패킷을 차단하거나 서버 B로 전달할 수 있습니다. 그들이 그것을 서버 B에 전달한다고 가정해 봅시다.
  • 패킷이 서버 B에 도착하고 서버 B는 YYY.YYY.YYY.YYY:80 -> ZZZ.ZZZ.ZZZ.ZZZ:1234 응답을 생성합니다.
  • 응답이 클라이언트에 전달됩니다.
  • 클라이언트는 소켓 테이블에서 응답을 찾지만 일치하는 항목을 찾지 못하고 패킷을 삭제합니다(응답에서 ICMP 오류를 보낼 수도 있음).

MASQUERADE 규칙을 추가하면 상황은 어떻게 바뀌나요?

  • 클라이언트는 초기 데이터 패킷 ZZZ.ZZZ.ZZZ.ZZZ:1234 -> XXX.XXX.XXX.XXX:80을 보냅니다.
  • 패킷이 Target NAT를 수행하는 서버 A에 도착합니다.그리고MASQURADING이므로 패킷은 이제 XXX.XXX.XXX.XXX:5678 -> YYY.YYY.YYY.YYY:80이 되어 네트워크에 다시 연결됩니다.
  • ISP는 서버 B에 패킷을 전달합니다.
  • 데이터 패킷이 서버 B에 도달하고 서버 B는 YYY.YYY.YYY.YYY:80 -> XXX.XXX.XXX.XXX:5678 응답을 생성합니다.
  • 응답은 서버 A로 전송됩니다.
  • 서버 A는 연결 추적 테이블에서 패킷을 찾고 소스와 대상을 XXX.XXX.XXX.XXX:80 -> ZZZ.ZZZ.ZZZ.ZZZ:1234로 변경합니다.
  • 네트워크는 클라이언트에게 응답을 전달합니다.
  • 클라이언트는 소켓 테이블에서 응답을 조회하고 일치하는 항목을 찾습니다. 연결이 성공적으로 설정되었습니다.

나는 실제로 질문 2에 대한 답을 가지고 있지 않습니다. iptables는 SNAT/MASQUERADE가 POSTROUTING에서만 수행될 수 있다고 주장하지만 이것이 사실이어야 하는 기술적 이유는 보이지 않습니다.


MASQUERADE를 피하고 싶은 이유가 있을 수 있습니다. 여기에는 몇 가지 문제가 있습니다. 첫째, 남용 제어에 사용하려고 했던 원래 트래픽 소스에 대한 정보를 잃습니다. 둘째, 서버 A에는 포트 공급이 제한되어 있습니다.

이 문제는 해결될 수 있지만 두 서버가 모두 우리의 통제하에 있는 경우에만 가능합니다. 해결 방법에는 세 단계가 포함됩니다.

  • 서버 A와 B 사이에 일종의 터널을 설정합니다. 터널 끝점에는 개인 IP 주소가 할당됩니다.
  • 서버 A에서는 서버 B의 터널 IP에 대한 트래픽을 DNAT합니다.
  • 서버 B에서는 정책 라우팅을 사용하여 서버 B의 개인 IP 트래픽이 인터넷으로 다시 전송되는 대신 터널을 통해 서버 A로 전송됩니다.

관련 정보