Pull to refresh

Comments 14

ибо «работает — ради бога не трогай» (с).

зачем тогда надо было менять Windows XP и Kerio Winroute Firewall?
1. Машина с виндой умирала по-тихоньку, сама по себе была слабенькой.
2. WinXP была не лицензионной.
Поэтому при смене машины (модем оставался еще тот же) — поставил линукс, о чем ни капли не жалею. Если б на тот момент менялся и модем — этого поста бы сейчас не было.
Честно говоря не понял зачем все это?
ddclient присутствует практически в каждом дистрибутиве линукса и вполне выполняет свою роль. (адреса обновляются, ничего не банится и не отключается)
ddclient умеет определять, что внешний IP изменился? Думаю — вряд ли. Поэтому приходится постоянно следить за этим, и отправлять свой новый IP только если он изменился. А банит сам сервис dyndns.org из-за частых отправлений одинаковых IP (в бесплатном аккаунте, в платном, я так понял, можно хоть каждую секунду отправлять данные).
Первый скрипт как раз и проверяет — обновился ли внешний IP, если да — отправляем данные в сервис, если нет — ничего не делаем.

ddclient — также рекомендован dyndns.org. Честно говоря не помню, почему выбрал именно inadyn, но думаю можно использовать любой подобный пакет, а также что-то подобное этому.
собственно говоря, умеет, в случае серого ip на машине раз в N минут проверяет текущий ip и если надо обновляет. есть различные варианты проверки и поведения.
Хм, здорово. Не знал про это. Спасибо, надо будет почитать про него.
кстати применительно к вашему случаю. ppoe я так понимаю на centOS поднимается, соотв и ddclent умеет стартовать и обновлять каждый раз после поднятия сессии. а в период живой сессии ip неизменен.
Да именно так все и работает.
У меня ddclient переодически подвисал, бывало и 10 раз в день и два раза в месяц. С чем это связано так и не выяснил. Написал скрипт, который проверяет зависший демон ddclient или нет.

#!/bin/sh
# This script need run from crontab each one minute.

PATH=/bin:/usr/bin

db="/root/scripts/ddclient.data"
log="/var/log/ddclient.log"

newpos=`ps x|awk /ddclient/'{printf $9}'`
oldpos=`cat $db`

if [ $newpos = $oldpos ] ; then
        /etc/init.d/ddclient restart
        echo -n 0 > $db
        date "+%Y-%m-%d %H:%M Restart ddclient deamon." >> $log
else
        echo -n $newpos > $db
fi
Я сделал следующим образом, но для этого нужен сервер с белым айпи и ssh доступом к нему.
На компе за натом выполняю команду по крону:
ssh user@whiteserver 'env | grep SSH_CONNECTION > ip.txt'
только надо не забыть организовать доступ по открытому ключу.
все просто у меня модем на бридже и скрипт в кроне каждые 10 минут:

#!/bin/sh
#Скрипт отправляет на почту текущий динамический адрес

#Переменные
LAST_IP=`cat /root/last_ip`
INTERFACE="dsl1"
STRING=`ifconfig $INTERFACE | grep "inet addr"`
IP=`echo $STRING | gawk -F: '{print $2}' | gawk -F' ' '{print $1}'`;

#Узнаем IP и заносим его в файл /root/last_ip если ip совпадаеи с ip что в файле то он не перезаписываеться
if [ "$LAST_IP" != "$IP" ]; then

#Если отличаеться то записываеться
echo $IP > /root/last_ip

#Отправляем содержимое на email 
cat | grep "" /root/last_ip | ssmtp -v -s 'ADSL' user@gmail.com

fi
Тоже имеет право на жизнь. Но
1. Кроме меня удаленно могут подключиться и другие юзеры.
2. Поставил на шлюз веб-сервер, чисто для себя, чтобы при необходимости какой-нибудь скрипт проверить — и не надо лезть на почту и искать текущий IP — все же dns-имя проще запомнить, а оно у меня всегда актуальное.
Может стоит добавить обновление IP-адреса при создании соединения?
Вообще все это странно. Я не разу не встречался с блокировкой dyndns аккаунта. В учетную запись уже забыл когда залезал. Наверно года 4 назад.

Далее вот часть скрипта который будет мониторить ip и вызывать другой скрипт если он поменялся.
Писался он для update ipv6 адреса туннеля. Сейчас это не актуально.
Код можно еще улучшить, но мне уже лень :)

#!/bin/bash

NAME=ipv6daemon
PIDFILE=$NAME.pid
INT_WAN=ppp0
WAN_IP=$(ip addr show $INT_WAN | awk '/inet/ {print $2}')


case "$1" in
	start)
		echo "Starting ipv6update service"
		
		if [ ! -r "$PIDFILE" ]; then
	
		exec >/dev/null
		exec 2>/dev/null

		(
                trap "" TERM
		echo ${BASHPID} > "$NAME".pid

                ./ipv6update

                while true
                do
                        IP_ADDR=$(ip addr show $INT_WAN | awk '/inet/ {print $2}')
                        if [ "$IP_ADDR" != "$WAN_IP" ]; then
                        WAN_IP="$IP_ADDR"
                        ./ipv6update
                        fi
                sleep 60
                done
                )&
	
		fi
		if read pid < "$PIDFILE" && ps -p "$pid" > /dev/null 2>&1; then
			echo "$NAME allready is running $pid"
			exit 0
		else
			echo "$NAME is not running but $PIDFILE exists."
			exit 1
		fi
		;;
Sign up to leave a comment.

Articles