Linux 소스 라우팅, 강력한 엔드 시스템 모델/강력한 호스트 모델?

Linux 소스 라우팅, 강력한 엔드 시스템 모델/강력한 호스트 모델?

멀티 홈 Linux 시스템이 진정한 목표를 달성할 수 있습니까?강력한 ES 모델?

###특정 사용 사례

저는 5개의 서로 다른 인터페이스를 갖춘 시스템을 갖고 있으며, 각 인터페이스는 동일한 서브넷에 연결되어 있으므로 동일한 인터넷 게이트웨이에 연결됩니다.

  • 나는 동일한 포트에서 각 인터페이스를 개별적으로 수신하고 패킷이 항상 들어오는 것과 동일한 인터페이스에서 나오는지 확인하고 "잘못된" 인터페이스로 들어가려는 패킷이 삭제되는지 확인하고 싶습니다.
  • 각 인터페이스에 바인딩하고 항상 바인딩하는 동일한 소스 IP에서 시작되는 인터넷 대상으로 나가는 연결을 갖고 싶습니다. 예를 들어,
컬 - 인터페이스인터페이스 IPhttp://ipecho.net/plain

항상 내가 바인딩된 것과 동일한 IP 주소가 표시되어야 합니다 --interface.

  • 이러한 인터페이스 중 하나에서 DHCP를 사용하면 정적 라우팅에 문제가 있을 수 있습니다.

RFC 1122

~에서RFC 1122- 인터넷 호스팅 요구 사항 - 통신 계층,섹션 3.3.4.2 – 멀티호밍 요구 사항:

인터넷 호스팅 구현자는 멀티호밍의 두 가지 다른 개념적 모델을 사용하며, 이는 아래 설명에 간략하게 요약되어 있습니다. 이 문서는 선호하는 모델에 대한 입장을 취하지 않습니다. 각 모델에는 고유한 위치가 있는 것 같습니다. 이러한 양면성은 질문 (A)와 (B)가 선택 사항이라는 사실에 반영됩니다.

  •   강력한 ES 모델
      강력한 ES(최종 시스템 또는 호스트) 모델은 호스트/게이트웨이(ES/IS) 구별을 강조하므로 위의 질문 (A) 및 (B)에서 MAY 대신 사용해야 합니다. 멀티홈 호스트를 동일한 물리적 호스트 내의 논리적 호스트 집합으로 모델링하는 경향이 있습니다.

      (A)와 관련하여 Strong ES 모델 지지자들은 자동 인터넷 라우팅 메커니즘이 대상 주소에 해당하지 않는 물리적 인터페이스로 데이터그램을 라우팅할 수 없다는 점을 지적합니다.

      Strong ES 모델에서 나가는 데이터그램에 대한 라우팅 계산은 다음과 같은 매핑입니다.
             route(src IP addr, dest IP addr, TOS) -> gateway
    

    소스 주소는 해당 물리적 ​​인터페이스에서 직접 액세스할 수 있는 게이트웨이를 선택하기 위한 매개변수로 여기에 포함됩니다. 이 모델에서는 논리적으로 각 IP 소스 주소에 일반적으로 하나 이상의 기본 게이트웨이가 있어야 하며 기본 게이트웨이가 여러 개 있는 것이 좋습니다.


  •   약한 ES 모델
      이 견해는 ES/IS 구별을 덜 강조하므로 질문 (A)와 (B)에서 MAY를 MUST NOT으로 대체합니다. 이 모델은 게이트웨이 라우팅 프로토콜을 도청하는 호스트에 대한 보다 자연스러운 모델일 수 있으며 내장된 게이트웨이 기능이 있는 호스트에 필요합니다.

      약한 ES 모델로 인해 리디렉션 메커니즘이 실패할 수 있습니다. 데이터그램이 대상 주소에 해당하지 않는 물리적 인터페이스에서 전송되면 첫 번째 홉 게이트웨이는 리디렉션을 전송해야 할 때를 인식하지 못합니다. 반면에 호스트에 게이트웨이 기능이 내장되어 있으면 리디렉션을 수신하지 않고도 라우팅 정보를 가질 수 있습니다.

      약한 ES 모델에서 나가는 데이터그램에 대한 경로 계산은 매핑입니다.
             route(dest IP addr, TOS) -> gateway, interface
    

Linux는 기본적으로 약한 ES 모델을 사용하는 반면 FreeBSD 및 기타 Unix 변형은 강력한 ES 시스템으로 작동합니다. Strong ES 시스템처럼 작동하도록 만드는 방법이 있습니까?

sysctl추가하는 새 인터페이스에 대해 특정 라우팅 규칙을 추가하지 않고 기본적으로 Strong ES처럼 작동하려면 무엇을 설정하거나 컴파일 시간을 구성해야 합니까 ? 엄격한 소스 경로 필터링을 수행하면 이를 수행할 수 있다는 것을 알고 있지만 net.ipv4.conf.default.rp_filter = 1그 이상의 의미가 있는 것 같습니다. 기본적으로 소스 기반 라우팅을 수행하는 방법은 무엇입니까?

답변1

이를 위해서는 방화벽 규칙을 추가하는 것만으로는 충분하지 않습니다. 동일한 하드웨어와 프로세스를 공유하는 두 개의 독립적인 시스템인 것처럼 시스템이 트래픽을 라우팅하기를 원합니다. 이것이 사실상 강력한 ES 모델입니다.

목표가 Linux에서 강력한 ES 모델을 구현하는 것이라면 먼저 다음 sysctl 설정이 필요합니다.

net.ipv4.conf.all.arp_filter=1 
net.ipv4.conf.all.arp_ignore=1 # or even 2
net.ipv4.conf.all.arp_announce=2

이러한 설정은 ARP의 동작이 강력한 ES 모델을 따르도록 합니다. 즉, ARP 요청이 수신되면 정확히 요청된 주소를 가진 인터페이스만 응답하고 원래 주소로 향하는 트래픽만 실제로 해당 특정 주소를 통해 전송됩니다. 주소. 상호 작용.

그런 다음 5개의 인터페이스가 있으므로 라우팅 측면에서 다르게 작동하도록 하려고 하므로 5개의 사용자 지정 경로 테이블을 설정해야 합니다. 숫자를 사용하여 식별할 수 있지만 일반적으로 이름을 지정하는 것이 더 명확합니다. 따라서 각 항목에 대해 1에서 252 사이의 숫자와 적절한 이름을 선택하십시오. (0, 253, 254, 255번은 예약되어 있습니다.)

예를 들어, 100 = rtable0, 101 = rtable1, 102 = rtable2, 103 = rtable3 및 104 = rtable4를 선택합니다. 파일 끝에 다음 번호와 이름을 추가하세요 /etc/iproute2/rt_tables.

# ...default stuff above...
100    rtable0
101    rtable1
102    rtable2
103    rtable3
104    rtable4

그런 다음 각 인터페이스에 적합한 최소 경로 항목 집합으로 각 사용자 지정 경로 테이블을 채웁니다. (실제 값을 설명적으로 이름을 지정하고 싶은 환경 변수 이름으로 대체했습니다.)

ip route add $ETH0_NET dev eth0 proto static src $ETH0_IP table rtable0
ip route add default via $ETH0_GW dev eth0 proto static src $ETH0_IP table rtable0

ip route add $ETH1_NET dev eth1 proto static src $ETH1_IP table rtable1
ip route add default via $ETH1_GW dev eth1 proto static src $ETH1_IP table rtable1

# ... and so on, for all 5 interfaces

마지막으로, 각 패킷의 소스 주소를 확인하고 그에 따라 사용할 라우팅 테이블을 선택하는 고급 라우팅 규칙을 추가합니다.

ip rule add from $ETH0_IP table rtable0
ip rule add from $ETH1_IP table rtable1
#...

재부팅 후에도 이 모든 구성이 유지되도록 하려면 Linux 배포 규칙에 맞게 사용자 정의 시작 스크립트(또는 스크립트)를 ifup-pre작성 해야 할 수도 있습니다.ifup-post

추가 보안을 위해 인터페이스별 iptables 규칙을 추가하여 잘못된 인터페이스에서 수신될 수 있는 모든 수신 패킷을 자동으로 삭제할 수 있습니다. 모든 것이 순조롭게 진행된다면 이러한 패킷 수는 0으로 유지되어야 합니다. 패킷 수가 증가하기 시작하면 구성에서 뭔가가 누락되었을 수 있습니다.

iptables -A INPUT -m addrtype --dst-type UNICAST -i eth0 ! -d $ETH0_IP -j DROP
iptables -A INPUT -m addrtype --dst-type UNICAST -i eth1 ! -d $ETH1_IP -j DROP
# ... and so on for each interface

노트:나는 Rick Jones와 다른 네트워킹 전문가들의 오래된 인터넷 토론을 기반으로 이러한 설정을 구현한 적이 있습니다. 그들은 “모든 것이 분명하게 보여지지만필요한Linux에서 강력한 호스트 모델 동작을 달성하기 위해 이것이 가능하다고 보장할 수 없습니다.적절한가능한 모든 사용 사례에 대해". 그것은 나에게 완벽하게 작동합니다. 사용하려는 용도에 따라 충분할 수도 있고 충분하지 않을 수도 있습니다.

경고하다:이 구성을 설정할 때 시스템에 대한 일종의 로컬 또는 원격 콘솔 액세스 권한이 있는지 확인하십시오. 이 설정은 네트워크 액세스를 완전히 망칠 가능성이 높으며 이는 전투의 절반에 불과합니다.

(N-1) 사용자 지정 라우팅 테이블만 사용하여 N 인터페이스를 설정하는 것이 가능하지만, 개인적으로 선호하는 것은 고급 라우팅을 사용할 때 모든 라우팅 구성을 사용자 지정 테이블로 이동하는 것입니다. 시스템에 분명히 네트워크 연결이 있을 때 본질적으로 비어 있거나 비어 있다는 route -n것은 ip route show매우 특별한 일이 진행되고 있다는 매우 중요한 단서가 될 것입니다. 그래도 이런 시스템을 설정할 때 /etc/motd고급 라우팅이 적용되고 이를 설정하는 실제 스크립트가 어디에 있는지 영구 알림도 설정합니다.

답변2

ARP 처리를 더 효과적으로 제어할 수 있는 또 다른 옵션이 있습니다. 구경하다 arp_ignore.

관련 정보