Я уже имею 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.
Предоставьте полное рабочее решение.
У меня есть два пользовательских решения, которые вы можете использовать. Один использует только 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: Решите, какой подход вы хотите использовать: Обнаружение только SSID Wi-Fi или обнаружение MAC-адреса. В зависимости от того, какое решение вы хотите использовать, следуйте конкретному разделу ниже.
Это сам код 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
.
Это код 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.
#!/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
#!/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
означает, что скрипт будет запускаться каждые 5 минут.
Если вы используете nano в качестве редактора текстовых файлов, выйдите из редактора, нажав Ctrl kbd> + X kbd>. Редактор предложит вам сохранить изменения. Нажмите Y kbd>, а затем нажмите Enter kbd>, чтобы выбрать имя файла по умолчанию.
Надеюсь, это поможет.