iptables는 특정 외부 IP의 트래픽을 다른 로컬 IP로 라우팅하고 외부 IP를 소스로 사용하여 응답을 반환합니다.

iptables는 특정 외부 IP의 트래픽을 다른 로컬 IP로 라우팅하고 외부 IP를 소스로 사용하여 응답을 반환합니다.

내 Raspberry Pi는 내 라우터와 나머지 홈 네트워크 사이에 위치하는 표준 게이트웨이입니다. 내 데스크톱 컴퓨터가 특정 외부 IP로 패킷을 보낼 때 Raspberry Pi가 해당 패킷을 다른 로컬 컴퓨터로 보내도록 하고 싶습니다. (게임 서버를 에뮬레이션하려고 시도하지만 게임에 서버 IP가 하드코딩되어 있습니다.) 이는 TCP와 UDP 모두에서 작동해야 합니다.

내 라즈베리 파이에서 다음 규칙을 시도했습니다. ( 1337=게임 포트, 1.2.3.4=게임 서버, 192.168.0.169=다른 로컬 머신 에뮬레이트 서버)

iptables -t nat -A PREROUTING -d 1.2.3.4/32 -p udp -m udp --dport 1337 -j DNAT --to-destination 192.168.0.169:1337
iptables -t nat -A PREROUTING -d 1.2.3.4/32 -p tcp -m tcp --dport 1337 -j DNAT --to-destination 192.168.0.169:1337

UDP는 잘 작동합니다. 전송된 패킷은 라우팅되고 192.168.0.169응답이 반환됩니다. 그러나 그것들은 1.2.3.4(존재하지 않는 게임 서버) 에서 오는 것이 아니라 내 시뮬레이션 서버에서 나옵니다 192.168.0.169. UDP의 경우 이는 중요하지 않지만 TCP의 경우 이로 인해 핸드셰이크가 실패합니다.

라인샤크

(내 데스크톱 컴퓨터는 192.168.0.199. 시뮬레이션된 게임 서버의 Wireshark 보기 입니다 192.168.0.169. 제가 아는 한 SYN ACK가 작동하지 않아 재전송이 발생합니다. SYN ACK가 예상치 못한 IP에서 오기 때문인 것 같습니다.)

192.168.0.199다음 규칙을 사용하여 패킷의 소스 IP를 다시 작성해 보았습니다.

iptables -t nat -A POSTROUTING -s 192.168.0.169/32 -d 192.168.0.199/32 -p tcp -j SNAT --to-source 1.2.3.4

그러나 그것은 단순히 작동하지 않습니다. 저는 아직 iptables에 익숙하지 않아서 뭔가 잘못하고 있는 것일 수도 있지만, 게임 서버에서 내 데스크톱으로 모든 패킷의 소스를 다시 쓰는 것이 좋은 생각인지는 잘 모르겠습니다(다른 응용 프로그램이 문제를 일으킬 수 있습니다).

보너스 질문: 응답이 있을 때 DNAT가 소스 IP를 다시 작성해야 합니까?

답변1

보너스 질문: 응답이 있을 때 DNAT가 소스 IP를 다시 작성해야 합니까?

예, iptables NAT 규칙은 연결의 첫 번째 패킷에서만 작동하며 후속 패킷은 첫 번째 규칙에 의해 설정된 매핑에 따라 처리됩니다.

전송된 패킷은 192.168.0.169로 라우팅되고 응답이 반환됩니다. 하지만 1.2.3.4(존재하지 않는 게임 서버)가 아니라 시뮬레이션된 서버에서 가져온 것입니다.

문제는 NAT가 자신에게 전송되지 않은 패킷을 변환할 수 없다는 것입니다. 이것이 귀하의 시나리오에서 일어나는 일입니다.

  • 클라이언트는 1.2.3.4로 초기 패킷을 만듭니다.
  • 클라이언트는 라우팅 테이블을 살펴보고 더 나은 경로를 찾지 못하여 기본 게이트웨이(즉, NAT 상자)로 패킷을 보냅니다.
  • NAT 상자는 연결 추적 테이블에서 패킷을 조회하여 새 연결인지 확인하고 NAT 작업을 수행한 후 연결 추적 항목을 설정합니다.
  • NAT는 라우팅 테이블에서 새 대상을 조회하고 패킷을 서버로 보냅니다.
  • 서버는 소스와 대상을 교환하면서 평소와 같이 응답합니다.
  • 서버는 라우팅 테이블을 조회하고 클라이언트 IP와 일치하는 항목을 찾은 다음클라이언트에게 직접 패킷 보내기
  • 응답이 클라이언트에 도달하지만 NAT Box를 통해 돌아오지 않기 때문에 잘못된 소스 IP를 가지고 있습니다.
  • 답글이 삭제되었습니다.

그래서 우리가 뭘 할 수 있지? 한 가지 해결책은 클라이언트에서 서버로의 트래픽을 위장하여 서버가 트래픽이 NAT 상자에서 오는 것으로 인식하도록 하는 것입니다. 나는 다음이 트릭을 수행해야한다고 믿습니다

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.169 -j MASQURADE

관련 정보