나는 untangle box(아래 debian 10)를 가지고 있고 한 서브넷의 호스트에서 다른 서브넷의 호스트로 WOL 패킷을 전달하려고 합니다.
나의 초기 솔루션은 Knockd를 사용하고 한 서브넷의 인터페이스에서 syn 패킷을 수신한 다음 다른 서브넷에서 etherwake 명령을 실행하여 호스트를 깨우는 것이었습니다. netcat을 사용하여 첫 번째 서브넷의 Linux 서버에서 게이트웨이 IP(unbox)로 syn 패킷을 보냅니다.
문제는 방화벽 자체에 대한 트래픽이 처음에는 주소가 지정되지 않은 VLAN 인터페이스에서 처리된다는 것입니다. 이것은 약간 이상합니다. syn 패킷은 주소가 지정되지 않은 인터페이스에만 표시되고 다른 모든 패킷은 실제 주소가 지정된 VLAN 인터페이스에 표시됩니다. 나는 이것을 tcpdump로 확인했습니다. Knockd는 IP 주소가 없는 인터페이스에서 수신을 거부했기 때문에 Knockd를 사용하려는 나의 계획을 깨뜨렸습니다.
tcpdump를 사용하여 주소가 지정되지 않은 인터페이스로 들어오는 syn 패킷을 볼 수 있으며 knockd는 뒤에서 tcpdump를 사용하고 있습니다. 그렇다면 Knockd가 주소가 지정되지 않은 인터페이스를 수신하도록 강제하는 방법이 있습니까?
Knockd가 완전히 불가능하다면 Debian 10에서 WOL 패킷 전달자를 어떻게 구현하시겠습니까?
답변1
호스트를 깨울 때의 문제는 호스트에 패킷을 보내려면 네트워크 스택이 NIC의 MAC 주소를 알아야 한다는 것입니다. 일반적으로 동적으로 처리됩니다.ARP. MAC 항목이 라우터의 ARP 테이블에서 제거된 경우 호스트는 잠자는 동안 ARP 쿼리에 응답할 수 없습니다. 따라서 라우터는 잠자는 호스트에 도달하여 WOL Magic Packet™을 보내는 데 필요한 MAC 주소를 얻을 수 없습니다.패킷에는 MAC 주소의 16배가 포함되어 있습니다.페이로드에서.
네트워크 스택에만 의존하여 이 문제를 극복하는 두 가지 방법이 있습니다.iptables또는TC).
영구 ARP
라우터가 제어권을 가지므로 휴면 호스트에 대해 라우터에 영구 ARP 항목을 설정할 수 있습니다. 이렇게 하면 이전 문제가 결코 발생하지 않습니다. 이제 라우터는 어디서든 브로드캐스트를 사용하지 않고도 쉽게 WOL Magic Packet™을 보내거나 전달할 수 있습니다. NAT를 통한 "포트 포워딩"은 원격 호스트가 사용할 수 있습니다wakeonlan
etherwake
명령( UDP 포트를 변경할 수 있으므로 명령이 아님 ).
따라서 휴면 호스트에는 고정 주소(또는 영구 DHCP 임대가 있는 주소)가 필요합니다. 라우터의 WAN 주소가 192.0.2.2라고 가정합니다.웡 0, 라우터 LAN 측 인터페이스는 192.168.1.1/24입니다.랜 0MAC 주소가 12:34:56:78:9a:bc인 인터페이스의 잠자는 호스트 192.168.1.101/24입니다.
라우터에서:
ip neighbour replace 192.168.1.101 lladdr 12:34:56:78:9a:bc dev lan0 nud permanent
NIC가 수신한 패킷이 소비될지 또는 깨어 있는 호스트에서 여전히 적절하게 사용할 수 있는지 확실하지 않기 때문에 전통적으로 포트 9가 선택됩니다.드롭 서비스"실행 중"이고 둘 다 동일한 경우. 필요한 경우 9 이외의 포트를 선택하세요. 잠자는 호스트의 이 포트는 사용되지 않고 방화벽으로 보호되거나(패킷 삭제) 실제로 삭제 서비스를 실행하는 것이 좋습니다. 하나의 포트가 하나의 대상에 매핑되므로 여러 WOL 호스트가 있는 경우 각 호스트는 서로 다른 포트를 가져야 합니다.
OP 설명의 다른 곳에 도착하는 첫 번째 패킷 문제는 OP 설명의 일부가 아닌 모든 인터페이스를 선택하여 해결할 수 있습니다.랜 0상호 작용.
따라서 여전히 라우터에서 다음을 사용하십시오.iptables, DNAT를 수행하고 패킷이 리디렉션되도록 허용합니다.
iptables -t nat -I PREROUTING ! -i lan0 -p udp --dport 9 -j DNAT --to-destination 192.168.1.101
iptables -I FORWARD -m conntrack --ctstate DNAT -d 192.168.1.101 -j ACCEPT
이제 인터넷의 원격 호스트는 다음을 수행하여 휴면 호스트를 깨울 수 있습니다.
wakeonlan -i 192.0.2.2 -p 9 12:34:56:78:9a:bc
시스템 통합은 네트워크 구성에 사용되는 방법에 따라 다릅니다. 예를 들어 다음과 같이 구성한 경우interfaces
그리고위 아래라면, 이 두 명령은 섹션의 명령으로 추가되거나 iptables
명령에서 제거될 수 있습니다.pre-up
iface lan0 ...
down
ip neighbour
up
직접 서브넷 브로드캐스트(커널 4.19부터 시작)
도구에는 항상 대상 호스트를 포함한 모든 호스트에 브로드캐스트 이더넷 프레임으로 도착하는 브로드캐스트 패킷을 사용할 수 있는 옵션이 있습니다.
이는 라우팅 시 수행될 수 있지만 더 많은 위험이 따릅니다(참여 포함).반사 공격). 사용하기 전에 안전을 고려하십시오.
직접 서브넷 브로드캐스트를 전역적으로 활성화해야 합니다.그리고수신 WAN 인터페이스(대상 LAN 인터페이스 아님) WAN 인터페이스가 여러 개 있을 수 있는 경우(OP는 패킷이 한 인터페이스에 먼저 도착하고 그 다음에는 다른 인터페이스에 도착하는 것을 설명합니다) 관련된 모든 인터페이스에서 이를 활성화합니다.
sysctl -w net.ipv4.conf.all.bc_forwarding=1
sysctl -w net.ipv4.conf.wan0.bc_forwarding=1
NAT 및 FORWARD 규칙을 추가합니다.
iptables -t nat -I PREROUTING ! -i lan0 -p udp --dport 9 -j DNAT --to-destination 192.168.1.255
iptables -I FORWARD -m conntrack --ctstate DNAT -d 192.168.1.255 -j ACCEPT
위험을 제한하기 위한 옵션으로 IPv4 이더넷 프레임(이더 유형 0x800)을 WOL용 사실상 이더넷 유형 0x842로 변환하려면 다음을 사용하세요.TC, 따라서 결과는 네트워크 스택에서 무시됩니다(WOL NIC에서는 무시되지 않음). iptables에 의해 설정된 플래그를 사용할 수 있으며, 여기서는 IP 대상과 UDP 대상 포트 9만 고려됩니다. Untangle이 사용하는 경우 전자의 방법이 마커와 충돌하고, Untangle이 사용하는 경우 두 방법 중 하나가 충돌합니다.TC서비스 품질을 위해.
tc qdisc add dev lan0 root handle 1: prio # simple classful qdisc used only to enable filters
tc filter add dev lan0 parent 1: protocol ip basic match '
cmp (u32 at 16 layer network eq 0xc0a801ff) and
cmp (u8 at 9 layer network eq 17) and
cmp (u16 at 2 layer transport eq 9)
' action skbmod set etype 0x842
이상,
- 16계층 네트워크 eq 0xc0a801ff의 U32는 IP 주소 대상 192.168.1.255를 나타냅니다.
- u8은 레이어 9 네트워크 eq 17의 UDP를 나타냅니다.
- u16은 대상 포트 9에 대해 계층 2에서 eq 9를 전송합니다.
- 결과는 Ether 유형을 0x842로 변경하는 것입니다.
마찬가지로 인터넷의 원격 호스트는 이제 다음을 수행하여 휴면 호스트를 깨울 수 있습니다.
wakeonlan -i 192.0.2.2 -p 9 12:34:56:78:9a:bc
하지만 매번 전체 LAN을 대상으로 하기 때문에 여러 개의 절전 WOL 호스트가 있는 경우 동일한 포트를 유지하고 MAC 주소만 변경하면 충분합니다.
고려해야 할 다른 방법:
fwknopd
서버에 설치하고fwknop
암호화를 구현하기 위해 클라이언트에 설치됨하나의명령을 실행하는 패킷 인증 메커니즘입니다. 이는 라우터에서 / 실행을 트리거하는 데 사용될 수 있습니다 wakeonlan
.etherwake