Network Admin
12.5K subscribers
1.03K photos
13 videos
8 files
1.06K links
Обучающий канал по сетевому и системному администрированию.

Сотрудничество: @dad_admin
Биржа: https://telega.in/c/networkadm

РКН: https://bit.ly/4ioc61C
Download Telegram
Правильное Питание (ПП) коммутационного оборудования

Система резервного электроснабжения должна обеспечивать не просто бесперебойное, но правильное питание. ПП — как у зожников, только для электроприборов. Много есть неочевидных нюансов — и первые в мире ПП-ИБП, решающие все проблемы с плохим качеством электричества, делает Systeme Electric.

Тотальный онлайн-ЗОЖ — онлайн Защита от Отключений Железа. ПП-ИБП Systeme Electric с онлайн-топологией двойного преобразования обеспечат чистый синус, защитят от помех и скачков напряжения.

Повышенная БЖУ — Бесперебойность Жизненно-важных Устройств. Тянут нагрузку в 150% от номинальной. Система не рухнет в момент включения мощных потребителей (именно в это время возникают краткосрочные, но сильные перегрузки).

Настоящий суперфуд для оборудования — высочайший КПД 95%. Из-за этого ПП-ИБП Systeme Electric не перегреваются.

Самое полное ПП-меню — поддерживают все возможные интерфейсы и протоколы (EPO, SNMP, RS-485, RS-232, USB, RJ45/RJ11, EMBS). Не будет сложностей с подключением нового бесперебойника к существующему оборудованию.

Гарантия рекордная — 3 года — такую больше никто не дает.

Техподдержка 24/7 (в мессенджерах, днем и по телефону): после 6 — можно!

ПП-ИБП Systeme Electric — это не какой-то китайский электро-фастфуд. Это бывшее российское подразделение Schneider Electric, производителя легендарных APC. Технологии и лучшая команда инженеров те же самые — только вывеска новая (из-за евросанкций). Эти люди точно знают: на здоровье оборудования не экономят!

Первые в мире ПП-ИБП тут.
5🤔2
⚡️ Анонсирована еще более бюджетная версия MacBook Pro

N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣26🔥3😁3
Почему после изменения ACL пропадает доступ к части сети

Настроили новый ACL на интерфейсе или между сегментами, но часть сервисов перестала отвечать: одни IP доступны, другие нет, часть приложений зависает на таймаутах.

Чаще всего проблема не в самом ACL, а в порядке правил и скрытых “deny any” в конце. Также часто забывают про обратный трафик, из-за чего запрос проходит, а ответ блокируется.

Типовые причины: правило блокирует обратный трафик (return traffic) ACL применён не в том направлении (in/out) отсутствуют разрешения для established/related соединений правило выше по списку перекрывает нужный allow забытый implicit deny в конце списка ACL применён только на одном интерфейсе в цепочке
Команды для проверки:

show access-lists
show ip interface
show run interface Gi0/0


Проверка фактической обработки трафика:

debug ip packet
(аккуратно в проде)


Проверка пути:

traceroute <ip>
ping <ip>
 

Проверка логики ACL:

show access-lists <name>


Смотрим counters у правил - если растут deny, значит трафик реально режется.
Если проблема в направлении применения ACL:

interface Gi0/0
ip access-group <name> in


или

ip access-group <name> out
 

Если ломается из-за порядка правил — правило выше перекрывает нужный трафик, поэтому проверять нужно сверху вниз, а не по смыслу.

N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61🥱1
Почему после добавления VLAN пропадает связь

Добавили VLAN, всё выглядит корректно, но хосты внезапно перестают видеть шлюз или друг друга. При этом линк “зелёный”, порты up, явных ошибок нет.

Проверка обычно начинается с того, что VLAN вообще существует и не потерялся на уровне коммутатора.

show vlan brief


Иногда уже здесь видно, что VLAN есть, но он фактически никуда не “приклеен” - нет активных портов или он не проходит дальше по сети.

Дальше почти всегда упирается в транк: VLAN создан, но между устройствами он просто не доходит.

show interfaces trunk


Частая ситуация - VLAN не в allowed list, и трафик физически режется на выходе, хотя локально всё выглядит нормально.

Если с транком всё ок, проверяется интерфейс с точки зрения реальной конфигурации, а не ожиданий.

show running-config interface Gi0/1


Иногда проблема всплывает в несовпадении native VLAN или в том, что один конец линка настроен иначе, чем другой.

Если есть L3, дальше смотрят SVI - и тут часто оказывается, что интерфейс просто не поднялся.

show ip interface brief | include Vlan


И если там down/down, VLAN как будто есть, но в маршрутизации он не участвует вообще.

Проверка маршрутов иногда быстро подтверждает картину.

show ip route connected


N.A.
👍122💯1
Почему сервис “умирает” после включения retry

Retry включили на клиенте или gateway, и вместо стабилизации получили рост нагрузки и ощущение деградации, хотя инфраструктура не менялась.

curl -v <url>


Сразу видно, что один пользовательский запрос начинает превращаться в несколько попыток. Они накладываются друг на друга и создают лишний трафик там, где его не было.

Дальше это проявляется как рост latency и “тяжёлые” ответы, даже если сервис формально не падает.

mtr <ip>


Иногда кажется, что проблема в сети, но фактически это сам retry разгоняет нагрузку при любых задержках.

Если посмотреть на уровень пакетов:

tcpdump -i <iface>


видно, как одинаковые запросы уходят пачками вместо одного нормального потока.

На HTTP уровне это превращается в повторяющиеся обращения к одному endpoint без необходимости.

curl -I <url>


И в итоге система деградирует не из-за ошибок, а из-за того, что retry усиливает любую задержку в несколько раз.

N.A.
👍52
Почему “не видно проблему” в сети, пока не посмотришь состояние TCP очередей

Иногда сервис не падает, но начинает “вязнуть”: запросы идут, ответы есть, но задержки растут без очевидной причины.

В таких случаях полезно смотреть не соединения как факт, а их внутреннее состояние в ядре.

ss -tin state established


Здесь часто всплывают признаки деградации: растущий rtt, повторные передачи, перегруженные соединения, которые внешне выглядят как обычный HTTP-трафик.
Почему “всё открывается”, но часть запросов теряется

Бывает ситуация, когда сеть вроде бы живая, но часть пакетов просто не доходит. Это не видно на уровне приложения, пока не посмотреть статистику интерфейса.

ip -s link show <iface>


Потери, ошибки и dropped packets часто оказываются уже на уровне NIC или драйвера, а не где-то “в сети”.
Почему DNS “работает”, но поведение разное у клиентов

Иногда проблема вообще не в резолвинге как таковом, а в том, как ядро кеширует и повторно использует результаты.

getent ahosts <domain>


В отличие от dig, здесь видно реальное поведение резолвинга в контексте системы, а не абстрактного запроса.

N.A.
👍61
Cisco: Private VLAN для изоляции устройств

Private VLAN (PVLAN) — это механизм L2-изоляции внутри одного большого VLAN.

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

Как это работает:

PVLAN делит один VLAN на подтипы:
Primary VLAN — основной VLAN.
Isolated VLAN — хосты не могут общаться между собой, только с promiscuous-портом.
Promiscuous port — обычно uplink к маршрутизатору/фаерволу. Видит всех.

В итоге, 100 клиентов в одном VLAN → каждый полностью изолирован, без создания сотен отдельных VLAN.

⚙️ Конфигурация PVLAN на Cisco

1️⃣Создаём primary и isolated VLAN

vlan 100
private-vlan primary

vlan 101
private-vlan isolated


2️⃣Связываем их

vlan 100
private-vlan association 101


3️⃣Настраиваем promiscuous порт (uplink)

interface Gi1/0/1
switchport mode private-vlan promiscuous
switchport private-vlan mapping 100 101


4️⃣Настраиваем обычные клиентские порты (isolated)

interface range Gi1/0/10 - 20
switchport mode private-vlan host
switchport private-vlan host-association 100 101


И финально проверяем

show vlan private-vlan
show interfaces switchport


N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍92
Разное поведение DNS у разных клиентов

Сервис у части пользователей работает нормально, у части периодически “проваливается” или уходит в странные задержки. 


Снаружи всё выглядит одинаково, но поведение разъезжается по группам клиентов.

Первое, что обычно всплывает — не сами ответы DNS, а то, как они кешируются и переиспользуются в системе.

resolvectl query <domain>


Тут уже видно, что один и тот же домен может жить разными TTL-состояниями в зависимости от клиента и момента запроса, и это начинает разносить поведение по времени.

Дальше полезно посмотреть не “что резолвится”, а как именно система выбирает адреса и в каком порядке.

getent ahostsv4 <domain>


Иногда всплывает, что порядок IP разный между клиентами, и это уже влияет на то, какой backend они фактически выбирают, даже если DNS “одинаковый”.

Следующий слой - системные кеши и библиотечный резолвинг, который вообще не виден через обычные проверки.

strace -e trace=network -f curl -s <url>


Здесь часто видно, что разные клиенты делают разное количество попыток резолвинга или уходят в разные источники, хотя запрос формально один и тот же.

N.A.
👍9
Service работает через IP, не через DNS

Сервис открывается по IP нормально, но по доменному имени начинает вести себя странно: таймауты, разные ответы, иногда вообще “не тот” backend.

Часто это, когда клиент и DNS живут разной жизнью: IP уже поменялся, а часть систем продолжает ходить по старым записям.

resolvectl status


Здесь часто видно, что разные интерфейсы или сети используют разные резолверы, и ответы начинают расходиться по источникам.
Дальше полезно посмотреть, что реально возвращается не “в теории”, а в контексте системы.

getent hosts <domain>


Иногда всплывает, что домен резолвится в несколько IP, и выбор происходит неочевидно - часть клиентов стабильно попадает на один адрес, часть на другой.

ip route get <ip>


И уже здесь становится заметно, что IP-доступ стабильный, а доменный - нет, потому что DNS фактически раскидывает трафик по разным путям.

curl -v --resolve <domain>:443:<ip> https://<domain>


Когда вручную фиксируется IP, поведение становится стабильным - и это обычно указывает, что расхождение происходит именно на этапе резолвинга и кеширования, а не в самом сервисе.

N.A.
👍8
Неравномерное распределение трафика LB

Снаружи всё выглядит нормально: LB живой, backend’ы подняты, трафик есть, но один инстанс стабильно перегружен, а остальные почти пустые.

Распределение часто ломается не на уровне новых подключений, а на уровне уже установленных сессий и того, как они “прилипают” к backend’ам.

ss -s


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

Если разложить соединения глубже, становится заметно, что часть клиентов держит длинные сессии и фактически закрепляется за конкретным backend’ом.

ss -tn sport = :80


И именно эти долгоживущие соединения начинают создавать перекос: новые запросы уже не успевают “выровнять” баланс.

Иногда эффект усиливается просто из-за того, что клиенты создают разное количество соединений и неравномерно их переиспользуют.

curl -I <url>


При повторных запросах можно заметить, что ответы стабильно приходят с одних и тех же backend’ов, даже если ожидается равномерное распределение.

ipvsadm -Ln


На этом уровне уже видно реальную картину: LB не распределяет каждый запрос заново, а работает с уже закреплёнными потоками, из-за чего часть нод оказывается перегруженной просто статистически.

N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍42
5 команд, которые реально помогают ловить “невидимые” сетевые проблемы
1️⃣TCP-состояние и скрытые retransmit’ы
Когда сервис “живой”, но всё тормозит - обычные проверки ничего не показывают. Тут полезно смотреть, что происходит прямо в TCP-очередях.

ss -ti state all


Сразу видно RTT, retrans, cwnd - вещи, которые обычно не попадают ни в метрики, ни в логи.
2️⃣Реальное поведение маршрута ядра (а не “как должно быть”)
Иногда проблема не в сети, а в том, куда система на самом деле отправляет трафик.

ip route get <ip>


Показывает конкретный интерфейс, source IP и next-hop для одного пакета - часто всплывает неожиданный путь.

3️⃣Где именно ломается соединение (DNS / connect / TLS / HTTP)
Когда всё “медленно”, важно понять, на каком этапе зависает запрос.

curl -w "@-" -o /dev/null -s <url>


Показывает breakdown по времени: DNS, connect, TLS, first byte. Быстро отделяет сеть от приложения.
4️⃣Потери, которые не видно через ping
ICMP может быть чистым, а TCP уже страдает. Нужен более честный взгляд на поток.

mtr -T -P 443 <host>


TCP-traceroute часто показывает деградацию там, где обычный ICMP ничего не замечает.
5️⃣Реальная картина очередей и backpressure
Когда система “не падает, но не отвечает” - это почти всегда очереди.

ss -ltnp


Смотришь backlog, количество established, и становится видно, где начинается давление — на accept, kernel или приложение.

N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍6
Traceroute не совпадает с реальным путём

Сервис ведёт себя так, будто трафик идёт по одному маршруту, но traceroute показывает совсем другую картину.

При этом ping может быть стабильным, а задержки появляться “внезапно” и без логики.

traceroute <ip>


Дело в том, что traceroute показывает не путь пакета, а поведение промежуточных узлов, которые могут по-разному отвечать на TTL-expired. В реальности трафик часто идёт через ECMP или policy routing, которые в traceroute просто не видны.

ip route get <ip>


Здесь обычно всплывает реальный next-hop для конкретного пакета — и он может отличаться от того, что ожидается из схемы сети или из traceroute-вывода.

Иногда расхождение усиливается из-за балансировки на уровне ядра или оборудования, когда разные потоки уходят по разным линкам, а traceroute показывает только один из возможных путей.

mtr -T <ip>


TCP-traceroute часто даёт более близкую к реальности картину, потому что имитирует реальный трафик, а не ICMP-ответы.

tracepath <ip>


N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71
VTP - почему его лучше отключить и как безопасно мигрировать без него

VTP (VLAN Trunking Protocol) автоматически синхронизирует VLAN-базу между коммутаторами. Звучит удобно, но по факту это бомба замедленного действия.

Главная проблема, что любой коммутатор с более высоким revision number перезапишет VLAN-базу на всех остальных. Подключил старый свич из кладовки, и все VLAN на продакшене слетели.

Почему отключают:
Один неверный свич уничтожает всю VLAN-конфигурацию сети
Сложно контролировать изменения - нет нормального аудита
VTP v1/v2 не поддерживает extended VLAN (1006–4094)
В современных сетях проще и безопаснее управлять VLAN вручную или через автоматизацию

Как безопасно мигрировать

1️⃣Сначала зафиксируй текущую VLAN-базу на VTP Server

show vlan brief
show vtp status


Сохрани список всех активных VLAN - это твой эталон.

2️⃣Переводи коммутаторы в VTP Transparent по одному, начиная с краёв сети

vtp mode transparent


Transparent не синхронизирует VLAN с другими, но передаёт VTP-объявления дальше - сеть не ломается сразу.

3️⃣Убеждаешься, что VLAN-база на каждом свиче совпадает с эталоном

show vlan brief


4️⃣Когда все переведены в Transparent - можно отключить VTP полностью (VTP v3)

vtp mode off


В v1/v2 режима off нет, Transparent - финальная точка.

5️⃣ Дальше VLAN управляются вручную на каждом свиче или через Ansible/Netmiko.

⚡️ Revision number обнуляется при смене VTP domain или переключении в Transparent. Если срочно нужно обезвредить «опасный» свич перед подключением - меняй domain name на любой другой.

N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍2🔥2
OSPF: сосед завис в EXSTART/EXCHANGE

EXSTART/EXCHANGE - это этап, где два OSPF-соседа договариваются об обмене LSA. Если сосед завис здесь, база топологии не синхронизируется и маршруты не появятся.

Три главные причины: MTU mismatch (самая частая, DD-пакеты не проходят если MTU разный), дублирующийся Router ID (два роутера с одинаковым RID не могут завершить negotiation), проблемы аутентификации (пакеты уходят, но отклоняются на другой стороне).

Диагностика

Смотрим состояние соседа:

show ip ospf neighbor


Если сосед висит в EXSTART/EXCHANGE больше нескольких секунд, уже проблема.

1️⃣Проверяем MTU

show interfaces Gi0/0 | include MTU


На обоих роутерах значение должно совпадать. Либо выравниваем MTU, либо отключаем проверку:

interface Gi0/0
ip ospf mtu-ignore


2️⃣Проверяем дублирующийся Router ID

show ip ospf | include Router ID


RID должен быть уникальным в домене. Меняем вручную и перезапускаем процесс:

router ospf 1
router-id 1.1.1.1

clear ip ospf process


3️⃣Проверяем аутентификацию

show ip ospf interface Gi0/0


Тип аутентификации и ключ должны совпадать на обоих концах. Если используется MD5:

interface Gi0/0
ip ospf authentication message-digest
ip ospf message-digest-key 1 md5 <key>


N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
Wireshark фильтры для диагностики VLAN-трафика

Быстрая шпаргалка для тех, кто разбирает проблемы на trunk-портах или отлавливает трафик конкретного VLAN.

Базовые фильтры

Показать все 802.1Q фреймы, сузить до конкретного VLAN ID или до трафика одного хоста внутри него. Отправная точка для любой диагностики:

vlan
vlan.id == 10
vlan.id == 10 && ip.addr == 192.168.10.5


ARP, DHCP, STP

ARP помогает отловить конфликты IP и посмотреть кто отвечает на запросы. DHCP покажет, доходят ли Discover-пакеты до сервера. STP нужен когда подозреваешь петлю или нестабильную топологию:

vlan.id == 10 && arp
vlan.id == 10 && bootp
vlan.id == 10 && stp


Трафик между двумя хостами и очистка от служебного

Первый фильтр изолирует сессию между конкретными хостами. Второй убирает CDP, LLDP и STP, когда нужно смотреть только на пользовательский трафик без шума:

vlan.id == 20 && ip.addr == 192.168.20.1 && ip.addr == 192.168.20.2
vlan.id == 10 && !stp && !cdp && !lldp


Double-tag и QoS

Первый фильтр ловит QinQ-фреймы или признаки VLAN hopping, когда внутри тегированного фрейма есть ещё один тег. Второй фильтрует по значению CoS, полезно при диагностике приоритизации трафика:

vlan.id == 100 && vlan
vlan.priority == 5


N.A.
👍81
LACP vs Static LAG: когда что использовать

LAG (Link Aggregation Group) объединяет несколько физических линков в один логический. Два способа это сделать: статически или через LACP. Разница принципиальная.

Static LAG просто объединяет порты без какого-либо согласования. Коммутатор не знает, что происходит на другой стороне, линк считается активным даже если там ничего нет. Быстро настраивается, но слепо.

LACP (802.3ad) согласовывает агрегат через обмен LACPDU-пакетами. Оба конца знают о состоянии линков, при падении одного порта трафик перераспределяется автоматически. Чуть сложнее в настройке, но надёжнее.

Статику используют когда другая сторона не поддерживает LACP, например старое оборудование или некоторые гипервизоры. В остальных случаях лучше LACP.

Настройка на Cisco
Static LAG:


interface range Gi0/1 - 2
channel-group 1 mode on


LACP (active инициирует согласование, passive ждёт):

interface range Gi0/1 - 2
channel-group 1 mode active


Проверка агрегата
Смотрим статус Port-Channel и какие порты в него входят:

show etherchannel summary
show lacp neighbor


В выводе show etherchannel summary флаги говорят всё: P - порт в бандле, D - порт упал, S - suspended. Если видишь I (individual) вместо P, порт не попал в агрегат, скорее всего несовпадение настроек speed/duplex или native VLAN.

N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍2
Bonding на Linux: mode 802.3ad и проверка активных линков

Bonding в Linux это аналог LAG на уровне ОС. Mode 802.3ad (LACP) объединяет интерфейсы в агрегат с динамическим согласованием, как на Cisco mode active.

Для работы нужен пакет ifenslave и загруженный модуль bonding:

modprobe bonding
apt install ifenslave


Настройка через systemd-networkd

Создаём bond-интерфейс:

# /etc/systemd/network/bond0.netdev
[NetDev]
Name=bond0
Kind=bond

[Bond]
Mode=802.3ad
LACPTransmitRate=fast
MIIMonitorSec=100ms


Привязываем физические интерфейсы к бонду:

# /etc/systemd/network/bond-slave.network
[Match]
Name=eth0 eth1

[Network]
Bond=bond0


Назначаем IP на bond0:

# /etc/systemd/network/bond0.network
[Match]
Name=bond0

[Network]
Address=192.168.1.10/24
Gateway=192.168.1.1


Проверка

Статус агрегата и активных линков:

cat /proc/net/bonding/bond0


Покажет режим, активные интерфейсы, состояние LACP и MII каждого слейва. Если слейв показывает MII Status: down, физический линк не поднят или коммутатор не согласовал LACP.

Быстрая проверка через ip:

ip link show bond0
ip -d link show bond0


N.A.
👍6
📂Как правильно документировать сеть, чтобы не потерять конфиги

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

1️⃣Сбор данных
Фиксируем все устройства, IP, VLAN, интерфейсы и протоколы маршрутизации.
Команды:

ip addr show          # список интерфейсов
ip route show # таблица маршрутов
vtysh -c "show running-config" # конфиги роутеров
show vlan brief # VLAN на коммутаторах

2️⃣Структурирование: Систематизируем данные: топология, IP-план, протоколы, ACL/Firewall.
Пример таблицы IP:

Устройство | Интерфейс | IP | VLAN | Примечание
-----------|-----------|--------------|------|------------
r1 | eth0 | 10.0.1.1/24 | 10 | WAN
sw1 | vlan10 | 10.0.1.2/24 | 10 | серверная зона
sw2 | vlan20 | 10.0.2.1/24 | 20 | офисная зона
server1 | eth1 | 10.0.1.10/24 | 10 | база данных
server2 | eth1 | 10.0.1.11/24 | 10 | веб-сервер


3️⃣Version control: Сохраняем конфиги в Git. Каждый коммит с комментарием: что и зачем изменилось.

git init
git add configs/
git commit -m "Добавлен новый VLAN 20 на sw2"


4️⃣Визуализация топологии: Diagram-as-code (Mermaid/Graphviz) или инструменты типа NetBox/Draw.io.
Пример Mermaid:

graph TD
R1 --> SW1
SW1 --> Server1
SW1 --> Server2


5️⃣Автоматизация и backup: Скрипты для снятия конфигов и их сохранения в репозиторий или на NAS. Проверка актуальности backup.

Полезные команды для контроля

git log --oneline --graph   # история изменений
diff old_config new_config # что изменилось
ping 10.0.1.2 # проверить доступность после изменений


N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
STP Port States: почему порт долго висит в Listening/Learning

STP переводит порт через несколько состояний перед тем как начать передавать трафик. Blocking, Listening, Learning, Forwarding. В норме переход занимает 30 секунд (15 сек Listening + 15 сек Learning). Если порт завис и не переходит в Forwarding, сеть на этом сегменте не работает.

Чаще всего дело в одном из трёх: некорректно выбран Root Bridge и порт пересчитывает топологию, на порту включён TCN (Topology Change Notification) и STP постоянно переинициализируется, или PortFast не включён там где должен быть.

Диагностика

Смотрим состояние портов и кто Root Bridge:

show spanning-tree
show spanning-tree detail


Проверяем TCN, частые topology change говорят о нестабильном линке или петле:

show spanning-tree detail | include topology change


Что делать?
Если порт ведёт к конечному устройству (PC, сервер, принтер), включаем PortFast. Порт сразу переходит в Forwarding, минуя Listening/Learning:

interface Gi0/1
spanning-tree portfast


Если TCN генерирует конкретный порт, включаем BPDU Guard. При получении BPDU порт уходит в err-disabled вместо того чтобы ломать топологию:

interface Gi0/1
spanning-tree bpduguard enable


Глобально для всех PortFast-портов:

spanning-tree portfast default
spanning-tree portfast bpduguard default


N.A.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4👌1