
여기에는 iptables DNAT/SNAT 설정에 대한 많은 질문이 있지만 현재 문제를 해결하는 질문은 찾지 못했습니다.
eth0(예: 192.168.0.20)의 IP 주소에 바인딩된 서비스가 있고 다른 서버와 공유되는 eth0:0(192.168.0.40)의 IP 주소도 있습니다. 서버 하나만 활성화되어 있으므로 이 별칭 인터페이스는 활성화된 서버에 따라 왔다 갔다 합니다. 서비스에서 트래픽을 허용하려면 DNAT 규칙을 사용하여 대상 IP를 변경합니다.
iptables -t nat -A PREROUTING -d 192.168.0.40 -p udp --dport 7100 -j DNAT --to-destination 192.168.0.20
또한 이 서비스의 모든 아웃바운드 트래픽이 공유 IP에서 나오는 것처럼 나타나 활성-대기 장애 조치 시 반환 응답이 작동하기를 바랍니다.
iptables -t nat -A POSTROUTING -p udp --sport 7100 -j SNAT --to-source 192.168.0.40
내 문제는 SNAT 규칙이 항상 실행되지는 않는다는 것입니다. 인바운드 트래픽으로 인해 이와 같은 연결 추적 항목이 발생합니다.
[root]# conntrack -L -p udp
udp 17 170 src=192.168.0.185 dst=192.168.0.40 sport=7100 dport=7100 src=192.168.0.20 dst=192.168.0.185 sport=7100 dport=7100 [ASSURED] mark=0 secmark=0 use=2
이는 POSTROUTING 체인이 실행되지 않고 아웃바운드 트래픽이 실제 IP 주소를 소스로 사용함을 의미합니다.
이 포트 번호에 대한 conntracking을 방지하기 위해 원시 테이블에 NOTRACK 규칙을 설정할 수 있다고 생각하지만 이 작업을 수행하는 더 좋고 효율적인 방법이 있습니까?
편집 - 대체 질문: 공유 IP 주소가 서버 간에 교환될 때 네트워크에 연결하거나 분리할 수 있도록 바인딩할 수 있지만 사용할 수 없는 인터페이스를 갖는 방법(CentOS/Linux)이 있습니까?
답변1
내 문제에 대한 해결책을 찾았습니다.
커널 매개변수를 사용하여net.ipv4.ip_nonlocal_bind=1
, 아직 존재하지 않는 주소에 바인딩하도록 서비스를 얻을 수 있습니다.
eth0:0 인터페이스가 활성화되면 서비스에서 트래픽을 허용합니다. ARP 등은 ucarp/networking에 의해 처리됩니다. 이를 적용하면 DNAT/SNAT 규칙이 전혀 필요하지 않습니다.
답변2
나는 두 가지 대안을 제안할 수 있습니다. 그 중 하나를 선택하거나 자신의 것을 선택하십시오.
와일드카드 주소를 수신하도록 서비스를 설정하여 DNAT 규칙을 완전히 피할 수 있습니다. 그러면 SNAT 규칙이 나가는 패킷에 적용됩니다.
또는 사용 중인 HA 솔루션에 따라 마이그레이션 시 유동 IP(192.168.0.40)에서 수신 대기하는 서비스를 시작하도록 구성할 수 있습니다.
별로 관련은 없지만 이런 불편함은 존재하지 않습니다.OpenBSD 잉어. CARP를 사용하면 모든 노드에 가상 IP가 구성되지만 하나만 활성화됩니다. 이는 물론 서비스가 모든 노드의 가상 IP를 수신하도록 할 수 있음을 의미합니다.
그다지 좋지는 않지만 모든 노드에서 가상 IP를 구성하고 심지어 불러올 수도 있으며 arptables
해당 IP에 대한 ARP 응답이나 알림을 비활성화하는 데 사용할 수 있습니다. 그런 다음 노드가 마스터 또는 슬레이브가 될 때 ucarp가 ARP 규칙을 활성화하거나 비활성화하도록 할 수 있습니다.