raidshadowlegend

raidshadowlegend

Пикабушник
0sennijLis
0sennijLis оставил первый донат
19К рейтинг 30 подписчиков 6 подписок 51 пост 35 в горячем
28

Почему Nginx пишет IP прокси вместо IP клиента

Сидишь за reverse proxy, CDN или балансировщиком - открываешь access-лог, а там один и тот же IP на всех запросах. Обычно 127.0.0.1, адрес ingress-контроллера или внутренний IP прокси.

На этом фоне ломаются rate limiting, fail2ban, аудит и любые расследования: Nginx честно пишет адрес своего непосредственного соседа, а не исходного клиента.

Почему так.

$remote_addr - это адрес узла, который напрямую установил соединение с Nginx. Если перед ним стоит прокси, то для Nginx клиентом является именно прокси.

Настоящий IP пользователя обычно приезжает отдельно:

  • в X-Real-IP;

  • в X-Forwarded-For;

  • в заголовке конкретного CDN;

  • через PROXY protocol, если перед нами L4-балансировщик.

Но просто взять значение HTTP-заголовка и записать его в лог - плохая идея:

log_format main '$http_x_real_ip - $request';

Любой клиент может сам отправить:

X-Real-IP: 1.1.1.1

и подложить в ваши логи произвольный адрес.

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

Для этого в Nginx есть штатный ngx_http_realip_module.

Проверяем, собран ли он в текущем бинарнике:

nginx -V 2>&1 | tr ' ' '\n' | grep -- --with-http_realip_module

Если Nginx собираете сами, понадобится флаг:

--with-http_realip_module

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

Настраиваем доверенный прокси:

set_real_ip_from 10.42.0.10;

set_real_ip_from 10.42.0.11;

real_ip_header X-Real-IP;

После этого Nginx будет заменять $remote_addr адресом из X-Real-IP, но только если соединение пришло от узла из set_real_ip_from.

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

Вот так делать нежелательно:

set_real_ip_from 10.0.0.0/8;

Этой настройкой вы разрешаете любому узлу из всей сети 10.0.0.0/8 подменять клиентский IP. Лучше доверять конкретным адресам прокси или выделенному сегменту.

Сам origin при этом желательно закрыть от прямого доступа извне через firewall, security group или network policy. Иначе клиент сможет обойти прокси и прийти непосредственно к Nginx.

На самом прокси X-Real-IP должен перезаписываться, а не слепо передаваться от клиента:

proxy_set_header X-Real-IP $remote_addr;

Не так:

proxy_set_header X-Real-IP $http_x_real_ip;

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

В чём ловушка с X-Forwarded-For

Этот заголовок содержит цепочку адресов через запятую:

X-Forwarded-For: client, proxy-1, proxy-2

Если в инфраструктуре несколько доверенных прокси, можно настроить Nginx так:

set_real_ip_from 10.42.0.10;

set_real_ip_from 10.42.0.11;

real_ip_header X-Forwarded-For;

real_ip_recursive on;

Тогда Nginx будет разбирать цепочку справа налево, пропуская доверенные адреса из set_real_ip_from, и выберет последний недоверенный адрес.

Например:

X-Forwarded-For: 1.1.1.1, 203.0.113.25, 10.42.0.10

Если 10.42.0.10 - доверенный внутренний прокси, а 203.0.113.25 - адрес клиента, добавленный доверенным edge-прокси, Nginx выберет 203.0.113.25, а не подставленный пользователем 1.1.1.1.

Но это работает безопасно только тогда, когда вся доверенная цепочка прокси известна и перечислена в set_real_ip_from.

После обработки модулем:

  • $remote_addr - восстановленный адрес клиента;

  • $realip_remote_addr - исходный адрес узла, который подключился к Nginx;

  • $http_x_forwarded_for - заголовок в том виде, в котором он приехал.

Для диагностики удобно логировать всё сразу:

log_format main

'client=$remote_addr '

'peer=$realip_remote_addr '

'xff="$http_x_forwarded_for" '

'request="$request" '

'status=$status';

Так можно понять не только какой IP выбрал Nginx, но и от какого прокси пришло соединение и какую цепочку тот передал.

Rate limiting после этого тоже сможет работать по реальному клиентскому адресу - если ключ зоны построен на $remote_addr или $binary_remote_addr:

limit_req_zone $binary_remote_addr

zone=per_ip:10m

rate=10r/s;

Использовать для лимитов сырой $http_x_forwarded_for не стоит: это строка с цепочкой адресов, которую при неправильной настройке прокси можно подделать или постоянно менять.

С fail2ban та же логика: он увидит реальный адрес только в том случае, если анализирует поле лога, в котором записан обработанный $remote_addr.

Если перед Nginx стоит TCP-балансировщик, HTTP-заголовков может не быть вообще. Тогда обычно используется PROXY protocol:

server {

listen 443 ssl proxy_protocol;

set_real_ip_from 10.42.0.10;

real_ip_header proxy_protocol;

}

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

После изменения конфигурации:

nginx -t && systemctl reload nginx

Проверяем:

tail -f /var/log/nginx/access.log

Смотрим одновременно на client, peer и xff. Проверка только первого поля лога мало что доказывает: важно видеть всю цепочку и понимать, почему Nginx выбрал именно этот адрес.

Очень краткий вывод

Не доверяйте заголовку с IP.
Доверяйте конкретному прокси, который этот заголовок сформировал.

Показать полностью
365

Docker может обходить UFW через port binding - проверьте у себя

Если вдруг в вашем docker-compose.yml порты объявлены так:


ports:
- "5432:5432"

…это привязка к 0.0.0.0 - то есть порт торчит наружу на всех интерфейсах. Проблема в том, что Docker прописывает свои правила прямо в iptables, в обход UFW. Ваш файрвол честно «закрыт», а порт на самом деле открыт всему интернету.

Проверить просто. Посмотрите, на каких интерфейсах реально слушается порт внутри ОС::

ss -tlnp | grep 5432

# или через docker: docker port <container_name>

Если в выводе 0.0.0.0:5432 вместо 127.0.0.1:5432 - порт открыт наружу.

Исправление - одна строка (явно укажите localhost, чтобы Docker слушал только loopback-интерфейс, и порт оставался доступным только внутри хоста):

ports:

- "127.0.0.1:5432:5432"

Docker будет слушать только на loopback, и порт останется доступным только с хоста.

Почему сканеры не помогут

Паттерн "5432:5432" без явного 127.0.0.1: - это слепое пятно для Trivy, Checkov, Semgrep и Snyk. Ни один из них не флагует такой биндинг как эксплойт, потому что это мисконфиг а не уязвимость. Рассчитывать на CI-сканеры в этом случае нельзя - проверять нужно глазами или кастомным правилом.

Показать полностью
10

Как GNU Tar обрабатывает удаленные объекты в инкрементных tar-архивах

Предположим, что у вас есть система, которая использует GNU Tar для полных и инкрементных резервных копий. Или, может быть, вы используете GNU Tar для этого напрямую. Если у вас есть инкрементный tar-архив, вас могут интересовать один или оба вопроса, которые в некотором смысле зеркально отражают друг друга: какие файлы были удалены между предыдущим инкрементом и этим, или каково состояние дерева каталогов на момент этого инкремента (если он и все предыдущие бэкапы, от которых он зависит, были правильно восстановлены). (Эти вопросы глубоко волнуют людей, которые могли удалить какое-то количество файлов, но не уверены точно, какие именно файлы были удалены.)

Обработка удаленных файлов - одна из проблем инкрементного резервного копирования, и подходы к ней бывают разными. То, как GNU Tar справляется с удаленными файлами, отчасти задокументировано в разделах "Using tar to perform incremental dumps" и "Dumpdir", но документация не объясняет это предметно. Если упростить, то GNU Tar не записывает удаления явно. Вместо этого каждый инкрементный tar-архив содержит полный список дерева каталогов, который включает как объекты, находящиеся в этом инкрементном архиве, так и те, что пришли из предыдущих. Чтобы вычислить удаленные файлы, вам нужно сравнить два списка дерева каталогов. (В рамках этого полного списка инкрементный tar-архив записывает каждый каталог, даже неизмененный.)

Вы можете получить эти полные списки с помощью команды tar --list --incremental --verbose --verbose --file ..., но tar выводит их в неудобном формате. Вы не получаете дерево каталогов в том виде, в каком его выдает обычный tar -t. Вместо этого вы получаете содержимое Dumpdir для каждого каталога, напечатанное отдельно, и вам придется самостоятельно обрабатывать результаты, чтобы собрать дерево каталогов с полными путями и так далее. Люди, вероятно, писали инструменты для этого - либо на основе вывода tar, либо путем прямого чтения формата инкрементного архива GNU Tar.

На мой взгляд, подход GNU Tar вполне разумен и обладает некоторыми полезными свойствами (хотя тут есть свои компромиссы). Что удобно, вы можете восстановить полное дерево каталогов на этот конкретный момент времени из любого отдельного инкрементного архива - вам не нужно проходить через всю цепочку, чтобы собрать общую картину. Это также, вероятно, делает систему несколько более устойчивой, если вы утеряли часть инкрементных архивов где-то в середине: по крайней мере, вы знаете, что там должно быть, пусть у вас и нет копий этих файлов. Поиск момента, когда был удален один конкретный файл, происходит лучше, чем если бы существовали явные записи об удалении, так как вы можете запустить бинарный поиск по инкрементам, чтобы найти первый, где этот файл исчезает. Отсутствие явных отчетов об удалении действительно делает неудобным определение всего, что было удалено между двумя последовательными инкрементами, но с другой стороны, вы можете определить, что было удалено (или добавлено) между любыми двумя tar-архивами, без необходимости просматривать каждый инкремент между ними.

(Можно сказать, что инкрементные архивы GNU Tar содержат снимок состояния дерева каталогов, вместо того чтобы вести журнал изменений этого состояния.)

Показать полностью
18

Bcachefs после снятия experimental: гоняем тесты на Ubuntu 26.04

Серия Эксперименты в homelab

Вынос со скандалом Bcachefs из mainline-ядра Linux в конце 2025 года (начиная с релиза 6.18) проект не похоронил. Напротив, это явно подстегнуло мейнтейнера к жесткой дисциплине. Спустя 7 месяцев проект перешел на DKMS-модель и официально снял статус experimental.

Развернул тестовую ВМ в Proxmox, чтобы посмотреть на эксплуатационный UX: как ставится, как ведет себя при отказе дисков и стоит ли тащить в homelab или прод.

Дисклеймер. Это синтетические тесты, а не академический бенчмарк (на виртуалке поверх ZFS тестировать скорость - такое себе). Цель - проверить работу базовых функций, диагностику и поведение при аварии.

1. Установка и DKMS-нюансы

Тест проводился на Ubuntu 26.04 с ядром 7.0.0-22-generic. Штатного модуля в ядре дистрибутива нет, так что идем в официальный репозиторий за DKMS:

# Добавляем репозиторий apt.bcachefs.org (unstable / bcachefs-tools-release) и затем ставим всю обвязку

sudo apt install bcachefs-tools bcachefs-kernel-dkms fio btrfs-progs

По итогу получаем собранный модуль (bcachefs.ko.zst версии 1.38.6), и dmesg ожидаемо сыплющий ворнингами про tainting kernel и verification failed. Ну это просто надо иметь ввиду - теперь вы живете на внешнем модуле, и при каждом обновлении ядра нужно будет пристально следить за DKMS.

bcachefs: loading out-of-tree module taints kernel

bcachefs: module verification failed: signature and/or required key missing - tainting kernel

bcachefs: filldir64 fastpath disabled: struct layout unverified for this kernel

2. Базовый single-disk сценарий

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

  1. Создать ФС на одном диске.

  2. Смонтировать.

  3. Записать файл 1 GiB и 5000 мелких файлов.

  4. Запустить usage/scrub.

  5. Размонтировать и выполнить offline check.

Для Bcachefs:

sudo bcachefs format -f -L bcf_single /dev/sdb

sudo mount -t bcachefs -o noatime /dev/sdb /mnt/bcf

sudo bcachefs fs usage -h -a /mnt/bcf

sudo bcachefs scrub /mnt/bcf

sudo bcachefs fsck -n -f /dev/sdb

Для Btrfs:

sudo mkfs.btrfs -f -L btr_single /dev/sdc

sudo mount -t btrfs -o noatime /dev/sdc /mnt/btr

sudo btrfs filesystem usage -T /mnt/btr

sudo btrfs scrub start -B /mnt/btr

sudo btrfs check --readonly /dev/sdc

На этом этапе всё скучно, единственная практическая ценность тут - набор команд для создания ФС, может кому пригодится как шпаргалка.

Можно еще отдельно сказать про команды Bcachefs. Они непривычны, но в целом на удивление логичны: вместо mkfs.bcachefs используется bcachefs format, диагностика идёт через bcachefs fs usage, проверка через bcachefs fsck.

3. Сжатие

Для проверки сжатия использовал простой набор:

  1. zero-512m.bin, 512 MiB нулей.

  2. random-256m.bin, 256 MiB случайных данных.

Bcachefs создавалась сразу с zstd:

sudo bcachefs format -f -L bcf_zstd --compression=zstd /dev/sdb

Btrfs монтировалась с compress=zstd:

sudo mount -t btrfs -o noatime,compress=zstd /dev/sdc /mnt/btr

У Bcachefs понравилась отдельная секция в fs usage:

Итоговое использование места:

Bcachefs - около 283 MiB

Btrfs - около 274 MiB

Обе ФС отработали отлично (нули сжали, рандом пропустили). Разница в несколько мегабайт тут не имеет особого смысла.

Из интересного - у Bcachefs утилита fs usage выдает шикарную и очень наглядную статистику по сжатым/несжимаемым данным прямо в консоль.

4. Снапшоты

Снапшоты проверял простым бытовым сценарием:

  1. Создать subvolume.

  2. Записать state.txt со значением original.

  3. Создать read-only snapshot.

  4. В живом subvolume поменять файл на changed.

  5. Прочитать файл из snapshot.

Bcachefs:

bcachefs subvolume create /mnt/bcf/subv

bcachefs subvolume snapshot -r /mnt/bcf/subv /mnt/bcf/snap1

Btrfs:

btrfs subvolume create /mnt/btr/subv

btrfs subvolume snapshot -r /mnt/btr/subv /mnt/btr/snap1

Результат у обеих ФС одинаковый:

live=changed

snapshot=original

Здесь ноль сюрпризов. Снапшоты работают так, как от CoW-ФС и ожидаешь.

5. Производительность fio и мелкие файлы

Теперь к цифрам. Ещё раз: это синтетические тесты внутри одного сомнительного стенда.

Параметры fio:

single disk

без сжатия

sequential read/write: bs=1M, size=2G

random write: bs=4k, numjobs=4, iodepth=16, runtime=30

Первые три строки ниже - это fio. Создание и удаление 10000 мелких файлов замерялись отдельно обычным shell-сценарием: создание дерева файлов и последующий rm -rf этого дерева.

Результаты:

На этом стенде Bcachefs заметно быстрее на последовательной записи, random write 4K и создании мелких файлов. Btrfs, наоборот, быстрее на последовательном чтении и чуть быстрее удаляет дерево мелких файлов.

Само собой всё это автоматически не приводит нас к выводу, что Bcachefs быстрее Btrfs. Всё таки подложка в виде Proxmox/ZFS может сильно влиять на такие цифры. Но как лабораторный результат - как минимум любопытно.

Отдельный нюанс: во время нагрузки у Bcachefs в dmesg появилась строка:

bcachefs (sdb): bch2_journal_flush_seq stuck? Waited 10s for seq 32

После этого ФС нормально размонтировалась и прошла проверки. Но при эксплуатации это сообщение нельзя просто игнорировать. Его стоит отдельно разбирать при повторных тестах.

6. Multi-device

Одна из причин вообще смотреть на Bcachefs - обещание функциональности уровня современных CoW-ФС с более гибкой моделью устройств.

Bcachefs с двумя копиями данных и метаданных создаётся так:

bcachefs format -f -L bcf_raid1 --replicas=2 /dev/sdb /dev/sdc

После записи 512 MiB полезной нагрузки bcachefs fs usage показал ожидаемую репликацию:

Btrfs RAID1 создавался привычно:

mkfs.btrfs -f -d raid1 -m raid1 -L btr_raid1 /dev/sdb /dev/sdc

У него всё ожидаемо отображается через Data ratio: 2.00 и Metadata ratio: 2.00.

Нюанс в терминологии: у Bcachefs модель --replicas=2 читается проще. Мы описываем желаемое количество копий, а не выбираем отдельные RAID-профили для data и metadata. Для админа это вполне приятная деталь.

7. Потеря диска на живую

Ну и само собой важная часть для любой multi-device ФС нифига не красивая таблица fio, а поведение при отказе.

Сначала пробовал имитировать отказ изнутри гостевой ОС через /sys/block/*/device/delete и device/state=offline. В этой ВМ метод оказался ненадёжным: устройство либо оставалось видимым, либо состояние быстро возвращалось в running.

Поэтому финальный тест делал через QMP hot-unplug на уровне Proxmox/QEMU. Постоянную конфигурацию ВМ не менял, удалял только live-устройство.

Bcachefs

Сценарий:

  1. Bcachefs на /dev/sdb и /dev/sdc.

  2. Форматирование с --replicas=2.

  3. Запись 256 MiB payload.

  4. QMP device_del scsi2, то есть удаление второго диска.

  5. Проверка чтения старого файла и запись нового файла.

После hot-unplug /dev/sdc исчез из lsblk. Чтение и запись продолжили работать:

/mnt/bcf/payload.bin: OK

-rw-rw-r-- 1 user user 20 ... /mnt/bcf/after-qmp-hotunplug.txt

Диагностика Bcachefs показала, что часть метаданных уже требует восстановления реплик:

В dmesg появились ожидаемые ошибки по удалённому устройству:

bcachefs: error writing btree node ... sdc io: BLK_STS_OFFLINE

bcachefs (sdc): offline from block layer

bcachefs: error writing btree node ... sdc io: BLK_STS_REMOVED

Практический вывод: ФС осталась рабочей, данные читались, новая запись прошла. При этом состояние явно деградировало и требует дальнейшего reconcile/восстановления. Собственно, именно это и хотелось увидеть от теста.

Btrfs

Для Btrfs аналогичный сценарий делал на другой паре дисков:

  1. Btrfs RAID1 на /dev/sdd и /dev/sde.

  2. Так же запись 256 MiB payload.

  3. QMP device_del scsi4.

  4. Проверка чтения и запись нового файла.

После удаления /dev/sde ФС тоже продолжила работать:

/mnt/btr/payload.bin: OK

-rw-rw-r-- 1 user user 20 ... /mnt/btr/after-qmp-hotunplug.txt

btrfs filesystem usage -T показал missing device:

WARNING: failed to get device size for /dev/sde: No such file or directory

Device missing: 20.00GiB

В dmesg появились ошибки записи на удалённое устройство:

BTRFS error (device sdd): bdev /dev/sde errs: wr 1, rd 0, flush 0, corrupt 0, gen 0

BTRFS warning (device sdd): lost super block write due to IO error on /dev/sde (-5)

BTRFS error (device sdd): error writing primary super block to device 2

В этом конкретном сценарии обе ФС повели себя адекватно: RAID1-подобная конфигурация пережила потерю одного диска на живую, данные остались читаемыми, запись продолжилась.

8. Что там по UX

Понравилось в Bcachefs:

  1. bcachefs fs usage -h -a очень информативен.

  2. Хорошо видно data/metadata, compression, btree и состояние устройств.

  3. Модель --replicas=2 читается проще, чем отдельные профили -d raid1 -m raid1.

  4. Снапшоты и subvolume-команды выглядят логично.

  5. Потерю одного устройства при репликации ФС пережила.

Минусы:

  1. Вместо нормальной поставки в составе ядра - поставляется как DKMS-модуль со всеми вытекающими (вообще надо было постараться настолько сильно выбесить мейнтейнеров ядра своим стилем разработки, чтоб тебя со скандалом вып*здили из mainline)

  2. В dmesg был warning про bch2_journal_flush_seq stuck.

  3. Сценарий возврата или замены диска после hot-unplug надо тестировать отдельно.

У Btrfs главный плюс скучный, но весомый: он давно есть в дистрибутивах, хорошо документирован, привычен и в принципе практически стабилен.

Итоги

  1. Bcachefs после снятия experimental уже имеет смысл тестировать в homelab.

  2. В базовых сценариях ФС отработала нормально: создание, монтирование, scrub/fsck, сжатие, снапшоты, multi-device.

  3. На этом стенде Bcachefs хорошо выступила на записи и мелких файлах, но это синтетические тесты.

  4. Потерю одного диска при --replicas=2 Bcachefs пережила: данные читались, запись продолжалась, диагностика показала деградацию.

Если резюмировать, то основные вопросы пока не столько к самой ФС, сколько к эксплуатационной обвязке: DKMS, обновления ядра, загрузка модуля и восстановление после отказов.

ИМХО, для лаборатории, тестового NAS, домашнего стенда и удовлетворения инженерного любопытства - да, Bcachefs уже интересно гонять. Для продакшена или единственной копии важных данных - только после собственных аварийных тестов и с нормальными бэкапами.

Показать полностью 5
129

Чтож, день когда GNU/Linux станет Systemd/Linux - всё ближе

В systemd 261 подвезли сразу несколько вещей, от которых у старой школы снова начнёт подёргиваться глаз и гореть пердак: systemd-sysinstall, IMDSD и storagectl.

Самое вкусное тут, конечно, systemd-sysinstall. Это попытка сделать нативный установщик ОС прямо внутри systemd. Не графический мастер с кнопкой "далее-далее-готово", а низкоуровневый механизм, который умеет ставить систему по описанию: разметка, образы, загрузчик, нужные системные компоненты. То есть ещё один кусок жизненного цикла Linux-системы переезжает под крыло systemd.

И это уже не просто "инициализация сервисов", в качестве которого systemd когда-то продали публике. За годы systemd стал отвечать за запуск, логи, сеть, DNS, домашние директории, шифрование, portable-сервисы, загрузку, контейнероподобные штуки, а теперь всё ближе подбирается к установке и управлению дисками.

IMDSD, Initramfs Management Daemon, выглядит как ещё один шаг в ту же сторону. Initramfs давно был местом, где у каждого дистрибутива свои скрипты, свои костыли, свои генераторы и вообще свой маленький уютный хаос. systemd предлагает сделать и этот слой более управляемым, предсказуемым и встроенным в общую модель.

storagectl туда же: управление хранилищами, блочными устройствами и всем, что лежит между железом и файловой системой. Не удивлюсь, если через пару лет обычный админ будет разбираться с дисками не через набор разрозненных утилит, а через очередную systemd-команду.

И вот тут начинается вечный холивар.

С одной стороны, systemd действительно решает реальную боль. Linux-инфраструктура исторически росла как набор отдельных инструментов, которые нужно склеивать руками, скриптами и молитвой. Для серверов, облаков, immutable-систем и автоматической установки единая модель управления выглядит логично. Особенно если хочется воспроизводимости: описал систему, получил систему.

С другой стороны, ощущение "systemd поглощает всё" никуда не делось. Просто потому что он и правда поглощает всё. Так уж получилось что недоделок в Linux-стеке всё же много, а systemd приходит туда с рабочим кодом, документацией и готовностью взять ответственность за ещё один неприятный слой.

Можно сколько угодно ворчать про монолитность и нарушение Unix-way, но реальность неприятнее: альтернативы часто либо фрагментированы, либо поддерживаются хуже, либо требуют от администратора слишком много ручной работы. systemd побеждает не потому, что всем нравится. Он побеждает потому, что закрывает скучные, но важные задачи.

Так что да, шутка про Systemd/Linux становится всё менее шуткой.

Сначала он запускал сервисы. Потом управлял логами, сетью, DNS и загрузкой. Теперь подбирается к установке ОС, initramfs и storage-слою.

Осталось дождаться systemd-kernel, systemd-bash и systemd-coffee.

Хотя ладно, последнее я бы, пожалуй, поставил.

Показать полностью
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества