[server] 동일한 서브넷에 IP가있는 여러 물리적 인터페이스

9 개의 NIC가있는 Linux 상자가 있고 그 중 8 개가 동일한 서브넷에 고유 한 주소를 갖기를 원합니다. 예 :

ifconfig eth1 192.168.123.1 netmask 255.255.0.0
ifconfig eth2 192.168.123.2 netmask 255.255.0.0
ifconfig eth3 192.168.123.3 netmask 255.255.0.0
...
ifconfig eth8 192.168.123.8 netmask 255.255.0.0

이 경우 기본 ARP 동작은 매우 역효과를 낳습니다. 모든 IP의 모든 트래픽이 독점적으로 통과하기 때문입니다 eth1. 이는 내가 원하는 것과 거의 반대입니다.

그래서 나는 주변을 뒤덮고 sysctl을 다음과 같이 변경했습니다.

net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

그것은 eth1다른 모든 사람을 사칭하는 것을 막았 지만 여전히 eth1주소 이외 의 다른 것을 핑할 수는 없습니다 . (예 : 같은 스위치의 두 번째 컴퓨터에서 192.168.123.1ping 에만 응답)

나는 arptables 또는 iproute 또는 SOMETHING으로 무언가를해야한다고 추측하지만이 분야에서 바다에서 길을 잃었습니다.

보너스 포인트 : 솔루션은 Linux 2.6.27.27과 호환되어야합니다. (더 구체적으로, Slax 6.1.2)



답변

강력한 최종 시스템 모델 이 필요합니다 . Linux는 기본적으로 약한 전송 시스템 모델을 기반으로 구축되므로이 응용 프로그램에 적합한 OS는 아닙니다.

ARP에서 정책 라우팅, 소스 주소 선택에 이르기까지 필요한 모든 동작을 위조해야합니다. 패킷이 잘못된 인터페이스에 도착하는 경우 패킷이 수락되지 않도록 필터도 필요합니다.

반드시 필요한 단계는 다음과 같습니다.

  1. 모든 인터페이스에서 arp_filter = 1 및 arp_ignore = 2를 구성하십시오.

  2. 발신 트래픽에 대한 인터페이스 별 소스 기반 라우팅을 추가하십시오. (대상 주소는 원본 주소를 기준으로 선택해야합니다.)

  3. 인터페이스 별 수신 필터링을 추가하여 잘못된 인터페이스에서 수신 한 패킷을 자동으로 삭제하십시오. (다른 인터페이스에 지정된 대상 주소가있는 패킷)

불행하게도,이 세 단계가 모두 필요한지에 대한 합의는 없습니다. 약한 엔드 시스템 모델은 전체 Linux TCP / IP 스택에 내장되어 있으며 멀티 캐스트와 같은 미묘한 문제로 무엇이 잘못 될 수 있는지 명확하지 않습니다.

예를 들어 방송을위한 출력 인터페이스를 어떻게 선택해야하는지 명확하지 않습니다. 모두 나가야합니까? 아마도. 스택이 인터페이스 중 하나에 할당되지 않은 소스 주소로 아웃 바운드 브로드 캐스트를받는 경우 올바른 동작은 무엇입니까?

다시 한 번, 작업에 잘못된 도구를 선택했습니다.


답변

8/9 인터페이스로 브리지를 만든 다음 해당 브리지에 IP 주소를 할당 할 가능성이 더 높습니다 (bridge-utils 패킷, ‘brctl add’명령).

이렇게하면 브리지가 스위치처럼 작동하여 서브넷에 IP 주소를 가질 수 있습니다.


답변

물리적 인터페이스를 본딩 한 다음 단일 본딩 된 인터페이스에서 모든 주소를 구성하는 것이 좋습니다.

스위치에 대한 지원도 필요합니다.

다음 은 시작하는 데 사용할 수 있는 미니 자습서 입니다.


답변

별도의 9 대의 컴퓨터에 해당하는 테스트 환경이 필요한 것 같으며 한 컴퓨터의 9 개의 인터페이스가이를 에뮬레이트 할 수 있다고 생각했습니다. Linux에서는 David Schwartz가 설명한 이유로 단일 스택을 통해이를 수행 할 수 없습니다. BTDT와 흉터가 있습니다. 2 개의 인터페이스로 충분하지 않았습니다.

더 나은 솔루션은 하나의 호스트에서 8 개 또는 9 개의 개별 가상 머신을 실행하고 이러한 가상 머신에 8 또는 9 개의 인터페이스를 브리지하는 것입니다.


답변

예. David Schwartz의 제안에 따르면 가능합니다.

echo -ne 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth3/rp_filter

// 적절한 기능을 위해 eth0과 eth1이 같은 서브넷에있을 때 ARP가 eth1에서 응답하여 생성됩니다.

echo -ne 0 > /proc/sys/net/ipv4/conf/all/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth1/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

//Create a table called "new_rt_table" and create a routing rule that says any packet with a mark equal to '1' gets routed according to the "new_rt_table"(can name it whatever you want) table. The file /etc/iproute2/rt_tables is the only source of table names on the system. Internally, routing tables have integer identifiers.

echo 1 new_rt_table >> /etc/iproute2/rt_tables
ip rule add from all fwmark 1 table new_rt_table

// eth_1을 통해 패킷을 라우팅하도록 “new_rt_table”테이블을 설정하십시오.

ip route add default dev eth1 table new_rt_table
ip route show table new_rt_table

// ‘ip route’가 eth1을 통해 라우팅 할 수 있도록 패킷을 표시합니다.

iptables -F -t mangle
iptables -t mangle -I OUTPUT -s <ip addr of eth1> -o eth0 -j MARK --set-mark 1

// 커널 설정에서 여러 라우팅 테이블을 지원합니다.

커널 구성

→ 네트워킹 지원 → 네트워킹 옵션

[*] IP : 고급 라우터

[*] IP : 정책 라우팅

CONFIG_IP_ADVANCED_ROUTER

CONFIG_IP_MULTIPLE_TABLES

// 위의 단계는 eth0에서 출력 될 패킷을 eth1에서 올바르게 빠져 나오도록 리디렉션합니다.

누군가가 작동하면 다른 방법을 제안하십시오.


답변