понедельник, 31 июля 2017 г.
пятница, 17 марта 2017 г.
Ограничение вызовов в транке по количеству и времени.
Я пользуюсь услугами оператора sipnet, а именно бесплатными звонками по городским номерам Москвы и Питера. Бесплатность как бы условная - на счету надо иметь не менее 10 у.е., и тогда появляется возможность совершать 5 разговоров в сутки, общей продолжительностью 30 мин. Для следования этим ограничениям был написан следующий диалплан.
Скорее всего это не самая изящная, а наверное даже громоздкая в части обработки переменнных конструкция, но тем не менее рабочая, и позволяющая сэкономить мои, и если захотите, ваши средства.
В /etc/asterisk/extensions.conf:
[sipnet]
exten => _7XXXXXXXXXX, 1, NoOp(=calling_sipnet=)
exten => _7XXXXXXXXXX, n, Set(TOTALCOUNT=5);общее количество возможных звонков
exten => _7XXXXXXXXXX, n, Set(CUR_COUNT=${SHELL(/home/asterisk/sipnet/count.sh)}) ;проверяем сколько звонков уже совершили
exten => _7XXXXXXXXXX, n, Set(ALLOW_COUNT=$[${TOTALCOUNT} - ${CUR_COUNT}]) ;отнимаем из значения одной переменной значение другой и выводим в третью переменную
exten => _7XXXXXXXXXX, n, ExecIf($[${ALLOW_COUNT} = 0]?Playback(tt-weasels)) ;в случае если значение полученной выше переменной равно 0 проигрываем звуковой файл
exten => _7XXXXXXXXXX, n, ExecIf($[${ALLOW_COUNT} = 0]?Hangup()) ;и кладем трубку
exten => _7XXXXXXXXXX, n, Set(TOTALTIME=1740) ;количество разрешенных секунд (я сознательно уменьшил на 60 секунд)
exten => _7XXXXXXXXXX, n, Set(CUR_TIME=${SHELL(/home/asterisk/sipnet/time.sh)}) ;получаем в переменную значение сколько секунд уже наговорили
exten => _7XXXXXXXXXX, n, Set(ALLOW_TIME=$[${TOTALTIME} - ${CUR_TIME}]) ;получаем в переменную сколько секунд осталось на разговоры
exten => _7XXXXXXXXXX, n, ExecIf($[${ALLOW_TIME} < 41]?Playback(tt-somethingwrong)) ; если менее 41 секунды - проигрываем файл
exten => _7XXXXXXXXXX, n, ExecIf($[${ALLOW_TIME} < 41]?Hangup()) ;и кладем трубку
exten => _7XXXXXXXXXX, n, Set(ALLOW_TIME_MILL=$[${ALLOW_TIME} * 1000]) ;для дальнейшего использования получаем из разрешенных секунд милисекунды
exten => _7XXXXXXXXXX, n, Set(LIMIT_WARNING_FILE=beep) ;проиграем beep в начале (типа время пошло)
exten => _7XXXXXXXXXX, n, Dial(SIP/${EXTEN}@sipnet,50,L(${ALLOW_TIME_MILL}:31000)) ;звоним 50 сек. задав длительность разговора значением ранее полученной переменной, за 31 сек. до конца разговора сообщим, что скоро время закончится (вспомним тут про 41 секунду фигурировавшую ранее)
exten => _7XXXXXXXXXX, n, Playback(vm-nobodyavail) ;в случае если никто не ответил или занято проиграем файл
exten => _7XXXXXXXXXX, n, Hangup() ;и положим трубку
В диалплане используются два bash скрипта, получающиеие значения из базы:
cat count.sh
#!/bin/bash
echo "SELECT COUNT('id') FROM cdr WHERE calldate >= CURDATE() and dstchannel like '%sipnet%' and disposition like 'ANSWERED';" | mysql -uasterisk_read -ppassw0rd asterisk | tail -n1
cat time.sh
#!/bin/bash
echo "SELECT SUM(billsec) FROM cdr WHERE calldate >= CURDATE() and dstchannel like '%sipnet%';" | mysql -uasterisk_read -ppassw0rd asterisk | tail -n1
Соответственно, чтобы все это работало mysql база содержащая таблицу CDR должна быть подключена к Asterisk.
Еще раз поясню:
Если уже было 5-ть попыток - проигрываем звуковой файл и сбрасываем звонок.
Определяем сколько секунд осталось говорить, (я сократил на минуту общую продолжительность на всякий случай на 60 секунд), если это значение менее 41 секунды проигрываем звуковой файл, и обрываем соединение, затем умножаем значение секунд которые можно говорить на 1000 для получения единицы в милисекундах и подставляем это значение в аргумент продолжительности разговора, когда до конца будет оставаться 31 секунда проигрывается сообщение сообщающее время оставшегося разговора, затем произойдет разрыв. Отсюда и значение 41 секунда - типа все равно за 41 секунду не поговорить, все равно через 10 сек проиграет сообщение о скором принудительном разрыве.
Скорее всего это не самая изящная, а наверное даже громоздкая в части обработки переменнных конструкция, но тем не менее рабочая, и позволяющая сэкономить мои, и если захотите, ваши средства.
В /etc/asterisk/extensions.conf:
[sipnet]
exten => _7XXXXXXXXXX, 1, NoOp(=calling_sipnet=)
exten => _7XXXXXXXXXX, n, Set(TOTALCOUNT=5);общее количество возможных звонков
exten => _7XXXXXXXXXX, n, Set(CUR_COUNT=${SHELL(/home/asterisk/sipnet/count.sh)}) ;проверяем сколько звонков уже совершили
exten => _7XXXXXXXXXX, n, Set(ALLOW_COUNT=$[${TOTALCOUNT} - ${CUR_COUNT}]) ;отнимаем из значения одной переменной значение другой и выводим в третью переменную
exten => _7XXXXXXXXXX, n, ExecIf($[${ALLOW_COUNT} = 0]?Playback(tt-weasels)) ;в случае если значение полученной выше переменной равно 0 проигрываем звуковой файл
exten => _7XXXXXXXXXX, n, ExecIf($[${ALLOW_COUNT} = 0]?Hangup()) ;и кладем трубку
exten => _7XXXXXXXXXX, n, Set(TOTALTIME=1740) ;количество разрешенных секунд (я сознательно уменьшил на 60 секунд)
exten => _7XXXXXXXXXX, n, Set(CUR_TIME=${SHELL(/home/asterisk/sipnet/time.sh)}) ;получаем в переменную значение сколько секунд уже наговорили
exten => _7XXXXXXXXXX, n, Set(ALLOW_TIME=$[${TOTALTIME} - ${CUR_TIME}]) ;получаем в переменную сколько секунд осталось на разговоры
exten => _7XXXXXXXXXX, n, ExecIf($[${ALLOW_TIME} < 41]?Playback(tt-somethingwrong)) ; если менее 41 секунды - проигрываем файл
exten => _7XXXXXXXXXX, n, ExecIf($[${ALLOW_TIME} < 41]?Hangup()) ;и кладем трубку
exten => _7XXXXXXXXXX, n, Set(ALLOW_TIME_MILL=$[${ALLOW_TIME} * 1000]) ;для дальнейшего использования получаем из разрешенных секунд милисекунды
exten => _7XXXXXXXXXX, n, Set(LIMIT_WARNING_FILE=beep) ;проиграем beep в начале (типа время пошло)
exten => _7XXXXXXXXXX, n, Dial(SIP/${EXTEN}@sipnet,50,L(${ALLOW_TIME_MILL}:31000)) ;звоним 50 сек. задав длительность разговора значением ранее полученной переменной, за 31 сек. до конца разговора сообщим, что скоро время закончится (вспомним тут про 41 секунду фигурировавшую ранее)
exten => _7XXXXXXXXXX, n, Playback(vm-nobodyavail) ;в случае если никто не ответил или занято проиграем файл
exten => _7XXXXXXXXXX, n, Hangup() ;и положим трубку
cat count.sh
#!/bin/bash
echo "SELECT COUNT('id') FROM cdr WHERE calldate >= CURDATE() and dstchannel like '%sipnet%' and disposition like 'ANSWERED';" | mysql -uasterisk_read -ppassw0rd asterisk | tail -n1
#!/bin/bash
echo "SELECT SUM(billsec) FROM cdr WHERE calldate >= CURDATE() and dstchannel like '%sipnet%';" | mysql -uasterisk_read -ppassw0rd asterisk | tail -n1
Еще раз поясню:
Если уже было 5-ть попыток - проигрываем звуковой файл и сбрасываем звонок.
Определяем сколько секунд осталось говорить, (я сократил на минуту общую продолжительность на всякий случай на 60 секунд), если это значение менее 41 секунды проигрываем звуковой файл, и обрываем соединение, затем умножаем значение секунд которые можно говорить на 1000 для получения единицы в милисекундах и подставляем это значение в аргумент продолжительности разговора, когда до конца будет оставаться 31 секунда проигрывается сообщение сообщающее время оставшегося разговора, затем произойдет разрыв. Отсюда и значение 41 секунда - типа все равно за 41 секунду не поговорить, все равно через 10 сек проиграет сообщение о скором принудительном разрыве.
пятница, 3 февраля 2017 г.
gprs soft router
Для обеспечения доступа к Интернет, а также к доступа к ресурсам локальной сети в удаленных подразделениях нашей организации была применена описанная ниже конфигурацию.
При работающем vpn-канале роутер обеспечивает маршрутизацию через сеть головного офиса, при отсутствующем через Интернет.
Софт-роутер построен на базе Ubuntu-server 16.04.
1.После инсталляции сервера вставим в usb-порт модем, убедимся, что модем определился в системе.
lsusb
Вывод будем примерно таким:
Bus 002 Device 002: ID 13d3:5711 IMC Networks
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 12d1:1506 Huawei Technologies Co., Ltd. Modem/Networkcard
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Видно, что модем присутствует.
2. Настроим ppp-интерфейс и попробуем подключиться к Интернет.
nano /etc/ppp/peers/megafon
Создаем файл с следующим содержанием:
# Используемое для подключения устройство
/dev/ttyUSB0
# chat-скрипт
# В параметре "-T" передаётся имя точки доступа
# Для получения статического ip используем значение FixedIP.nw, для динамике обычно пишется internet.
connect '/usr/sbin/chat -v -f /etc/chatscripts/gprs -T FixedIP.nw'
# Надо ли менять маршрут по умолчанию
# Закомментируйте если не надо
defaultroute
# Использовать ли DNS-сервера провайдера
# Закомментируйте если не надо
usepeerdns
# Номер ppp-интерфейса (в данном случае будет ppp100)
unit 100
# Подключаться в случае обрыва
persist
# Перепосылать пакеты авторизации каждые 60 секунд
# Позволяет избежать обрыва соединения при отсутствии трафика
chap-interval 60
# Идентификатор соединения, используемый для поиска паролей в соответствующих файлах,
# А так же передаваемый ip-up и ip-down-скриптам
ipparam megafon
# Имя пользователя (пароль описывается в файле "/etc/ppp/chap-secrets") у Мегафона не требуется аутентификация, поэтому используем значение noauth.
#user "megafon"
noauth
# Отключаем любое сжатие
nopcomp
novjccomp
nobsdcomp
nodeflate
noaccomp
# Правильная обработка обрывов соединения
lcp-echo-interval 2
lcp-echo-failure 3
# IP адрес мы будем получать от провайдера, а не назначать сами
noipdefault
Затем настроим интерфейсы... Приводим файл /etc/network/interfaces примерно к такому виду:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.27.1
netmask 255.255.255.128
auto megafon
iface megafon inet ppp
provider megafon
Теперь можно перезагрузиться, после рестарта должен появиться Интернет.
3. Теперь разрешим форвардинг между интерфейсами.
В файле /etc/sysctl.conf расскомментируем строку
net.ipv4.ip_forward=1
4. Настроим файервол и NAT.
Добавим нужные правила фаейрвола:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A POSTROUTING -o ppp100 -j SNAT --to-source XX.XX.XX.XX (тут должен быть внешний ip-адрес)
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -i ppp100 -p tcp -m tcp -m multiport --dports 22 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -p icmp -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp100 -j ACCEPT
iptables -A FORWARD -s 192.168.27.0/25 -i eth0 -j ACCEPT
iptables -A FORWARD -i ppp12 -o eth0 -j ACCEPT
Теперь добавим эти правила в автозагрузку:
echo "#! /sbin/iptables-restore" > /etc/network/if-up.d/iptables-rules
iptables-save >> /etc/network/if-up.d/iptables-rules
chmod +x /etc/network/if-up.d/iptables-rules
5. Установим и настроим dhcp-сервер.
apt-get install dnsmasq
Откроем файл /etc/dnsmasq.conf и подправим 2-3 строки под наши нужды:
interface=eth0
Интерфейс с которого раздаются адреса.
dhcp-range=192.168.27.40,192.168.27.125,12h
Область выдачи.
dhcp-option=option:dns-server,192.168.0.4,8.8.8.8
Назначаемые dns-серверы. Первый для VPN, второй при отсутствующем VPN.
Теперь можно перезагрузиться, а затем подключить по сети к серверу какой-нибудь ПК, и проверить назначение IP, а так же работу Интернет.
6. Теперь подключимся к VPN, и создадим скрипт мониторинга и управления соединениями.
Установим pptp-client
apt-get install pptp-linux
Создадим и отредактируем файл /etc/ppp/peers/vpn следующим образом:
pty "pptp XX.XX.XX.XX --nobuffer --nolaunchpppd --loglevel 0" #тип и адрес сервера
name DOMAIN\\user
remotename VPN
require-mppe-128 #включаем поддержку MPPE
require-mschap-v2
defaultroute
replacedefaultroute
ms-dns 192.168.21.145
unit 12 #номер ppp интерфейса
persist #переподключаться при обрыве
maxfail 10 #количество попыток переподключения
holdoff 10 #интервал между подключениями
file /etc/ppp/options.pptp
ipparam $TUNNEL
в файле /etc/ppp/chap-secrets пишем учетные данные для нашего vpn соединения:
"DOMAIN\\user" VPN "Pa$$W0rd"
Пробуем продключиться
pon vpn nodetach
Теперь создадим файл-скрипт /home/user/recconnect.sh для мониторинга и подключений соединений.
#!/bin/bash
if ! /bin/ping 8.8.8.8 -c 10 -q -w 30 &>/dev/null
then
/sbin/ifdown megafon
/bin/sleep 2
kill $(ps aux | grep '/usr/sbin/pppd' | awk '{print $2}')
/bin/sleep 2
/sbin/ifup megafon &
/bin/sleep 45
fi
if ! /sbin/ifconfig | grep ppp12
then
/usr/bin/poff vpn
/bin/sleep 5
/usr/bin/pon vpn
/bin/sleep 45
fi
if ! ping -I ppp12 192.168.28.13 -c 10 -q -w 30 &>/dev/null # пингуем другую точку тоннеля
then
/usr/bin/poff vpn
/bin/sleep 5
/usr/bin/pon vpn
/bin/sleep 45
fi
if ! route -n | grep 192.168.28.13 | grep 192.168.0.0
then
route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.28.13 ppp12 # маршрут в сеть предприятия
/bin/sleep 5
fi
exit 0
Сделаем скрипт исполняемым:
chmod +x /home/user/recconnect.sh
и добавим выполнение скрипта по крону
crontab -e
*/03 * * * * sudo /home/user/recconnect.sh
Теперь все должно работать автоматом.
При работающем vpn-канале роутер обеспечивает маршрутизацию через сеть головного офиса, при отсутствующем через Интернет.
Софт-роутер построен на базе Ubuntu-server 16.04.
1.После инсталляции сервера вставим в usb-порт модем, убедимся, что модем определился в системе.
lsusb
Вывод будем примерно таким:
Bus 002 Device 002: ID 13d3:5711 IMC Networks
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 12d1:1506 Huawei Technologies Co., Ltd. Modem/Networkcard
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Видно, что модем присутствует.
2. Настроим ppp-интерфейс и попробуем подключиться к Интернет.
nano /etc/ppp/peers/megafon
Создаем файл с следующим содержанием:
# Используемое для подключения устройство
/dev/ttyUSB0
# chat-скрипт
# В параметре "-T" передаётся имя точки доступа
# Для получения статического ip используем значение FixedIP.nw, для динамике обычно пишется internet.
connect '/usr/sbin/chat -v -f /etc/chatscripts/gprs -T FixedIP.nw'
# Надо ли менять маршрут по умолчанию
# Закомментируйте если не надо
defaultroute
# Использовать ли DNS-сервера провайдера
# Закомментируйте если не надо
usepeerdns
# Номер ppp-интерфейса (в данном случае будет ppp100)
unit 100
# Подключаться в случае обрыва
persist
# Перепосылать пакеты авторизации каждые 60 секунд
# Позволяет избежать обрыва соединения при отсутствии трафика
chap-interval 60
# Идентификатор соединения, используемый для поиска паролей в соответствующих файлах,
# А так же передаваемый ip-up и ip-down-скриптам
ipparam megafon
# Имя пользователя (пароль описывается в файле "/etc/ppp/chap-secrets") у Мегафона не требуется аутентификация, поэтому используем значение noauth.
#user "megafon"
noauth
# Отключаем любое сжатие
nopcomp
novjccomp
nobsdcomp
nodeflate
noaccomp
# Правильная обработка обрывов соединения
lcp-echo-interval 2
lcp-echo-failure 3
# IP адрес мы будем получать от провайдера, а не назначать сами
noipdefault
Затем настроим интерфейсы... Приводим файл /etc/network/interfaces примерно к такому виду:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.27.1
netmask 255.255.255.128
auto megafon
iface megafon inet ppp
provider megafon
Теперь можно перезагрузиться, после рестарта должен появиться Интернет.
3. Теперь разрешим форвардинг между интерфейсами.
В файле /etc/sysctl.conf расскомментируем строку
net.ipv4.ip_forward=1
4. Настроим файервол и NAT.
Добавим нужные правила фаейрвола:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A POSTROUTING -o ppp100 -j SNAT --to-source XX.XX.XX.XX (тут должен быть внешний ip-адрес)
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -i ppp100 -p tcp -m tcp -m multiport --dports 22 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -p icmp -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp100 -j ACCEPT
iptables -A FORWARD -s 192.168.27.0/25 -i eth0 -j ACCEPT
iptables -A FORWARD -i ppp12 -o eth0 -j ACCEPT
Теперь добавим эти правила в автозагрузку:
echo "#! /sbin/iptables-restore" > /etc/network/if-up.d/iptables-rules
iptables-save >> /etc/network/if-up.d/iptables-rules
chmod +x /etc/network/if-up.d/iptables-rules
5. Установим и настроим dhcp-сервер.
apt-get install dnsmasq
Откроем файл /etc/dnsmasq.conf и подправим 2-3 строки под наши нужды:
interface=eth0
Интерфейс с которого раздаются адреса.
dhcp-range=192.168.27.40,192.168.27.125,12h
Область выдачи.
dhcp-option=option:dns-server,192.168.0.4,8.8.8.8
Назначаемые dns-серверы. Первый для VPN, второй при отсутствующем VPN.
Теперь можно перезагрузиться, а затем подключить по сети к серверу какой-нибудь ПК, и проверить назначение IP, а так же работу Интернет.
6. Теперь подключимся к VPN, и создадим скрипт мониторинга и управления соединениями.
Установим pptp-client
apt-get install pptp-linux
Создадим и отредактируем файл /etc/ppp/peers/vpn следующим образом:
pty "pptp XX.XX.XX.XX --nobuffer --nolaunchpppd --loglevel 0" #тип и адрес сервера
name DOMAIN\\user
remotename VPN
require-mppe-128 #включаем поддержку MPPE
require-mschap-v2
defaultroute
replacedefaultroute
ms-dns 192.168.21.145
unit 12 #номер ppp интерфейса
persist #переподключаться при обрыве
maxfail 10 #количество попыток переподключения
holdoff 10 #интервал между подключениями
file /etc/ppp/options.pptp
ipparam $TUNNEL
в файле /etc/ppp/chap-secrets пишем учетные данные для нашего vpn соединения:
"DOMAIN\\user" VPN "Pa$$W0rd"
Пробуем продключиться
pon vpn nodetach
Теперь создадим файл-скрипт /home/user/recconnect.sh для мониторинга и подключений соединений.
#!/bin/bash
if ! /bin/ping 8.8.8.8 -c 10 -q -w 30 &>/dev/null
then
/sbin/ifdown megafon
/bin/sleep 2
kill $(ps aux | grep '/usr/sbin/pppd' | awk '{print $2}')
/bin/sleep 2
/sbin/ifup megafon &
/bin/sleep 45
fi
if ! /sbin/ifconfig | grep ppp12
then
/usr/bin/poff vpn
/bin/sleep 5
/usr/bin/pon vpn
/bin/sleep 45
fi
if ! ping -I ppp12 192.168.28.13 -c 10 -q -w 30 &>/dev/null # пингуем другую точку тоннеля
then
/usr/bin/poff vpn
/bin/sleep 5
/usr/bin/pon vpn
/bin/sleep 45
fi
if ! route -n | grep 192.168.28.13 | grep 192.168.0.0
then
route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.28.13 ppp12 # маршрут в сеть предприятия
/bin/sleep 5
fi
exit 0
Сделаем скрипт исполняемым:
chmod +x /home/user/recconnect.sh
и добавим выполнение скрипта по крону
crontab -e
*/03 * * * * sudo /home/user/recconnect.sh
Теперь все должно работать автоматом.
вторник, 31 января 2017 г.
Скрипт мониторинга и запуска сетевых интерфейсов.
#!/bin/bash
export PATH=/usr/bin:/sbin:/bin
if ! ping 8.8.8.8 -c 10 -q -w 30 &>/dev/null
then
ifdown ppp0
sleep 2
killall -9 pppd
sleep 2
ifup ppp0 &
sleep 45
fi
if ! ifconfig | grep ppp12
then
poff vpn
sleep 5
pon vpn
sleep 45
fi
if ! ping -I ppp12 192.168.28.7 -c 10 -q -w 30 &>/dev/null
then
poff vpn
sleep 5
pon vpn
sleep 45
fi
exit 0
Сначала мониторим есть ли соединение с Интернет, который подключен как ppp (gprs/3g,4g, pppoe и т.п.), если нет - выключаем интерфейс, и заново его поднимаем.
Потом мониторим есть ли интефейс pptp vpn, если нет отключаем vpn, затем опять затем опять запускаем соединение.
Затем мониторим пингуется ли точка на другой стороне тоннеля, если нет - тоже самое, что выше.
export PATH=/usr/bin:/sbin:/bin
if ! ping 8.8.8.8 -c 10 -q -w 30 &>/dev/null
then
ifdown ppp0
sleep 2
killall -9 pppd
sleep 2
ifup ppp0 &
sleep 45
fi
if ! ifconfig | grep ppp12
then
poff vpn
sleep 5
pon vpn
sleep 45
fi
if ! ping -I ppp12 192.168.28.7 -c 10 -q -w 30 &>/dev/null
then
poff vpn
sleep 5
pon vpn
sleep 45
fi
exit 0
Сначала мониторим есть ли соединение с Интернет, который подключен как ppp (gprs/3g,4g, pppoe и т.п.), если нет - выключаем интерфейс, и заново его поднимаем.
Потом мониторим есть ли интефейс pptp vpn, если нет отключаем vpn, затем опять затем опять запускаем соединение.
Затем мониторим пингуется ли точка на другой стороне тоннеля, если нет - тоже самое, что выше.
среда, 26 октября 2016 г.
Определить к какому порту коммутатора подключен хост с определенным IP-адресом.
Допустим коммутатор Cisco 2960, ip-адрес хоста 192.168.11.1
На коммутаторе к которому подключен хост выполним команду:
sw-main#sh ip arp | i 192.168.11.1
Internet 192.168.11.1 0 0033.5577.9901 ARPA Vlan11
Если команда не дала никакого вывода, но мы уверены, что хост подключен именно к этому коммутатору, пустим пинг до хоста. Таблица arp обновится, и можно будет увидеть, что хочется.
Затем, когда уже известен mac, определим к какому порту коммутатора подключен хост:
sw-main# sh mac address-table | i 0033.5577.9901
11 0033.5577.9901 STATIC Gi1/0/19
Хост подключен к 19-му порту.
понедельник, 3 октября 2016 г.
Перенаправление (forward) портов iptables
Допустим, есть сервер в локальной сети (или виртуалка), на которой работает ssh-server на порту 22, как обычно и бывает.
И допустим, нужно предоставить к этому серверу доступ из Интернет, но сервер за NAT, а шлюзом является сервер c Linux и iptables. Короче, нужно два правила:
iptables -t nat -A PREROUTING -i eth0 -p tcp -d x.x.x.x --dport 4444 -j DNAT --to-destination 192.168.1.3:22
iptables -A FORWARD -i eth0 -o eth1 -d 192.168.1.3 -p tcp --dport 22 -j ACCEPT
в которых - x.x.x.x внешний адрес шлюза, 192.168.1.3 адрес сервера, 4444 порт доступный из интернет, 22 порт ssh 192.168.1.3, eth0 смотрит в Интернет, eth1 смотрит в локалку.
И допустим, нужно предоставить к этому серверу доступ из Интернет, но сервер за NAT, а шлюзом является сервер c Linux и iptables. Короче, нужно два правила:
iptables -t nat -A PREROUTING -i eth0 -p tcp -d x.x.x.x --dport 4444 -j DNAT --to-destination 192.168.1.3:22
iptables -A FORWARD -i eth0 -o eth1 -d 192.168.1.3 -p tcp --dport 22 -j ACCEPT
в которых - x.x.x.x внешний адрес шлюза, 192.168.1.3 адрес сервера, 4444 порт доступный из интернет, 22 порт ssh 192.168.1.3, eth0 смотрит в Интернет, eth1 смотрит в локалку.
среда, 28 сентября 2016 г.
Rsync через ssh
У нас есть два сервера:
1) 1.1.1.1 - основной сервер (файлы, почта, что угодно иное), пользователь user1.
2) 2.2.2.2 - сервер, на котором хранятся резервные копии, пользователь user2.
Считаем, что раньше вы не настраивали доступ по ssh к серверам по ключам, а используете пароли. Заодно от паролей избавимся.
Идея: находясь на сервере 2.2.2.2, мы запускаем процесс копирования данных с основного сервера 1.1.1.1 (к себе, на 2.2.2.2).
Проверяем коннект ssh с паролем
Если мы с сервера 2.2.2.2 не сможем с паролем соединиться по ssh к 1.1.1.1, то дальше можно и не продолжать.
Готовим почву
На серверах установим rsync:
yum install xinetd rsync
Редактируем конфиг xinetd для rsync:
nano /etc/xinetd.d/rsync
...
disable = no
# flags = IPv6
...
Создадим отдельного пользователя rsync без домашней директории и /sbin/nologin. Да, я люблю вместо общего nobody для важных задач создавать отдельных пользователей. Никогда не знаешь наперед, когда придется анализировать, что и где глючит.
Редактируем (создаем) минимальный конфиг rsync на сервере 1.1.1.1:
nano /etc/rsyncd.conf
uid = rsync
gid = rsync
use chroot = true
max connections = 5
pid file = /var/run/rsyncd.pid
motd file = /etc/rsync.motd
# Logging
log file = /var/log/rsyncd.log
transfer logging = true
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
service xinetd restart
Проверим:
netstat -lnpt | grep 873
tcp 0 0 :::873 :::* LISTEN 16269/xinetd
Ок, xinetd слушает порт rsync и при запросе запустит его.
На сервере 2.2.2.2 (с которого будем коннектится) сгенерируем сертификат для доступа без пароля:
# ssh-keygen -f ~/.ssh/id_rsa -q -P "" -b 4096
где:
-q - silense
-f - имя файла ключа
-P "" - пустой пароль
-b 4096 - размер ключа, бит
Просмотрим публичный ключ, который надо будет скопировать на 1.1.1.1, куда будем впоследствии подсоединяться:
# cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLVDBIpdpfePg/a6h8au1HTKPPrg8wuTrjdh0QFVPpTI4KHctf6/
FGg1NOgM++hrDlbrDVStKn/b3Mu65//tuvY5SG9sR4vrINCSQF++a+YRTGU6Sn4ltKpyj3usHERvBndtFXoDxsYKR
CtPfgm1BGTBpoSl2A7lrwnmVSg+u11FOa1xSZ393aaBFDSeX8GlJf1SojWYIAbE25Xe3z5L232vZ5acC2PJkvKctz
vUttJCP91gbNe5FSwDolE44diYbNYqEtvq2Jt8x45YzgFSVKf6ffnPwnUDwhtvc2f317TKx9l2Eq4aWqXTOMiPFA5
ZRM/CF0IJCqeXG6s+qVfRjB root@cloudads
На сервере 1.1.1.1 (откуда будем копировать файлы).
Скопируем этот ключ на сервер 1.1.1.1, на который будем логиниться, в директорию пользователя user1, под которым будем логинитсья, в файл ~/.ssh/authorized_keys file.
Если директории .ssh на 1.1.1.1 не существует, создадим ее:
mkdir ~/.ssh
chmod 0700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 0644 ~/.ssh/authorized_keys
chown -R user1:user1 /home/user1
В файл ~/.ssh/authorized_keys копируем содержимое публичного ключа, созданного на сервере 2.2.2.2 (файл id_rsa.pub) и перезапускаем sshd:
# service sshd restart
Все, мы готовы проверить соединение с 2.2.2.2 на 1.1.1.1 по ssh:
ssh -i /home/user2/.ssh/id_rsa -p 22 user1@1.1.1.1
Если соединение прошло, можно двигаться дальше. Если нет - надо обязательно понять, где проблема (firewall, ошибка copy/paste ключа, забыли restart sshd, что-то еще).
Запускаем rsync через ssh
Мы будем копировать файлы /data/* с сервера 1.1.1.1 на сервер 2.2.2.2 в папку /backup/.
Формат простой: rsync [опции] [откуда] [куда]
rsync -avz -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress 1.1.1.1:/data/data.zip /backup/
или так:
rsync -avz -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress user1@1.1.1.1:/data/* /backup/
или даже так:
rsync -avz -e "ssh -p 22" --progress user1@1.1.1.1:/data/* /backup/
-e "ssh ..." - указываем, что хотим все передавать по ssh;
-p 22 - указываем порт, на котором работает ssh на сервере 1.1.1.1;
-a, --archive – архивный режим, включает рекурсивное копирование и сохранение прав и владельца;
-v - расширенный вывод;
-z - использовать компрессию данных;
user1 - локальный пользователь сервера 1.1.1.1, настроенный на логин по ssh по ключу.
Естественно, пользователь user1 должен иметь права доступа в /data/.
Вот и все. После копирования проверим, создался ли файл на сервере 2.2.2.2:
ls -al /backup/
Взято тут.
Подписаться на:
Сообщения (Atom)