1. 기본 동작
- 디폴트 게이트웨이(Default Gateway):
- 서버는 특정 목적지를 명시하지 않은 패킷(예: 인터넷으로 나가는 트래픽)을 기본 게이트웨이(default gateway)를 통해 전송
- 기본적으로, 서버는 하나의 기본 경로를 사용하며, 이 경로는 특정 NIC를 통해 트래픽을 전달
- 문제점:
- 요청이 NIC 1을 통해 들어왔는데, 기본 게이트웨이가 NIC 2로 설정되어 있으면 응답 패킷이 NIC 2를 통해 나가게 된다.
- 이는 L4 로드 밸런서가 세션을 제대로 유지하지 못하게 하거나 트래픽이 예상치 못한 경로로 나가는 문제를 일으킬 수 있다.
2. 요청이 들어온 NIC로 응답을 보내려면?
(1) 정책 기반 라우팅(Policy-Based Routing)
- 정책 기반 라우팅(PBR)을 설정하면, 들어온 요청의 경로를 기반으로 적절한 NIC를 통해 응답을 보낼 수 있습니다.
- Linux 예시
- 각 NIC에 대해 별도의 라우팅 테이블을 생성:
- 각 NIC에 대해 별도의 라우팅 테이블을 생성:
echo "1 nic1_table" >> /etc/iproute2/rt_tables
echo "2 nic2_table" >> /etc/iproute2/rt_tables
2. 각 테이블에 라우팅 경로 추가
ip route add default via <NIC1_GATEWAY> dev eth0 table nic1_table
ip route add default via <NIC2_GATEWAY> dev eth1 table nic2_table
3. 들어온 트래픽의 소스 IP를 기반으로 정책 설정
ip rule add from <NIC1_SUBNET> table nic1_table
ip rule add from <NIC2_SUBNET> table nic2_table
(2) Reverse Path Filtering 비활성화
- Linux 시스템은 기본적으로 Reverse Path Filtering(RPF)을 사용하여 들어온 인터페이스와 나가는 인터페이스를 자동으로 확인
- 하지만 NIC가 여러 개일 때, 이 동작이 예상치 못한 결과 발생할 가능성
- RPF를 비활성화
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.eth0.rp_filter=0
sysctl -w net.ipv4.conf.eth1.rp_filter=0
(3) conntrack 활용
- Linux의 Netfilter 모듈에서 conntrack을 사용하면 상태 기반 세션 추적을 통해 들어온 요청과 동일한 인터페이스로 응답을 보내는 것을 보장할 수 있다.
iptables -A POSTROUTING -t mangle -o eth0 -j CONNMARK --save-mark
iptables -A PREROUTING -t mangle -i eth0 -j CONNMARK --restore-mark
3. L4와의 상호작용
- L4에서 SNAT을 사용하는 경우
- L4 로드 밸런서가 들어오는 트래픽의 소스 IP를 변경(SNAT)하면, 서버는 항상 L4로 응답을 보낸다. 이 경우 정책 기반 라우팅을 설정할 필요가 없다.
- L4에서 클라이언트의 원래 IP를 유지하는 경우
- 위에서 설명한 정책 기반 라우팅이 필요할 수 있다.
4. 결론
- 서버의 디폴트 설정만으로는 들어온 NIC와 동일한 NIC로 응답을 보장할 수 없다.
- 이를 보장하려면 정책 기반 라우팅 또는 conntrack을 사용해야 한다.
- L4 로드 밸런서의 NAT 설정에 따라 서버 쪽에서 추가 설정이 필요 없을 수도 있다.
- 예: L4가 SNAT을 사용하면, 서버는 항상 L4로 응답을 보내므로 문제가 없다.