최근에 두 개의 SSL / TLS 사이트를 실행할 수 있도록 하나의 Linux 호스트에 할당 된 동일한 서브넷에 두 개의 IP 주소가 필요한 상황이 발생했습니다. 첫 번째 접근 방식은 IP 앨리어싱 (예 : eth0 : 0, eth0 : 1 등)을 사용하는 것이었지만 네트워크 관리자는이 아이디어를 무너 뜨리는 보안을 위해 상당히 엄격한 설정을했습니다.
- DHCP 스누핑을 사용하며 일반적으로 고정 IP 주소를 허용하지 않습니다. 정적 주소 지정은 정적 DHCP 항목을 사용하여 수행되므로 동일한 MAC 주소는 항상 동일한 IP 할당을받습니다. 요청하면 스위치 포트 별로이 기능을 비활성화 할 수 있으며 그 이유가 있습니다 (고맙게도 네트워크 사람들과 좋은 관계를 유지하고 있으며 어렵지 않습니다).
- 스위치 포트에서 DHCP 스누핑을 비활성화 한 상태에서는 스위치에 MAC 주소 X에 IP 주소 Y가 허용된다는 규칙을 설정해야했습니다. 불행히도 MAC 주소 X 만 허용한다는 말의 부작용이있었습니다. IP 주소 Y. IP 앨리어싱을 위해서는 MAC 주소 X에 두 개의 IP 주소가 할당되어야하므로 작동하지 않습니다.
스위치 구성에서 이러한 문제를 해결할 방법이 있었지만 네트워크 관리자와 좋은 관계를 유지하기 위해 다른 방법을 찾았습니다. 두 개의 네트워크 인터페이스를 갖는 것은 다음 논리적 단계처럼 보였습니다. 고맙게도이 Linux 시스템은 가상 머신이므로 두 번째 네트워크 인터페이스를 쉽게 추가 할 수있었습니다 (재부팅하지 않고도 추가 할 수 있음). 몇 번의 키 입력으로 두 개의 네트워크 인터페이스가 작동하고 DHCP에서 IP 주소를 가져 왔습니다.
그러나 문제는 네트워크 관리자가 두 인터페이스의 ARP 항목을 (스위치에서) 볼 수 있지만 내가 처음으로 만든 네트워크 인터페이스 만 핑 또는 모든 종류의 TCP 또는 UDP 트래픽에 응답합니다.
많은 파고 파고 난 후 여기에 내가 생각해 냈습니다. 그것은 효과가있는 것처럼 보이지만 간단 해야하는 것처럼 많은 일을하는 것처럼 보입니다. 다른 아이디어가 있습니까?
1 단계 : 모든 인터페이스에서 ARP 필터링을 활성화합니다.
# sysctl -w net.ipv4.conf.all.arp_filter=1
# echo "net.ipv4.conf.all.arp_filter = 1" >> /etc/sysctl.conf
Linux 커널 문서의 네트워킹 /ip-sysctl.txt 파일에서 :
arp_filter - BOOLEAN
1 - Allows you to have multiple network interfaces on the same
subnet, and have the ARPs for each interface be answered
based on whether or not the kernel would route a packet from
the ARP'd IP out that interface (therefore you must use source
based routing for this to work). In other words it allows control
of which cards (usually 1) will respond to an arp request.
0 - (default) The kernel can respond to arp requests with addresses
from other interfaces. This may seem wrong but it usually makes
sense, because it increases the chance of successful communication.
IP addresses are owned by the complete host on Linux, not by
particular interfaces. Only for more complex setups like load-
balancing, does this behaviour cause problems.
arp_filter for the interface will be enabled if at least one of
conf/{all,interface}/arp_filter is set to TRUE,
it will be disabled otherwise
2 단계 : 소스 기반 라우팅 구현
나는 기본적으로 http://lartc.org/howto/lartc.rpdb.multiple-links.html의 지시를 따랐 지만 그 페이지는 다른 목표를 염두에두고 작성되었지만 (ISP 두 명을 다루는 경우).
서브넷이 10.0.0.0/24이고 게이트웨이가 10.0.0.1이고 eth0의 IP 주소가 10.0.0.100이고 eth1의 IP 주소가 10.0.0.101이라고 가정하십시오.
/ etc / iproute2 / rt_tables에 eth0 및 eth1이라는 두 개의 새로운 라우팅 테이블을 정의하십시오.
... top of file omitted ...
1 eth0
2 eth1
이 두 테이블의 경로를 정의하십시오.
# ip route add default via 10.0.0.1 table eth0
# ip route add default via 10.0.0.1 table eth1
# ip route add 10.0.0.0/24 dev eth0 src 10.0.0.100 table eth0
# ip route add 10.0.0.0/24 dev eth1 src 10.0.0.101 table eth1
새 라우팅 테이블 사용시기에 대한 규칙을 정의하십시오.
# ip rule add from 10.0.0.100 table eth0
# ip rule add from 10.0.0.101 table eth1
기본 라우팅 테이블은 DHCP에 의해 이미 처리되었지만 (이 경우에는 반드시 필요한지 확실하지 않음) 기본적으로 다음과 같습니다.
# ip route add default via 10.0.0.1 dev eth0
# ip route add 130.127.48.0/23 dev eth0 src 10.0.0.100
# ip route add 130.127.48.0/23 dev eth1 src 10.0.0.101
그리고 짜잔! 모든 것이 잘 작동하는 것 같습니다. 두 IP 주소 모두에 핑을 보내면 정상적으로 작동합니다. 이 시스템에서 다른 시스템으로 핑을 보내고 핑이 특정 인터페이스를 사용하도록 강요하면 제대로 작동합니다 ( ping -I eth0 10.0.0.1
, ping -I eth1 10.0.0.1
). 그리고 가장 중요한 것은 IP 주소를 오가는 모든 TCP 및 UDP 트래픽이 예상대로 작동한다는 것입니다.
다시 말하지만, 내 질문은 : 더 좋은 방법이 있습니까? 이것은 겉보기에 간단한 문제에 대한 많은 작업처럼 보입니다.
업데이트 : 위의 솔루션이 불완전했습니다. 트래픽이 동일한 서브넷에 남아 있으면 문제가 해결되었지만 두 번째 인터페이스를 사용하는 다른 서브넷과의 통신은 제대로 작동하지 않습니다. 더 큰 구멍을 파기보다는 네트워크 관리자와 대화를 나누고 한 인터페이스에 여러 IP 주소를 허용하고 IP 앨리어싱 (예 : eth0 및 eth0 : 0)을 사용하도록했습니다.
ip
from iproute2
을 사용 하여 동일한 인터페이스에 둘 이상의 주소를 추가 하십시오 .