![아웃바운드 연결에 대해 여러 기본 게이트웨이를 설정할 수 있습니까?](https://linux55.com/image/105804/%EC%95%84%EC%9B%83%EB%B0%94%EC%9A%B4%EB%93%9C%20%EC%97%B0%EA%B2%B0%EC%97%90%20%EB%8C%80%ED%95%B4%20%EC%97%AC%EB%9F%AC%20%EA%B8%B0%EB%B3%B8%20%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4%EB%A5%BC%20%EC%84%A4%EC%A0%95%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
동일한 서브넷에 여러 NIC(eth0 및 wlan0)를 갖고 NIC 중 하나에 오류가 발생할 경우 호스트의 애플리케이션에 대한 백업 역할을 하고 싶습니다. 이를 위해 추가 라우팅 테이블을 만들었습니다. 다음과 같습니다 /etc/network/interfaces
.
iface eth0 inet static
address 192.168.178.2
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.2
post-up ip route add default via 192.168.178.1 dev eth0
post-up ip rule add from 192.168.178.2/32
post-up ip rule add to 192.168.178.2/32
iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.3
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.3 table rt2
post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
post-up ip rule add from 192.168.178.3/32 table rt2
post-up ip rule add to 192.168.178.3/32 table rt2
이는 호스트에 연결하는 데 효과적입니다. 인터페이스 중 하나가 다운되더라도 여전히 호스트에 SSH로 연결할 수 있습니다. 그러나 eth0
호스트가 종료되면 호스트의 애플리케이션은 외부 세계에 대한 연결을 초기화할 수 없습니다. 이것이 내 문제입니다.
주제를 조사한 결과 다음과 같은 흥미로운 정보를 발견했습니다.
프로그램이 아웃바운드 연결을 시작할 때 일반적으로 와일드카드 소스 주소(0.0.0.0)를 사용합니다. 이는 관련 대상 주소에 도달할 수 있는 한 인터페이스가 먼저 사용되지 않음을 나타냅니다. 이 주소는 라우팅 결정이 내려질 때까지 특정 소스 주소로 대체되지 않습니다. 따라서 이러한 연결과 관련된 트래픽은 위의 정책 규칙과 일치하지 않으며 새로 추가된 라우팅 테이블로 전달되지 않습니다. 구성이 정확하다고 가정하면 대신 기본 라우팅 테이블로 들어갑니다. http://www.microhowto.info/howto/ensure_metry_routing_on_a_server_with_multiple_default_gateways.html
내가 원하는 것은 기본 라우팅 테이블에 여러 개의 기본 게이트웨이(하나는 켜짐 eth0
, 하나는 꺼짐) 가 있고 wlan0
기본적으로 작동이 중단된 경우 기본 게이트웨이로 이동하는 것입니다.eth0
wlan0
eth0
그게 가능합니까? 그러한 기능을 구현하려면 어떻게 해야 합니까?
답변1
나는 그것을 직접 해결했다. Linux로 수행할 수 있는 네트워크 작업에 대한 정보가 거의 없는 것 같아서 내 솔루션을 자세히 문서화하고 설명하기로 결정했습니다. 이것이 내 최종 설정입니다.
- 네트워크 카드 3개: eth0(유선), wlan0(내장 Wi-Fi, 약한 신호), wlan1(USB Wi-Fi 어댑터, wlan0보다 강한 신호)
- 이들은 모두 동일한 서브넷에 있으며 각각 고유한 IP 주소를 가지고 있습니다.
- 기본적으로 eth0은 들어오고 나가는 트래픽에 사용됩니다.
- eth0이 실패하면 wlan1을 사용해야 합니다.
- wlan1이 실패하면 wlan0을 사용해야 합니다.
첫 번째 단계: 의 각 인터페이스에 대해 새 라우팅 테이블을 만듭니다 /etc/iproute2/rt_tables
. 이를 rt1, rt2 및 rt3이라고 부르겠습니다.
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
1 rt1
2 rt2
3 rt3
2 단계: 의 네트워크 구성 /etc/network/interfaces
. 이것이 주요 부분이며 이에 대해 설명하겠습니다.
auto eth0 wlan0
allow-hotplug wlan1
iface lo inet loopback
iface eth0 inet static
address 192.168.178.99
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.99 table rt1
post-up ip route add default via 192.168.178.1 dev eth0 table rt1
post-up ip rule add from 192.168.178.99/32 table rt1
post-up ip rule add to 192.168.178.99/32 table rt1
post-up ip route add default via 192.168.178.1 metric 100 dev eth0
post-down ip rule del from 0/0 to 0/0 table rt1
post-down ip rule del from 0/0 to 0/0 table rt1
iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.97
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.97 table rt2
post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
post-up ip rule add from 192.168.178.97/32 table rt2
post-up ip rule add to 192.168.178.97/32 table rt2
post-up ip route add default via 192.168.178.1 metric 102 dev wlan0
post-down ip rule del from 0/0 to 0/0 table rt2
post-down ip rule del from 0/0 to 0/0 table rt2
iface wlan1 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.98
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev wlan1 src 192.168.178.98 table rt3
post-up ip route add default via 192.168.178.1 dev wlan1 table rt3
post-up ip rule add from 192.168.178.98/32 table rt3
post-up ip rule add to 192.168.178.98/32 table rt3
post-up ip route add default via 192.168.178.1 metric 101 dev wlan1
post-down ip rule del from 0/0 to 0/0 table rt3
post-down ip rule del from 0/0 to 0/0 table rt3
입력하면 ip rule show
다음이 표시됩니다.
0: from all lookup local
32756: from all to 192.168.178.98 lookup rt3
32757: from 192.168.178.98 lookup rt3
32758: from all to 192.168.178.99 lookup rt1
32759: from 192.168.178.99 lookup rt1
32762: from all to 192.168.178.97 lookup rt2
32763: from 192.168.178.97 lookup rt2
32766: from all lookup main
32767: from all lookup default
이는 IP 주소 "192.168.178.99"로 들어오고 나가는 트래픽이 rt1 라우팅 테이블을 사용한다는 것을 알려줍니다. 여태까지는 그런대로 잘됐다. 그러나 로컬에서 생성된 트래픽(예: 시스템에서 다른 곳으로 ping 또는 ssh하려는 경우)에는 특별한 처리가 필요합니다(질문의 큰 인용문 참조).
처음 네 개의 포스트업 라인은 /etc/network/interfaces
간단하며 인터넷에서 설명할 수 있습니다. 다섯 번째이자 마지막 포스트업 라인은 마법을 일으키는 라인입니다.
post-up ip r add default via 192.168.178.1 metric 100 dev eth0
이 백라인에 대한 라우팅 테이블을 지정하지 않았습니다. 라우팅 테이블을 지정하지 않으면 main
에서 본 라우팅 테이블 에 정보가 저장됩니다 ip rule show
. 이 포스트라인은 기본 경로를 "기본" 경로 테이블에 넣습니다. 이 경로는 들어오는 트래픽에 대한 응답이 아닌 로컬에서 생성된 트래픽에 사용됩니다. (예를 들어 서버의 MTA는 이메일 전송을 시도합니다.)
세 가지 인터페이스 모두 메트릭은 다르지만 기본 라우팅 테이블에 기본 경로를 배치합니다. 라우팅 main
테이블을 살펴보겠습니다 ip route show
.
default via 192.168.178.1 dev eth0 metric 100
default via 192.168.178.1 dev wlan1 metric 101
default via 192.168.178.1 dev wlan0 metric 102
192.168.178.0/24 dev wlan0 proto kernel scope link src 192.168.178.97
192.168.178.0/24 dev eth0 proto kernel scope link src 192.168.178.99
192.168.178.0/24 dev wlan1 proto kernel scope link src 192.168.178.98
비록 측정항목은 다르지만 기본 라우팅 테이블에 세 가지 기본 경로가 있음을 알 수 있습니다. 가장 높은 우선순위는 eth0, wlan1, 마지막으로 wlan0입니다. 메트릭 번호가 낮을수록 우선순위가 높기 때문입니다. 메트릭이 가장 낮으므로 이것이 기본 경로이며 eth0
시작될 때마다 사용됩니다. 장애가 eth0
발생하면 eth0
나가는 트래픽이 로 전환됩니다 wlan1
.
이 설정을 사용하면 ping 8.8.8.8
하나의 터미널과 ifdown eth0
다른 터미널에 입력할 수 있습니다. 나가는 트래픽이 로 전환되므로 ping
계속 작동해야 합니다 .ifdown eth0
eth0
wlan1
포스트다운 라인은 ip rule show
모든 것을 깔끔하게 유지하기 위해 인터페이스가 다운될 때 관련 라우팅 테이블이 라우팅 정책 데이터베이스()에서 제거되도록 합니다.
남은 문제는 eth0
기본 경로에서 플러그를 뽑을 때 경로가 eth0
여전히 존재하고 나가는 트래픽이 실패한다는 것입니다. 인터페이스를 모니터링하고 ifdown eth0
인터페이스에 문제가 있는 경우(예: 네트워크 카드에 문제가 있거나 누군가가 플러그를 뽑는 경우) 조치를 취하기 위한 조치가 필요합니다.
마지막 단계: 입력하다 ifplugd
. 이것은 인터페이스를 모니터링하고 ifup/ifdown
플러그가 뽑혀 있거나 Wi-Fi 연결에 문제가 있을 때 실행되는 데몬입니다 /etc/default/ifplugd
.
INTERFACES="eth0 wlan0 wlan1"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"
이제 플러그를 뽑으면 eth0
나가는 트래픽이 로 전환됩니다 wlan1
. 플러그를 다시 꽂으면 나가는 트래픽이 다시 전환됩니다 eth0
.세 가지 인터페이스 중 하나라도 제대로 작동하는 한 서버는 온라인 상태를 유지합니다.서버에 연결하려면 IP 주소 eth0을 사용하고, 연결에 실패할 경우 wlan1 또는 wlan0 IP 주소를 사용하면 됩니다.
답변2
Linux는 스크립트 솔루션보다 더 나은 솔루션인 사전 예방적 백업 바인딩을 제공합니다.
이런 식으로 귀하의 기계는 다음과 같은 정보만을 갖게 됩니다.하나IP 주소(및 MAC 주소) 및 인터페이스를 사용할 수 없는 경우 인터페이스를 자동으로 투명하게 전환합니다. TCP 연결(내부 LAN 또는 인터넷)은 중단되지 않습니다.
저는 이 설정을 사용하여 도크에서 노트북 연결을 끊을 때 Debian 노트북의 eth0에서 wlan0으로 자동 장애 조치를 수행합니다.
내 /etc/network/인터페이스:
# The primary network interface
allow-hotplug eth0
iface eth0 inet manual
bond-master bond0
bond-primary eth0
# The secondary network interface
allow-hotplug wlan0
iface wlan0 inet manual
pre-up sleep 5
wpa-conf /etc/wpa_supplicant.conf
bond-master bond0
bond-primary eth0
# The bonding interface
allow-hotplug bond0
iface bond0 inet dhcp
bond-slaves eth0 wlan0
bond-primary eth0
bond-mode active-backup
bond-miimon 10
bond_downdelay 10
bond_updelay 4000
여러 WLAN 장치를 포함하도록 이 설정을 쉽게 확장할 수 있습니다. 옵션을 (가장 빠른 링크 자동 선택)
primary_reselect
으로 설정하면 better
도움이 됩니다.
자세한 내용은 다음을 참조하세요.https://wiki.linuxfoundation.org/networking/bonding그리고https://wiki.debian.org/본딩
(물론) Linux 커널 문서도 있습니다:https://www.kernel.org/doc/Documentation/networking/bonding.txt