iptables를 사용한 양방향 NAT

iptables를 사용한 양방향 NAT

간단히 말해서, 마스터를 통해 트래픽을 라우팅해야 하는 클러스터 시스템이 있습니다. 노드에서 외부 세계로의 트래픽 라우팅은 작동하지만 우리 부서의 서브넷에서 노드로의 트래픽 라우팅은 실패합니다. 안타깝게도 서브넷에 노드를 추가하는 것은 불가능합니다.

설정

단순성을 위해 멍청한 스위치 없이 클러스터 설정

클러스터는 일부 주변 장치와 함께 마스터와 여러 노드로 구성됩니다. 노드는 인트라넷이나 인터넷에서 숨겨진 내부 네트워크에 있습니다. NAT는 마스터에 이미 설치되어 있으므로 노드는 내부 및 외부 서버에 액세스할 수 있습니다. 이 부분은 작동합니다.

마스터의 외부 인터페이스는 제어할 수 없는 게이트웨이를 공유하는 워크스테이션 PC와 동일한 서브넷에 있습니다.

편집: 클러스터는 CentOS 7을 실행하고 PC는 Ubuntu xenial 기반 배포판을 실행합니다.

작업

일부 소프트웨어 패키지는 노드에 직접 액세스해야 합니다. 이를 위해 우리는 iptables를 사용하여 마스터에 두 번째 NAT를 설정하고 마스터를 통해 10.10.1.0/24로 트래픽을 보내기 위해 PC에 IP 경로를 추가하려고 했습니다.

구성

마스터: IP 경로

default via 123.45.67.254 dev eth0 proto static metric 100
10.10.0.0/16 dev eth1 proto kernel scope link src 10.10.0.1
123.45.67.0/23 dev eth0 proto kernel scope link src 123.45.67.204 metric 100

마스터: iptables -vnL -t nat

Chain PREROUTING (policy ACCEPT 7356 packets, 880K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 4884 packets, 687K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 3445 packets, 225K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 3445 packets, 225K bytes)
 pkts bytes target     prot opt in     out     source               destination
  439 33324 MASQUERADE  all  --  *     eth0    10.10.1.0/24         0.0.0.0/0
61828 3710K MASQUERADE  all  --  *     eth1    123.45.67.0/23       10.10.1.0/24

MASQUERADE 대신 SNAT를 사용해도 아무런 차이가 없습니다.

노드: IP 경로

default via 10.10.0.1 dev eth1
10.10.0.0/16 dev eth1 proto kernel scope link src 10.10.1.1

PC: IP 경로

default via 123.45.67.254 dev eth0  proto static  metric 100
10.10.0.0/16 via 123.45.67.204 dev eth0
123.45.67.0/23 dev eth0  proto kernel  scope link  src 123.45.67.191  metric 100

지금까지의 진단

  • node01에서 인터넷/인트라넷/PC로의 NAT가 완벽하게 작동합니다.
  • TCP 핸드셰이크 중에 pc1에서 node01로의 NAT가 실패합니다.
    • SYN은 마스터를 통해 node01로 전달되고 tcpdump에 SYN_RECV로 표시됩니다.
    • SYN+ACK가 node01에서 마스터로 전송됩니다.
    • SYN+ACK가 마스터의 tcpdump에 나타나고 필터로 전달됩니다.
    • tcpdump는 필터를 통과하는 SYN+ACK를 보여줍니다.
    • iptables는 필터 FORWARD, mangle FORWARD + POSTROUTING을 통과하는 SYN+ACK 패키지를 보여줍니다.
    • SYN+ACK 패키지는 절대로 nat POSTROUTING을 통과하지 못합니다(그렇습니까?).
    • SYN+ACK 패키지가 pc1에 도착하지 않습니다.
  • 물론 악수는 실패한다.
    • pc1이 SYN_SENT에서 멈췄습니다.
    • node01이 SYN_RECV에서 멈췄습니다.
    • 결국 연결 시간이 초과되었습니다.
  • 게이트웨이에서 패키지를 모니터링할 방법이 없습니다.

내 추측으로는 소스 주소가 마스터에 다시 쓰여지기 때문에 도중에 상태 저장 라우터가 SYN+ACK 패키지를 삭제하여 원래 SYN 패키지와의 관계가 손실된다는 것입니다.

어떻게 작동하게 할 수 있나요?

추가 구성/로그가 필요한 경우 알려주십시오.

관련 정보