Настройка тайм-аута SSH сессий

Чтобы настроить тайм-аут SSH сессий, посмотрим где находится файл конфигурации SSH сервера:

sudo find / -name sshd_config

Откроем его в любом текстовом редакторе, например nano:

sudo nano /etc/ssh/sshd_config

И укажем интервал ожидания в секундах, например 300 (это 5 минут), через который sshd запросит ответ от клиента, по умолчанию значение 0, то есть запросы не отправляются клиенту.

ClientAliveInterval 300

Чтобы неактивные соединения завершались, укажем ClientAliveCountMax, который определяет количество ClientAliveInterval без ответа, через которые соединение будет завершено (значение по умолчанию 3):

ClientAliveCountMax 36

То есть, 300 секунд * 36 = 10800 секунд = 180 минут = 3 часа.

Перезапустим сервер ssh чтобы применить изменения:

sudo /etc/init.d/ssh restart

Метод указанный выше завершает неактивные соединения и не будет завершать активные простаивающие соединения, по этому можно также указать время тайм-аута сессий в файле /etc/bash.bashrc.

Откроем его:

nano /etc/bash.bashrc

И добавим в самый конец:

TMOUT=10800
readonly TMOUT
export TMOUT

В этом случае, через указанное время, будут завершаться простаивающие SSH и локальные сессии.

Можно посмотреть количество активных сессий в их время простоя (IDLE):

w

Смотрите также мои статьи:
Как отсоединить SSH пользователя
Установка и настройка SSH

Причина сообщений «HTB: quantum of class 10001 is big. Consider r2q change»

Однажды на сервере доступа Ubuntu Server 16.04 и Accel-ppp заметил в файле /var/log/kern.log следующие сообщения:

kernel: [365970.550498] HTB: quantum of class 10001 is big. Consider r2q change.
kernel: [365970.550547] HTB: quantum of class 10A49 is big. Consider r2q change.
kernel: [365979.545580] HTB: quantum of class 10001 is big. Consider r2q change.
kernel: [365979.545621] HTB: quantum of class 10BD6 is big. Consider r2q change.
kernel: [365995.601973] HTB: quantum of class 10001 is big. Consider r2q change.
kernel: [365995.602031] HTB: quantum of class 11705 is big. Consider r2q change.

Сначала попробовал отследить какие в этот момент поднимаются интерфейсы:

tail -f /var/log/kern.log | grep "quantum of class 10001 is big"
tail -f /var/log/accel-ppp/accel-ppp.log | grep "create interface"

Но как оказалось, в конфигурации /etc/accel-ppp.conf, в секции шейпера, не был указан quantum, а если его не указать, то он высчитывается.
По этому я открыл файл конфигурации Accel-ppp:

sudo nano /etc/accel-ppp.conf

И указал его:

[shaper]
quantum=1500
#moderate-quantum=1

Также изменил up-limiter с «htb» на «police» для лучше производительности, а также чтоб правильно резалась скорость при большом количестве сессий (при 3000+ ipoe сессиях с htb начались проблемы, скорость отправки падала до 1 Мб/сек):

#up-limiter=htb
up-limiter=police

Чтобы применить изменение для новых сессий не обрывая активные, заставим Accel-ppp перечитать файл конфигурации:

telnet 127.0.0.1 2000
reload

Или перезагрузим Accel-ppp, но при этом оборвутся все сессии:

sudo /etc/init.d/accel-ppp restart

После этого ошибка исчезла.

Смотрите также мою статью — Сборка и установка accel-ppp

Почему Contact Form 7 не работает на iOS

Недавно на WordPress сайте заметил проблему отправки сообщений через Contact Form 7 из устройств с операционной системой iOS.
Если использовалась Google reCAPTCHA, то при нажатии кнопки Отправить, страница очень долго обновлялась и reCAPTCHA сообщала ошибку ожидания, если отключить reCAPTCHA, то сообщение отправлялось спустя 1-2 минуты.

Как оказалось, iOS почему-то начал блокировать AJAX, который использовался по умолчанию при обновлении страницы.

По этому чтобы решить проблему, я открыл файл конфигурации wp-config.php и примерно перед строкой:

define('WP_DEBUG', false);

Добавил строку:

define ('WPCF7_LOAD_JS', false);

Эта строка запрещает Contact Form 7 использовать Javascript.
Если указать эту переменную в конце файла, то она не будет работать.

После этого сообщения на iOS начали отправляться сразу.

Как отсоединить SSH пользователя

Допустим через SSH подключено несколько пользователей.

Сначала посмотрим список онлайн пользователей:

w

Допустим отобразилось следующая информация (где test — это логин пользователя):

USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
test     tty1                      11:20    1:07   0.03s  0.03s -bash
test     pts/0    192.168.1.5      11:21   13.00s  0.02s  0.02s -bash
test     pts/1    192.168.1.3      11:21    0.00s  0.02s  0.00s w

tty1 — это клиент вошедший локально, то есть находится возле компьютера.
pts/1 — судя например по IP и WHAT, допустим что это мы, соответственно pts/0 это клиент которого мы хотим отсоединить.

Смотрим список процессов и их PID:

ps faux |grep sshd

У меня отобразилось:

root       946  0.0  0.5  65508  5368 ?        Ss   12:00   0:00 /usr/sbin/sshd -D
root      1147  0.0  0.6  92828  6920 ?        Ss   12:01   0:00  \_ sshd: test [priv]
test      1178  0.0  0.3  92828  3384 ?        S    12:01   0:00  |   \_ sshd: test@pts/0
root      1192  0.0  0.6  92828  6592 ?        Ss   12:02   0:00  \_ sshd: test [priv]
test      1223  0.0  0.3  92828  3532 ?        S    12:02   0:00      \_ sshd: test@pts/1
test      1248  0.0  0.0  15468   956 pts/1    S+   12:25   0:00              \_ grep --color=auto sshd

Находим test@pts/0 и соответственно 1178 — это нужный PID.

Завершаем процесс указав его ID, после чего пользователь сразу отсоединится:

sudo kill -9 1178

Смотрите также мои статьи:
Установка и настройка SSH
Настройка тайм-аута SSH сессий

SQL запросы для ABillS

В этой статье я приведу примеры некоторых SQL запросов для базы биллинговой системы ABillS.

Первым делом подключимся к MySQL серверу и перейдем к базе abills (либо можно использовать phpmyadmin или внешний MySQL клиент):

mysql -u root
use abills;

Указать DNS и очистить во всех IP POOLs (Настройка>Сервер доступа>IP POOLs) можно sql такими запросами:

update ippools SET dns='8.8.8.8,8.8.4.4';
update ippools SET dns='';

Изменить логин пользователю можно так:

update users set id='new_login' where id='old_Login';

Посчитать количество пользователей:

SELECT count(*) FROM users;

Количество пользователей с указанным кредитом без даты обнуления кредита:

SELECT count(*) FROM users WHERE credit>0 AND credit_date="0000-00-00";

Количество пользователей с указанной скидкой без даты окончания скидки:

SELECT count(*) FROM users WHERE reduction>0 AND reduction_date="0000-00-00";

Количество пользователей с указанной датой активации для учетной записи:

SELECT count(*) FROM users where activate<>0000-00-00;

Количество сервисов для пользователей и количество сервисов в которых указана маска 255.255.255.255:

SELECT COUNT(*) FROM internet_main;
SELECT count(*) FROM internet_main where netmask=4294967295;

Количество сервисов в которых маска не равна 255.255.255.255:

SELECT count(*) FROM internet_main where netmask<>4294967295;

Количество сервисов в которых не указана дата активации:

SELECT count(*) FROM internet_main WHERE activate=0000-00-00;

Количество учетных записей в которых указана дата активации:

SELECT count(*) FROM users where activate<>0000-00-00;

Чтобы абонентов не отключало если на счету 0 и тариф оплачен:

SELECT * FROM tarif_plans where credit=0.00 LIMIT 200;
UPDATE tarif_plans SET credit='0.01' where credit=0.00;

Подсчет количества тарифов на которых не разрешено устанавливать скидку и включение скидки на всех тарифах:

SELECT count(*) FROM tarif_plans WHERE reduction_fee=0;
UPDATE tarif_plans SET reduction_fee=1 WHERE reduction_fee=0;

Тарифы в которых не выбрано действие при недостаточном депозите, и тарифы в котором выбрано «Приостановление»:

SELECT * FROM tarif_plans WHERE small_deposit_action=0;
SELECT count(*) FROM tarif_plans WHERE small_deposit_action='-1';

Тарифы в которых указан или не указан фильтр негативного депозита:

SELECT count(*) FROM tarif_plans WHERE neg_deposit_filter_id='NEG_DEPOSIT';
SELECT count(*) FROM tarif_plans WHERE neg_deposit_filter_id='';
SELECT * FROM tarif_plans WHERE neg_deposit_filter_id='';

Просмотр всего списка платежей и по конкретному типу (например 65 это Privat-Terminal):

SELECT * FROM payments LIMIT 750;
SELECT * FROM payments WHERE method=65;

Просмотр логинов и паролей в расшифрованном виде («secretkey» смотрим в config.pl):

SELECT id, DECODE(password, 'secretkey') FROM users;
SELECT id, DECODE(password, 'secretkey') FROM users WHERE uid=11;

Количество Zap сессий:

SELECT count(*) FROM internet_online WHERE status=2;

Количество гостевых сессий:

SELECT count(*) FROM internet_online where guest=1;

Количество всех сессий:

SELECT count(*) FROM internet_online WHERE (status=1 or status>=3);

Количество сессий без гостевых и Zap:

SELECT count(*) FROM internet_online WHERE (status=1 or status>=3) AND guest=0;

Выборка IP из онлайн сессий:

SELECT INET_NTOA(framed_ip_address) FROM internet_online WHERE (status=1 or status>=3) AND guest=0;

Смотрите также мой скрипт ipset — Скрипт добавления IP адресов из файла в ipset

Размер базы данных:

SELECT SUM( data_length + index_length ) AS 'size' FROM information_schema.TABLES WHERE table_schema = 'abills' LIMIT 1;

Количество сервисов для пользователей с определенным статусом (0 — Активно, 1 — Отключено, 2 — Не активизирован, 3 — Приостановление, 4 — Отключено: Неуплата, 5 — Cлишком маленький депозит):

SELECT count(*) FROM internet_main WHERE disable=0;

Изменение формата телефонов:

UPDATE users_pi SET phone=REPLACE(phone, '+38050', '050') WHERE phone like '+38050%';

Скрипт добавления IP адресов из файла в ipset

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

Первым делом создадим тестовый ipset:

ipset create test iphash

Создадим файл скрипта:

nano iplist.sh

Добавим в него содержимое:

mysql -u root -e "SELECT INET_NTOA(framed_ip_address) FROM abills.internet_online WHERE (status=1 or status>=3) AND guest=0;" -s -N > iplist.txt
iplist_data=$(cat iplist.txt)
for row_data in $iplist_data; do ipset -exist add test ${row_data}; done
rm iplist.txt

Выполняем скрипт и проверяем:

chmod +x iplist.sh
./iplist.sh
ipset list test | wc -l
ipset -L

Решение ошибки «Another app is currently holding the xtables lock»

Недавно заметил на одном сервере с биллинговой системой ABillS, что при массовом выполнении скрипта /etc/ppp/ip-up возникает ошибка:

Another app is currently holding the xtables lock. Perhaps you want to use the -w option?

Посмотрев код скрипта обнаружил, что среди iptables правил есть два, которые могут тормозить работу, а именно выполнялся поиск ipoe интерфейсов двумя командами:

IPTABLES="/sbin/iptables"
EXIST=`${IPTABLES} -t nat -L PREROUTING -v | grep "${IFNAME} ";  ${IPTABLES} -L -v | grep DROP | grep "${IFNAME} "`

Для поднятия 3000 сессий, уходило более 30 минут и часть правил могла вовсе не добавится или не удалится скриптом.
По умолчанию если используется ключ -L то iptables резолвит IP адреса и пытается отобразить вместо них DNS имена, что занимает много времени, и чтобы это не происходило, нужно добавить еще ключ -n, а также на всякий случай я добавил ключ -w 20, который заставит отложить выполнение новых правил до 20 секунд если iptables уже занят выполнение другой команды:

IPTABLES="/sbin/iptables"
IPTABLES_WAIT="-w 20"
EXIST=`${IPTABLES} $IPTABLES_WAIT -t nat -n -L PREROUTING -v | grep "${IFNAME} ";  ${IPTABLES} $IPTABLES_WAIT -n -L -v | grep DROP | grep "${IFNAME} "`

После этого скрипт с iptables правилами начал отрабатывать мгновенно.
Так как старые правила не все выполнились, я проверил это посчитав некоторые командой:

iptables -n -L -t nat -v | grep DNAT | wc -l

И сверил с количеством сессий, правил явно было меньше, поэтому пришлось очистить все правила и перезапустить сессии чтобы скрипт /etc/ppp/ip-up отработал правильно, на этот раз при 3000 сессиях он сделал свою работу менее чем за минуту.
Замечу что в скриптах /etc/ppp/ лучше не использовать правила iptables.

Как я закрывал счет в польском Pecao банке

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

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

Читать далее Как я закрывал счет в польском Pecao банке

Проблема с розовым искажением видео в Adobe Premiere

Однажды делал проект в Adobe Premiere и понадобилось вытащить видеокарту, после того как я ее вытащил, начал использовать интегрированную в процессор Intel HD Graphics 630 и у меня возникла проблема с изображением. Видео стало искаженным, чаще всего с розовыми и зелеными полосами.
На всякий случай экспортировал проект в видео файл и хотел продолжить его на другом компьютере, но видео файл оказался тоже с этими искажениями.
Пробовал переустановить Adobe Premiere, но это не помогло.

Читать далее Проблема с розовым искажением видео в Adobe Premiere

Сборка и установка accel-ppp

В этой статье я приведу пример сборки и установки accel-ppp в Ubuntu Server.

Требования accel-ppp такие:
Современный дистрибутив Linux
Ядро версии 2.6.25 или старше
cmake не младше версии 2.6
libcrypto-0.9.8 или старше (openssl-0.9.8)
libpcre
net-snmp-5.x (Для snmp)
liblua5.1 (для IPoE c DHCP option 82)

Читать далее Сборка и установка accel-ppp