Ограничить обновления ddclient для домашней сети

У меня уже есть ddclient 3.8.2 работа с OpenDNS. Я запускаю его на своем ноутбуке. Я могу путешествовать со своим ноутбуком, и поэтому я не хочу обновлять IP, если меня нет дома.

Как мне ограничить ddclient обновить IP только если я нахожусь в моей домашней сети? Это выборочно должно быть автоматизировано.

Есть по крайней мере два способа определить, нахожусь ли я в моей домашней сети:

  • Предположим, я использую Wi-Fi, и что мой домашний Wi-Fi имя SSID home-ssid, Предположим, я могу настроить это имя.

  • В качестве альтернативы предположим, что MAC-адрес моего маршрутизатора F7:C1:A2:54:4F:71 (не настоящие). Предположим, я могу настроить это значение. Этот подход предназначен для работы как для Wi-Fi и / или проводной.

Если ничего другого, взломать можно было бы с помощью use=cmd вместо use=web в /etc/ddclient.conf, Затем я могу получить интеллектуальную ошибку внешней команды или вернуть неизмененный IP-адрес, если меня нет дома. Для этого обратите внимание, что /var/cache/ddclient/ddclient.cache кеширует последний известный IP.

Пожалуйста, предоставьте полное рабочее решение.

2 ответа

У меня есть два пользовательских решения, которые вы можете использовать. Один использует только Wi-Fi SSID, другой использует определение MAC-адреса.

Обе версии имеют обязательное условие работы ddclient конфигурация для OpenDNS.


Шаг 1 для обоих: отключить ddclient автоматические казни.

Я знаю руководство, которое вы использовали для его настройки, если бы вы настроили его как демон, но мы собираемся отключить автоматизированный ddclient процессы обновления.

редактировать /etc/default/ddclient, Мы собираемся отключить режим демона для начала и отключить dhclient а также ipup интеграций. Это должно сделать его похожим на это:

# Configuration for ddclient scripts
# generated from debconf on Tue Jun 26 12:45:45 EDT 2018
#
# /etc/default/ddclient

# Set to "true" if ddclient should be run every time DHCP client ('dhclient'
# from package isc-dhcp-client) updates the systems IP address.
run_dhclient="false"

# Set to "true" if ddclient should be run every time a new ppp connection is
# established. This might be useful, if you are using dial-on-demand.
run_ipup="false"

# Set to "true" if ddclient should run in daemon mode
# If this is changed to true, run_ipup and run_dhclient must be set to false.
run_daemon="false"

# Set the time interval between the updates of the dynamic DNS name in seconds.
# This option only takes effect if the ddclient runs in daemon mode.
daemon_interval="300"

Теперь отключите ddclient сервис, так что не будет автозапуска. У меня есть только синтаксис 16.04 и выше, чтобы отключить службу, но есть и другие темы на тему "Как отключить службы".

sudo systemctl disable ddclient

После того, как это будет сделано, вы можете использовать любой из двух вариантов ниже и их инструкции для настройки пользовательских автоматических процессов.

Шаг 2: Решите, какой подход вы хотите использовать: обнаружение только Wi-Fi SSID или обнаружение MAC-адреса. В зависимости от того, какое решение вы хотите использовать, следуйте конкретному разделу ниже.


Только Wi-Fi: обнаружение SSID

Это сам код Python для обнаружения на основе SSID. Введите правильный SSID Wifi для значения, хранящегося в WIFI_NETWORK_NAME,

#!/usr/bin/python3

import shlex
import subprocess as sp

# Replace 'FillMeIn' in this line with the actual network name.
WIFI_NETWORK_NAME = "FillMeIn"

proc = sp.getoutput(shlex.split('iwconfig'))

if WIFI_NETWORK_NAME in proc:
    sp.call(shlex.split('ddclient -file /etc/ddclient.conf'))

Сохраните этот код в /opt/py-selective-ddclient.py, Возможно, вам придется сохранить это в вашем домашнем каталоге, а затем скопировать его в /opt/ с sudo,


Wifi и Ethernet: обнаружение MAC-адреса

Это код Python для этого решения; обновить значение для MAC_ADDRESS_ROUTER соответственно:

#!/usr/bin/python3

import shlex
import subprocess as sp

# Replace the fake MAC address below with the MAC address of your router.
# Make sure to use **uppercase letters** if you have letters present.
MAC_ADDRESS_ROUTER = "01:23:45:67:89:AB"

if MAC_ADDRESS_ROUTER in sp.getoutput(shlex.split('iwgetid -ra')).upper():
    sp.call(shlex.split('ddclient -file /etc/ddclient.conf'))

Сохраните этот код в /opt/py-selective-ddclient.py, Возможно, вам придется сохранить это в вашем домашнем каталоге, а затем скопировать его в /opt/ с sudo,


Шаг 3: Автоматизируйте вызовы кода Python.

Теперь мы должны автоматизировать бег ddclient или, более конкретно, автоматизировать скрипт Python. По умолчанию ddclient Настройки имеют задержку в 300 секунд (5 минут) между проверками обновлений.

Сначала нам нужно сделать исполняемый скрипт Python.

sudo chmod +x /opt/py-selective-ddclient.py

Затем начните с создания файла в /etc/cron.d/ со следующим содержанием. Обратите внимание, что вам нужно будет использовать sudo создать файл.

*/5 * * * *  root  /opt/py-selective-ddclient.py

Это выполняет ddclient вручную каждые 5 минут. Вы можете изменить */5 часть, чтобы заставить его выполняться через разные промежутки времени, но я эмулирую ddclient настроен здесь.

Теперь каждые 5 минут ddclient будет вызван с использованием нашего скрипта-обёртки, который выполняет выборочное определение.

Эти сценарии требуют рабочего ddclient конфигурация для OpenDNS.

Вот версия Bash, которая проверяет имя домашней сети Wi-Fi

#!/bin/bash 
# Read the name of the Wi-Fi network the computer is conneted to
# If not connected to wifi echo message and quit
# If home network run ddclient
# If any other network quit

# Change FillMeIn to your WiFi network name
HOMEWIFI= FillMeIn 

# Get the current WiFi network name
SSID=$(iwgetid -r)

if   [[ ! $SSID ]]; then        # Not on WiFi
    echo "Could not find any WiFi, exiting..."
elif [[ $SSID == $HOMEWIFI ]]; then
    echo "We are home! Running ddclient now."
    /usr/sbin/ddclient -file /etc/ddclient.conf
else
    echo "This WiFi is not home! Exiting..."
fi

Если вы хотите менее подробный минимальный код, используйте следующие строки:

#!/bin/bash 
# Change FillMeIn to your WiFi network name
HOMEWIFI= FillMeIn 
SSID=$(iwgetid -r)      # -r for SSID
if [[ $SSID == $HOMEWIFI ]]; then
    /usr/sbin/ddclient -file /etc/ddclient.conf
fi

Вот версия bash, которая проверяет MAC-адрес домашнего маршрутизатора

#!/bin/bash 
# Change FillMeIn to your router's MAC address
ROUTERMAC= FillMeIn 
$MACA=$(iwgetid -ra)      # -ra for MAC address
if [[ $MACA == $ROUTERMAC ]]; then
    /usr/sbin/ddclient -file /etc/ddclient.conf
fi

Вам нужен только один из них. Сохраните любой из трех сценариев в /opt/home_wifi_ddclient.sh и сделать скрипт исполняемым:

sudo chmod + x /opt/home_wifi_ddclient.sh

Для создания записи cron я предлагаю использовать crontab:

sudo crontab -e

Эта команда откроет crontab файл для пользователя root, если таковой существует, или создайте новый пустой файл. Добавьте следующую строку в конец файла:

*/5 * * * *  root  /opt/home_wifi_ddclient.sh

*/5 part означает, что скрипт будет запускаться каждые 5 минут.

Если вы используете nano в качестве редактора текстовых файлов, выйдите из редактора, нажав Ctrl + X. Редактор предложит вам сохранить изменения. Нажмите Y, а затем нажмите Enter, чтобы выбрать имя файла по умолчанию.

Надеюсь это поможет

Другие вопросы по тегам