Разбудить компьютер через Интернет, используя другой компьютер в той же локальной сети

450
ivanp7

У меня есть два компьютера на базе Arch Linux, «A» и «B», подключенные к Интернету через один и тот же маршрутизатор. Я настроил и протестировал Wake-on-WAN на обоих из них. Оба компьютера выключены большую часть времени.

Я хотел бы подключиться к ним, не отправляя волшебные пакеты извне. Сетевая карта компьютера «А» поддерживает пробуждение от одноадресной активности, поэтому я включил его. Проблема в том, что это не относится к компьютеру «B» - его может разбудить только волшебный пакет.

Могу ли я заставить компьютер «А» автоматически разбудить компьютер «Б» при попытке подключения к TCP / UDP последнему? Я думаю о решении, как это:

  1. Настройте маршрутизатор и компьютер «B» так, чтобы весь трафик «B» (через определенные порты) проходил через компьютер «A».
  2. Установите сценарий для «A», который каким-либо образом инициирует соединение с «B», проверяет состояние «B» и отправляет магический пакет.

Может быть, есть более простой способ?

РЕДАКТИРОВАТЬ:

Было бы хорошо, если бы можно было перенаправить все, чтобы трафик «B» не проходил через «A» после пробуждения первого, поэтому последний мог автоматически отключиться.

2

2 ответа на вопрос

0
VL-80

Вы можете создать bash-скрипт на компьютере, Aкоторый генерирует и отправляет волшебный пакет на компьютер Bпо локальной сети.

Как только вы разбудите компьютер Aодноадресным трафиком, сценарий может сработать автоматически, или вы можете Aзапустить SSH на компьютере и запустить его.

Этот ответ на StackOverflow описывает, как сделать такой скрипт.

Я не хочу, чтобы «Б» проснулся, когда я получил доступ к «А». Сценарий должен определить, есть ли соединение с портами, зарезервированными для 'B'. Во всяком случае, этот ответ является уточнением моего решения, спасибо. ivanp7 5 лет назад 0
«Я не хочу, чтобы« Б »проснулся, когда я получил доступ к« А ». ХОРОШО. Тогда не заставляйте скрипт запускаться автоматически. Всякий раз, когда вам нужно разбудить `B`, вы сначала разбудите` A`, вставьте SSH и запустите скрипт, который разбудит `B`. Таким образом, пробуждение `A` не приведет к автоматическому пробуждению` B`. VL-80 5 лет назад 0
Это то, что я делаю сейчас, но я хочу избавиться от ручной процедуры пробуждения. ivanp7 5 лет назад 0
Я собираюсь попробовать что-то вроде `if [[" $ (ss -anp | grep $ PORT | grep ESTAB | wc -l) "-gt" 0 "]]; затем wakeup.sh; fi` ivanp7 5 лет назад 0
@ ivanp7 Почему вы не позволяете маршрутизатору отправлять волшебный пакет? У вас есть хороший маршрутизатор с поддержкой оболочки, по крайней мере, с busybox? Xen2050 5 лет назад 1
@ Xen2050 Это было бы лучшим решением, если бы я сам купил роутер. Это дешевый Huawei HG8245H-256M, установленный моим провайдером. Когда-нибудь я куплю настоящий роутер, но сейчас я хочу получить как можно больше от нынешнего оборудования. ivanp7 5 лет назад 0
@ivanp7 Could try using your own router (or any other low power device with a shell, raspberry?) connected to the ISP's Huawei as another client, or daisy-chain your own router after the Huawei & have all your devices connected to your router Xen2050 5 лет назад 0
0
dirkt

Могу ли я заставить компьютер «А» автоматически разбудить компьютер «Б» при попытке подключения к TCP / UDP последнему?

Вам нужно будет передать запросы ARP на B, пока B спит, затем прослушать попытки подключения для IP B и отправить пакет пробуждения.

Это выполнимо, но достаточно сложно, я бы написал небольшую программу на C, используя пакетные сокеты для первоначального прокси ARP и попытки отслеживания соединения. Также необходимо управлять состоянием о B, сообщая, если B спит или нет, например, проверяя, отправляет ли B что-нибудь и отвечает на запросы ARP.

Вам понадобится немало понимания сетевых протоколов, чтобы написать это (или смотреть на перехваты Wireshark достаточно долго, пока вы не поймете, что происходит.

I have static ARP entries for A&B, therefore, I believe, the router won't send ARP packets? Why not just NAT some reserved port (let it be X) on A to B and have a daemon on A that detects connections to X, sending magic packet if neccesary? The main drawback of this approach is that A won't shut down while B is still in use. ivanp7 5 лет назад 0
У вас есть статические записи ARP для B на всех компьютерах, которые находятся в локальном сегменте и могут делать запросы или пересылать пакеты B? Если да, то вам не нужно иметь дело с ARP, но я бы просил актуальный запрос, чтобы убедиться. Эта небольшая программа на C в основном ** была бы ** демоном на A, который обнаруживает соединения с B (и обрабатывает ARP сверху, если это необходимо). Если вы можете перенаправить (NAT) все запросы к B на A на каком-либо маршрутизаторе перед A и B, то да, вы можете сделать это тоже (и NAT обратно на B на A), но вы не указали, где запросы могут поступать. Также со статическим ARP вам придётся NAT. dirkt 5 лет назад 0
Запросы поступают извне, и в локальной сети есть только два компьютера, A и B. У меня есть все оборудование, никаких ограничений по эксплуатации. ivanp7 5 лет назад 0
Тогда у меня возникнет соблазн выполнить пробуждение в маршрутизаторе - маршрутизатор все равно будет включен, вам не придется иметь дело с ARP (или даже использовать отсутствующий ответ ARP в качестве индикатора для отправки пакета WoL). Опять же, C-программа с сокетами пакетов, мониторинг ARP-запросов и ответов, состояние тайм-аута. Я не удивлюсь, если кто-то уже написал это где-то ... dirkt 5 лет назад 0
Боюсь, мой маршрутизатор Huawei HG8245 с Dopra Linux не позволит мне сделать это. Он имеет твердую статическую встроенную прошивку и слишком мало памяти для установки OpenWrt. В противном случае это был бы предпочтительный способ. ivanp7 5 лет назад 0
Но NATing B к A на HG8245 будет работать? Как насчет общих правил iptables? dirkt 5 лет назад 0
Извините за задержку. Он поддерживает простую переадресацию портов, а не многое другое. ivanp7 5 лет назад 0
Если вы не можете подключить NAT B к A на HG8245, статический ARP не будет работать (попытки подключиться к B закончатся только на B, а не на A), поэтому я бы использовал оригинальную идею в ответе ( ARP прокси, пока B не проснется). Если вам все равно придется перенести пересылку на B, вы можете все перенаправить на A, а затем собрать что-нибудь вместе, чтобы либо прослушать и отправить WoL, либо активировать NAT через iptables, но я не уверен, будет ли это проще. dirkt 5 лет назад 0