라우팅할 수 없는 인터페이스에 대한 SNAT

라우팅할 수 없는 인터페이스에 대한 SNAT

다음과 같이 기본 네임스페이스와 RoutableNS라는 다른 네임스페이스 사이에 가상 이더넷(veth) 쌍을 설정했습니다.

--------------              --------------
-   veth0    - --------------    veth1   -
-  10.5.1.1  -              -  10.5.1.2  -
--------------              --------------
  default NS                 RoutableNS

인터페이스를 통해 RoutableNS 네임스페이스의 외부 세계에 ping을 보낼 수 있지만 veth1들어오는 트래픽을 10.5.1.1(또는 10.5.1.2)로 SNAT(또는 MASQUERADE)하면 아무 것도 veth 인터페이스에 도달하지 못하는 것으로 나타났습니다.

나는 tun장치에 대해 동일한 작업을 시도했고 IP가 외부 세계(기본 네임스페이스에서)로 라우팅될 수 없는 경우 가장하여 장치를 조정할 수 없다는 것을 확인했습니다.

그래서 두 가지 질문이 있습니다.

  1. SNAT(MASQUERADE)의 이러한 동작이 어딘가에 문서화되어 있습니까? 내 말은 새 소스 IP가 현재 네임스페이스에서 외부 세계로 라우팅 가능해야 한다는 것입니다.
  2. 이 작업을 수행할 수 있는 네트워크 옵션(sysctls)이 있습니까?

답변1

IP가 외부 세계로 라우팅될 수 없는 장치를 가장하거나 SNAT하는 것은 전적으로 가능합니다. 네트워크 네임스페이스에 있는지 여부는 아무런 차이가 없습니다.

정확히 무엇을 시도했는지 알려주는 것을 잊어버렸지만 SNAT와 MASQUERADE는 POSTROUTING 테이블에서만 작동하고 DNAT는 PREROUTING 테이블에서만 작동한다는 사실이 잘 문서화되어 있다는 사실을 기억하세요. 주문하다 iptable.

즉, SNAT는 패킷이 인터페이스를 떠나기 전 마지막 단계로 수행되고, DNAT는 패킷이 외부에서 인터페이스로 들어가기 전 초기 단계로 수행됩니다.

따라서 일반적인 설정은 라우터(호스트 또는 네임스페이스)가 한쪽의 IP 주소를 다른 쪽의 모든 항목에 매핑하는 것입니다.

                +---------------+
                |               |
masq'ed IP --<--| eth0     eth1 |--<-- original IP
10.0.0.99       |               |      10.0.0.1
                +---------------+
                Host or Namespace

그리고 들어오는 연결에 해당하는 DNAT가 필요하므로 다음과 같습니다.

iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.1/32  -j SNAT --to 10.0.0.99
iptables -t nat -A PREROUTING  -i eth0 -d 10.0.0.99/32 -j DNAT --to 10.0.0.1

가장하려는 IP가 무엇인지 정확히 말하지 않았지만 메인 네임스페이스가 그러한 라우터 역할을 하고 "RouteableNS"를 10.5.1.2외부 세계로부터 보호하려는 경우 메인 네임스페이스의 IP를 사용하여 이를 수행할 수 있습니다. IF를 통과하십시오.

관련 정보