MacOS 10.14+에서 IP 매스커레이딩을 수행하는 방법은 무엇입니까?

MacOS 10.14+에서 IP 매스커레이딩을 수행하는 방법은 무엇입니까?

Linux에 해당하는 Macos 명령을 찾고 있습니다.

sudo iptables -t nat -A POSTROUTING -o en0 -j MASQUERADE

내가 이렇게 하고 싶은 이유는 기본 경로가 있는 VPN이 있지만 특정 앱이 VPN이 아닌 물리적 업링크를 통과하기를 원하기 때문입니다.

나는 pfctl다음을 수행했습니다.

pass out route-to (en0 192.168.4.1) group skipvpn flags any

192.168.4.1내 게이트웨이의 IP는 어디에 있으며 이는 그룹 내 앱의 모든 패킷을 터널이 아닌 인터페이스 skipvpn로 라우팅하는 것으로 보입니다. en0나는 이것을 사용하여 이것을 확인합니다tcpdump

그러나 다시 라우팅된 모든 패킷의 '소스 ip'에는 여전히 VPN의 소스 IP( 10.0.0.0/8range-ip)가 있으므로 당연히 문제가 발생합니다(즉, 반환되는 패킷은 결코 되돌아오는 길을 찾을 수 없습니다..)

결과적으로 nat다음을 사용하여 소스 IP를 시도했습니다.

nat on en0 from any to any -> en0

하지만 이건 그렇지아니다작동하는 것처럼 보이지만 소스 IP는 여전히 손상되어 있으며 내 en0인터페이스의 소스 IP와 일치하지 않습니다.

이러한 재라우팅된 패킷에 대해 소스 IP가 올바르게 설정되었는지 어떻게 확인합니까?

답변1

— Mac OS의 Pf는 이 작업을 수행하지 않습니다. 이유는 다음과 같습니다.

설명서를 보시면 알겠지만NAT가 진행 중입니다.~ 전에필터링. 그러나 NAT 규칙은 필터링 규칙처럼 다양한 특징을 모두 지원하지는 않습니다. 즉, NAT를 수행하는 동안 소켓의 소유권을 확인할 방법이 없습니다. 예를 들어 소스 또는 대상 IP를 사용하여 NAT 규칙의 적용 가능성을 제한할 수 있지만 소유권은 제한할 수 없습니다.

또 언급할 점은NAT 처리 중 Pf가 일반 경로 조회를 수행하는 중. 이는 전혀 작업을 수행 할 수 없음을 의미합니다 . 패킷은 그 순간 커널의 라우팅 테이블에 따라 라우팅됩니다. 귀하의 경우 VPN 인터페이스인 기본 경로의 인터페이스를 통해 전송되도록 파견됩니다. 그리고 VPN 인터페이스의 주소를 소스 IP로 사용하게 됩니다. 이는 일반적인 경로 조회에서는 놀라운 일이 아니지만 분명히 계획에 부합하지 않습니다.nat on en0

모순을 간략하게 요약하면 다음과 같습니다.

  • NAT를 수행하지 않으면 route-to적용 시 소스 IP가 잘못됩니다.
  • 소스 IP를 IP로 변경하는 동안 NAT 규칙은 기본 VPN(라우트 인터페이스)에 설정되어야 합니다.VPN이 아닌인터페이스는 다음과 같습니다:nat on vpn0 … -> (en0)
  • 그러나 OTOH에서는 (소유권에 따라) 사용자 지정 NAT를 가질 수 없으며 어쨌든 NAT를 수행하면 VPN을 통해 이동해야 하는 트래픽이 잘못된 소스 IP를 갖게 됩니다.

PS Mac OS Pf의 실제 상태는 다음과 같습니다.심지어 더 나쁘다. NAT가 완료된 후에는 필터링 규칙에서도 소유권 일치가 작동하지 않습니다.

관련 정보