이더넷을 통해 하나의 네트워크에 연결되고 Wi-Fi를 통해 다른 네트워크에 연결된 장치가 있습니다. 나는 netctl을 사용하여 인터페이스를 관리합니다. 두 netctl 프로필이 모두 활성화되면 구성은 다음과 같습니다.
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether b8:27:eb:eb:ab:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.1.200/21 brd 192.168.7.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::ba27:ebff:feeb:abdc/64 scope link
valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether b8:27:eb:be:fe:89 brd ff:ff:ff:ff:ff:ff
inet 10.10.0.89/23 brd 10.10.1.255 scope global noprefixroute wlan0
valid_lft forever preferred_lft forever
inet6 fe80::ba27:ebff:febe:fe89/64 scope link
valid_lft forever preferred_lft forever
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 10.10.0.1 0.0.0.0 UG 303 0 0 wlan0
10.10.0.0 0.0.0.0 255.255.254.0 U 303 0 0 wlan0
192.168.0.0 0.0.0.0 255.255.248.0 U 0 0 0 eth0
두 netctl 프로필이 모두 활성화된 경우 이더넷 인터페이스를 지정하면 호스트(google.com)에 성공적으로 ping을 보낼 수 있지만 wifi 인터페이스를 지정하면 ping이 실패하는 것으로 나타났습니다.
$ ping -c4 -Ieth0 google.com
PING google.com (74.125.136.100) from 192.168.1.200 eth0: 56(84) bytes of data.
64 bytes from 74.125.136.100 (74.125.136.100): icmp_seq=1 ttl=44 time=21.4 ms
64 bytes from 74.125.136.100 (74.125.136.100): icmp_seq=2 ttl=44 time=21.3 ms
64 bytes from 74.125.136.100 (74.125.136.100): icmp_seq=3 ttl=44 time=21.10 ms
64 bytes from 74.125.136.100 (74.125.136.100): icmp_seq=4 ttl=44 time=37.1 ms
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 7ms
rtt min/avg/max/mdev = 21.317/25.440/37.086/6.729 ms
$ ping -c4 -Iwlan0 google.com
PING google.com (74.125.136.138) from 10.10.0.89 wlan0: 56(84) bytes of data.
--- google.com ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 154ms
이 동작을 보고 이더넷 케이블을 분리해 보았지만 여전히 wlan0으로 ping을 수행할 수 없었고 eth0이 IP 주소, 게이트웨이 등을 유지하고 있는 것으로 나타났습니다. 변경되는 유일한 것은 state DOWN
대신 보고한다는 것입니다 state UP
.
그런 다음 나는 netctl stop my-ethernet-profile
달렸다실제로실제로 프로필을 중지하려면할 수 있다wlan0에서 성공적으로 핑을 보냈습니다. 따라서 ICMP는 wlan0에서 차단되지 않습니다. eth0에 대한 프로필이 실제로 중지되면 모든 것이 괜찮아 보입니다. 단, 실행 중인 동안은 그렇지 않습니다(인터페이스에 관계없이 UP
) DOWN
.
그래서 저는 몇 가지를 이해하려고 노력하고 있습니다.
- 두 장치가 모두 연결되어 있을 때(더 정확하게는 두 netctl 프로필이 모두 활성화되어 있을 때) Wi-Fi 핑이 실패하는 이유는 무엇입니까?
- 이더넷 인터페이스가 연결되지 않았음을 인식하는데도 시스템이 구성을 유지하는 이유는 무엇입니까?
- 인터페이스가 다운되었을 때 프로필을 중지하도록 netctl을 구성하는 방법이 있습니까?
- 상태가 에서 전환될 때 임의의
UP
스크립트를 실행하는 방법이 있습니까DOWN
? 예를 들어,netctl stop my-ethernet-profile
케이블이 분리된 상태에서 달려야 한다면 어떻게 될까요 ?
마지막으로, 본딩된 인터페이스나 WiFi 장애 조치를 수행하는 방법이 있다는 것을 알고 있지만 이는 특정 용도에 해당됩니다. 제가 바퀴를 재발명하는 것처럼 들릴 수도 있지만, 거기에는 그럴 만한 이유가 있습니다.
답변1
나는 그것에 익숙하지 않지만 netctl
기본적인 문제는 커널 라우팅 테이블이 두 개의 기본 게이트웨이를 지정한다는 사실과 관련이 있습니다.
두 장치가 모두 연결되어 있을 때(더 정확하게는 두 netctl 프로필이 모두 활성화되어 있을 때) Wi-Fi 핑이 실패하는 이유는 무엇입니까?
여기서 문제는 두 개의 기본 게이트웨이가 포함된 라우팅 테이블로 인해 발생합니다.
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 10.10.0.1 0.0.0.0 UG 303 0 0 wlan0
경로가 충돌하는 경우(이 두 가지 경우처럼) 커널은 "메트릭"이 가장 낮은 경로(이 경우 값이 "0"인 eth0)를 선택하거나 첫 번째 경로가 추가된 것으로 생각합니다.
핑을 보내는 이유원격 호스트예제에서 무선 인터페이스를 지정할 때 실패하면 ping -Iwlan0
커널이 지정한 인터페이스를 사용하여 해당 원격 호스트로 라우팅하는 방법을 알지 못할 가능성이 높습니다. 기술적으로 기본 게이트웨이(메트릭이 가장 낮은)는 다음을 통해 도달하기 때문입니다. 또 다른 인터페이스. 이러한 핑은 비트버킷으로 들어갈 가능성이 높습니다.
중복성
한쪽 또는 다른 쪽이 중단될 경우를 대비해 중복 인터넷을 찾고 있다면 다음을 수행하기 위해 자체 쉘 스크립트를 작성하는 것이 좋습니다.
- 기본 게이트웨이 인터페이스에 트래픽이 흐르지 않는 경우 감지
- 기본 GW의 새 인터페이스를 사용하도록 커널 라우팅 테이블을 변경합니다.
- 기본 인터페이스에서 트래픽을 모니터링합니다(UP 및 원격 호스트에 도달할 수 있음).
- 라우팅 테이블을 기본 인터페이스로 다시 구성합니다.
참고: netctl 설정무선 장애 조치에 유선 연결기본 레이어 1 연결(케이블 분리 또는 WiFi AP 꺼짐)을 보장하려는 경우 유용할 수 있지만 일반적으로 두 인터페이스가 모두 동일한 네트워크에 있어야 하며 기본적으로 동일한 게이트웨이에서 인터넷을 받아야 합니다.
인터페이스가 다운되었을 때 프로필을 중지하도록 netctl을 구성하는 방법이 있습니까?
나는 preup 및 predown 지시문을 사용하여 이 작업을 수행할 수 있다고 믿습니다.
ExecUpPost='ifconfig wlan0 down|| true'
ExecDownPre='ifconfig wlan0 up|| true'
/etc/netctl/hooks/
설명서를 확인하세요 .