다음과 같이 기본 네임스페이스와 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가 외부 세계(기본 네임스페이스에서)로 라우팅될 수 없는 경우 가장하여 장치를 조정할 수 없다는 것을 확인했습니다.
그래서 두 가지 질문이 있습니다.
- SNAT(MASQUERADE)의 이러한 동작이 어딘가에 문서화되어 있습니까? 내 말은 새 소스 IP가 현재 네임스페이스에서 외부 세계로 라우팅 가능해야 한다는 것입니다.
- 이 작업을 수행할 수 있는 네트워크 옵션(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를 통과하십시오.