Содержание
Короткие команды alias
Команды alias позволяют пользователю с помощью одного слова или даже символа запускать любую команду или группу команд, в том числе с опциями, параметрами и файлами.
alias
— просмотр доступных коротких команд.
findip <IP> — поиск по IP-адресу
Соответствует командам:
if [[ $# -ne 1 ]]; then echo "Use: findip 'IP_ADDRESS'" else PrintDate echo "Authorizaion status is: " fdpi_cli subs auth show ${1} echo "L2 properties are: " fdpi_cli subs prop show ${1} echo "DHCP session info: " fdpi_cli dhcp show ip=${1} echo "Accounting session is: " fdpi_cli pcrf acct show ip=${1} fi
findmac <MAC> — поиск по MAC-адресу
Сначала находится активный (non expired) IP-адрес для этого MAC адреса, затем аналогичные команды для findip
.
Соответствует командам:
if [[ $# -ne 1 ]]; then echo "Use: findmac 'mac address'" else PrintDate declare MAC="${1}" declare ROWS=$(fdpi_cli subs prop show mac="${MAC}" --json --strict) if [[ $(echo "${ROWS}" | jq -r '.[].records|length') != 0 ]]; then declare SUB_IP=$(echo "${ROWS}" | jq -r '.[].records[].address.n_ip') echo "${SUB_IP}" echo "Autharizaion status is: " fdpi_cli subs auth show "${SUB_IP}" echo "L2 properties are: " fdpi_cli subs prop show "${SUB_IP}" echo "DHCP session info: " fdpi_cli dhcp show ip="${SUB_IP}" echo "Accounting session is: " fdpi_cli pcrf acct show ip="${SUB_IP}" return 0 else echo "${MAC} is not exist" fi unset SUB_IP unset ROWS unset MAC fi
findall — вывод всех абонентов
Соответствует командам:
PrintDate declare SUBS_ACTIVE=$(fdpi_cli subs prop show active --json --strict) if [[ $( echo "${SUBS_ACTIVE}" | jq -ajr .[].records) != 'null' ]]; then echo -e "$(echo "${SUBS_ACTIVE}" | jq -ajr '.[].records[]|"\n\(.address.n_ip)|\(.props.vrf)|\(.props.mac)|\(.props.l2subs_id)|\(.props.auth_status.ts_timestamp .absolute_time)\n"')" | grep -v -e '^"' |column -t -N IP,VRF,MAC,L2_SUBS_ID,SESSION_STARTED -s '|' else echo "No one connected subscriber." fi
findsub <IP> — просмотр правил ограничения скорости
Соответствует командам:
PrintDate echo "IP Address: ${1}" echo "Subscriber's policing rules: " echo -e "$(fdpi_ctrl list --policing --ip "${1}" --outformat=json2 | jq -ajr '.lpolicings[].policing|"\n'outbound'|\(.outbound.classes[0].class)|\(.outbound.classes[0].ceil_value) \(.ou tbound.classes[0].ceil_unit)|\n'outbound'|\(.outbound.classes[1].class)|\(.outbound.classes[1].ceil_value) \(.outbound.classes[1].ceil_unit)|\n'outbound'|\(.outbound.classes[2].class)|\(.ou tbound.classes[2].ceil_value) \(.outbound.classes[2].ceil_unit)|\n'outbound'|\(.outbound.classes[3].class)|\(.outbound.classes[3].ceil_value) \(.outbound.classes[3].ceil_unit)|\n'outbound'| \(.outbound.classes[4].class)|\(.outbound.classes[4].ceil_value) \(.outbound.classes[4].ceil_unit)|\n'outbound'|\(.outbound.classes[5].class)|\(.outbound.classes[5].ceil_value) \(.outbound. classes[5].ceil_unit)|\n'outbound'|\(.outbound.classes[6].class)|\(.outbound.classes[6].ceil_value) \(.outbound.classes[6].ceil_unit)|\n'outbound'|\(.outbound.classes[7].class)|\(.outbound. classes[7].ceil_value) \(.outbound.classes[7].ceil_unit)|\n'inbound'|\(.inbound.classes[0].class)|\(.inbound.classes[0].ceil_value) \(.inbound.classes[0].ceil_unit)|\n'inbound'|\(.inbound.c lasses[1].class)|\(.inbound.classes[1].ceil_value) \(.inbound.classes[1].ceil_unit)|\n'inbound'|\(.inbound.classes[2].class)|\(.inbound.classes[2].ceil_value) \(.inbound.classes[2].ceil_uni t)|\n'inbound'|\(.inbound.classes[3].class)|\(.inbound.classes[3].ceil_value) \(.inbound.classes[3].ceil_unit)|\n'inbound'|\(.inbound.classes[4].class)|\(.inbound.classes[4].ceil_value) \(. inbound.classes[4].ceil_unit)|\n'inbound'|\(.inbound.classes[5].class)|\(.inbound.classes[5].ceil_value) \(.inbound.classes[5].ceil_unit)|\n'inbound'|\(.inbound.classes[6].class)|\(.inbound .classes[6].ceil_value) \(.inbound.classes[6].ceil_unit)|\n'inbound'|\(.inbound.classes[7].class)|\(.inbound.classes[7].ceil_value) \(.inbound.classes[7].ceil_unit)\n"')"|grep -v -e '^"'|co lumn -t -N DIRECTION,CLASS,RATE_LIMIT -s '|' echo 'IMPORTANT! "8 bps" is equivalent to "0 bps"'
Пример Policing для конкретного абонента:
Current time: 2024-08-21T13:54:15.917Z IP Address: 89.179.251.130 Subscriber's policing rules: DIRECTION CLASS RATE_LIMIT outbound 0 110 mbps outbound 1 110 mbps outbound 2 8 bps outbound 3 8 bps outbound 4 110 mbps outbound 5 110 mbps outbound 6 110 mbps outbound 7 110 mbps inbound 0 110 mbps inbound 1 110 mbps inbound 2 8 bps inbound 3 8 bps inbound 4 110 mbps inbound 5 110 mbps inbound 6 110 mbps inbound 7 110 mbps IMPORTANT! "8 bps" is equivalent to "0 bps"
На СКАТ BRAS от VAS Experts запрет на тот или иной абонентский трафик достигается отнесением его к определенному сервису (для IP, TCP, UDP используются разные), маппинга этого сервиса в определенный QoS Class, и выделением этому классу 8bit полосы пропускания. Подробнее о реализованных таким образом абонентских фильтрах — в HLD.
findfilter <IP> — просмотр правил услуги 16
Разрешенные TCP ресурсы и адрес для редиректа.
Соответствует командам:
PrintDate fdpi_ctrl list --service 16 --ip ${1}
dropip <IP> — удаление статуса авторизации, L2 свойств; сброс авторизации для DHCP сессии
Следующий DHCP запрос от абонента отправится на авторизацию); остановка Accounting сессии.
Соответствует набору команд:
PrintDate echo "DHCP session info: " fdpi_cli dhcp reauth ip=${1} echo "Dropping autharizaion status..." fdpi_cli subs auth clear ${1} echo "Dropping L2 properties..." fdpi_cli subs prop del ${1} echo "Accounting session is: " fdpi_cli pcrf acct stop ip=${1}
leasesdhcpstatus — просмотр статистики утилизации пулов в KEA и СКАТ (в СКАТ с разделением по VRF)
Соответствует командам:
KEA_CTRL_SOCKET='/var/kea4-ctrl/kea4-ctrl-socket' CMD_STATUS='{"command":"stat-lease4-get"}' CMD_CONFIG='{"command":"config-get"}' sendtodhcp(){ echo ${1} | socat - UNIX-CONNECT:${KEA_CTRL_SOCKET} } jsongetvalue(){ echo ${1} | jq -r .${2} } jsongetcount(){ echo ${1} | jq -r .${2} | jq 'length' } getstat(){ echo $(sendtodhcp ${CMD_STATUS}) } POOL_STATUS=$(jsongetvalue "$(sendtodhcp ${CMD_STATUS})" arguments.'"'result-set'"') KEA_CONFIG=$(jsongetvalue "$(sendtodhcp ${CMD_CONFIG})" arguments.Dhcp4) SUBS_NUMBER=$(jsongetvalue "${POOL_STATUS}" rows | jq 'length') for (( SUBS_PROP_INDEX=0; SUBS_PROP_INDEX < ${SUBS_NUMBER}; SUBS_PROP_INDEX++ )); do for (( j=0; j <= ${SUBS_NUMBER}; j++ )); do SUBNETS_NUMBER=$(jsongetcount "${KEA_CONFIG}" '"'shared-networks'"'[${SUBS_PROP_INDEX}].subnet4) if [[ ${SUBNETS_NUMBER} > 1 ]]; then for (( SUBNET_INDEX=0; SUBNET_INDEX < SUBS_NUMBER; SUBNET_INDEX++ )); do if [[ $(jsongetvalue "${KEA_CONFIG}" '"'shared-networks'"'[${SUBS_PROP_INDEX}].subnet4[${SUBNET_INDEX}].id) != 'null' ]]; then if [[ $(jsongetvalue "${KEA_CONFIG}" '"'shared-networks'"'[${SUBS_PROP_INDEX}].subnet4[${SUBNET_INDEX}].id) == $(jsongetvalue "${POOL_STATUS}" rows[${j}][0]) ]]; th en echo 'Pool name: "'$(jsongetvalue "${KEA_CONFIG}" '"'shared-networks'"'[${SUBS_PROP_INDEX}].name)'" Total addresses: '$(jsongetvalue "${POOL_STATUS}" rows[${j}] [1]) 'Percent usage:'$(echo "($(jsongetvalue "${POOL_STATUS}" rows[${j}][3])/$(jsongetvalue "${POOL_STATUS}" rows[${j}][1]))*100" | bc -l) fi fi done else if [[ $(jsongetvalue "${KEA_CONFIG}" '"'shared-networks'"'[${SUBS_PROP_INDEX}].subnet4[0].id) != 'null' ]]; then if [[ $(jsongetvalue "${KEA_CONFIG}" '"'shared-networks'"'[${SUBS_PROP_INDEX}].subnet4[0].id) == $(jsongetvalue "${POOL_STATUS}" rows[${j}][0]) ]]; then echo 'Pool name: "'$(jsongetvalue "${KEA_CONFIG}" '"'shared-networks'"'[${SUBS_PROP_INDEX}].name)'" Total addresses: ' $(jsongetvalue "${POOL_STATUS}" rows[${j}][1 ]) 'Percent usage:'$(echo "($(jsongetvalue "${POOL_STATUS}" rows[${j}][3])/$(jsongetvalue "${POOL_STATUS}" rows[${j}][1]))*100" | bc -l) fi fi fi done done fdpi_cli dhcp show stat vrf
subping <IPinet> <IPsubs> — Ping Internet зоны от “имени” абонента
Соответствует командам:
if [[ "$1" == "--help" ]] || [[ "$1" == "-h" ]] || [[ $# -eq 0 ]] || [[ $# -gt 2 ]] ; then echo "Usage:" echo "subping <IP_address_in_the_internet_side> <IP_address_of_the_subscriber>" else fdpi_cli ping inet ${1} from ${2} n=5 fi
findcgnatstatus <IP> — просмотр статуса CGNAT
Какой публичный адрес выделен, статистика использования TCP и UDP сессий.
Соответствует команде:
sudo fdpi_ctrl list status --service 11 --ip <ip>
Проверьте установленный лимит на количество абонентских сессий в созданных NAT профилях:
sudo fdpi_ctrl list all profile --service 11
Проверьте, не заполнен ли белый IP-адрес, который использует абонент, на 100%
sudo fdpi_ctrl list status --service 11 --profile.name CGNAT-INET | grep puwhb=100.00
где CGNAT-INET - имя 11 сервиса NAT
healthcheck <IP> — просмотр статуса системы
Соответствует команде:
echo ----PROCESS STATE----&&systemctl status fastdpi&&systemctl status fastpcrf&&echo ----LINK STATE----&&fdpi_cli dev link state show| grep -A 1 Device&& echo ----MGMT ROUTER STATE----&&birdc show status|tail -n +2&& birdc show protocols|tail -n +2&& echo ----MAIN ROUTER STATE----&&birdc show status|tail -n +2&& birdc show protocols|tail -n +2;echo ----AUTHORIZED SUBSCRIBERS----&&fdpi_cli subs auth show|tail -n 6&& echo ----DHCP SUBSCRIBERS----&&fdpi_cli dhcp show all|tail -n 1
bngrestart — перезапуск fastDPI, fastPCRF для сброса всех сессий и применения холодных параметров
Соответствует команде:
systemctl stop fastdpi && systemctl restart fastpcrf && systemctl start fastdpi
bngstop — остановка fastDPI, fastPCRF
Соответствует команде:
systemctl stop fastdpi && systemctl stop fastpcrf
bngstart — запуск fastDPI, fastPCRF
Соответствует команде:
systemctl start fastdpi && systemctl start fastpcrf
bngstatus — статус fastDPI, fastPCRF
Соответствует команде:
systemctl status fastdpi && systemctl status fastpcrf
bngfullrestart — перезапуск fastDPI, fastPCRF для сброса всех сессий и применения холодных параметров с очисткой UDR
declare -a TABLES_LIST=("policing" "profile_names" "profiles" "vchannel_policing" "vchannel_services") declare -a DB_BAK_DIR="/var/db/dpi/recovered" declare -a UDR_BAK="/tmp/data.mdb" declare -a UDR="/var/db/dpi/data.mdb" if [ ! -d "${DB_BAK_DIR}" ]; then mkdir -p "${DB_BAK_DIR}" else for TABLE in "${TABLES_LIST[@]}"; do if [ -f "${DB_BAK_DIR}"/dump."${TABLE}".load ]; then rm -f "${DB_BAK_DIR}"/dump."${TABLE}".load fi done fi /bin/cp -f "${UDR}" "${UDR_BAK}" for TABLE in "${TABLES_LIST[@]}"; do mdb_dump -f "${DB_BAK_DIR}"/dump."${TABLE}".load -s "${TABLE}" /var/db/dpi declare -a RETVAL=$? if [ "${RETVAL}" -ne 0 ]; then echo "ERROR: Can not make dump of table ${TBALE} from UDR to ${DB_BAK_DIR}/dump.${TABLE}.load" return 1 fi done systemctl stop fastdpi systemctl stop fastpcrf /bin/rm -f /var/db/dpi/lock.mdb /bin/rm -f "${UDR}" for TABLE in "${TABLES_LIST[@]}"; do mdb_load -f "${DB_BAK_DIR}"/dump."${TABLE}".load /var/db/dpi declare -a RETVAL=$? if [ "${RETVAL}" -ne 0 ]; then echo "ERROR: Can not load table ${DB_BAK_DIR}/dump.${TABLE}.load to UDR" /bin/rm -f /var/db/dpi/lock.mdb /bin/cp -f "${UDR_BAK}" "${UDR}" systemctl start fastpcrf systemctl start fastdpi return 1 fi done systemctl start fastpcrf systemctl start fastdpi