Network

서버 네트워크 카드 2개와 L4 두개 연결 Default Gateway

devfinger 2024. 12. 6. 10:33

1. 기본 동작

  • 디폴트 게이트웨이(Default Gateway):
    • 서버는 특정 목적지를 명시하지 않은 패킷(예: 인터넷으로 나가는 트래픽)을 기본 게이트웨이(default gateway)를 통해 전송
    • 기본적으로, 서버는 하나의 기본 경로를 사용하며, 이 경로는 특정 NIC를 통해 트래픽을 전달
  • 문제점:
    • 요청이 NIC 1을 통해 들어왔는데, 기본 게이트웨이가 NIC 2로 설정되어 있으면 응답 패킷이 NIC 2를 통해 나가게 된다.
    • 이는 L4 로드 밸런서가 세션을 제대로 유지하지 못하게 하거나 트래픽이 예상치 못한 경로로 나가는 문제를 일으킬 수 있다.

2. 요청이 들어온 NIC로 응답을 보내려면?

(1) 정책 기반 라우팅(Policy-Based Routing)

  • 정책 기반 라우팅(PBR)을 설정하면, 들어온 요청의 경로를 기반으로 적절한 NIC를 통해 응답을 보낼 수 있습니다.
  • Linux 예시
    1. 각 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로 응답을 보내므로 문제가 없다.