Ergo Framework – это реализация идей, технологий и шаблонов проектирования из мира Erlang на языке программирования Go. Он построен на акторной модели, сетевой прозрачности и наборе готовых компонентов для разработки. Это значительно упрощает создание сложных и распределенных решений, обеспечивая при этом высокий уровень надежности и производительности.
Есть VPS с префиксом /56 (Linode). Есть роутер с OpenWRT.
На сервере установлен Wireguard.
Так же есть провайдер дом.ру, предоставляющий IPv6 через DHCPv6-PD (если не ошибаюсь).
Сделать хочется следующее:
1. Роутер должен получать IPv6 от провайдера (но не должен раздавать его клиентам).
Т.е. на интерфейсе br-lan должен быть один адрес, через который можно будет выходить в сеть по IPv6. Например
25: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 12:c3:7b:43:4d:05 brd ff:ff:ff:ff:ff:ff
inet6 2a02:2698:1234:abcd::1/64 scope global dynamic noprefixroute
valid_lft 86342sec preferred_lft 3542sec
2.Клиентам роутер должен раздавать IPv4 и IPv6 адреса из пулов, прописанных вручную (для IPv6 это /64 префикс из /56 префикса с сервера).
3.Весь исходящий трафик должен заворачиваться в wg0 интерфейс.
А IPv6 адреса клиентов из /64 префикса с сервера должны быть доступны извне (сейчас такое сделано только в штучных экземплярах на каждом клиенте).
Вопрос пока что такой. Как запретить выдачу IPv6 адресов из /64 префикса провайдера, но чтобы IPv6 доступ был (см. п. 1).
Из предыдущего вопроса вытекает следующий. Как выдавать IPv6 адреса из /64 префикса с сервера, если запретить выдавать адреса из /64 префикса провайдера?
Выхлоп ip a
root@OpenWrt:~# ip a
8: pppoe-wan: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc fq_codel state UNKNOWN group default qlen 3
link/ppp
inet 176.213.xx.xx peer 10.77.xx.xx/32 scope global pppoe-wan
valid_lft forever preferred_lft forever
inet6 fe80::4013:111f:9xxx:xxxc/10 scope link
valid_lft forever preferred_lft forever
12: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 12:c3:7b:xx:xx:x5 brd ff:ff:ff:ff:ff:ff
inet6 2a02:2698:xxxx:xxx9:10c3:7bff:fexx:xxx5/64 scope global deprecated dynamic noprefixroute
valid_lft 76050sec preferred_lft 0sec
inet6 2a01:7e01:xxxx:xxxd:10c3:7bff:fexx:xxx5/64 scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::10c3:7bff:fe43:4d05/64 scope link
valid_lft forever preferred_lft forever
13: eth0.1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-lan state UP group default qlen 1000
link/ether 12:c3:7b:43:4d:05 brd ff:ff:ff:ff:ff:ff
Здесь 2a02:2698:xxxx:xxx9 префикс, выданный провайдером.
А 2a01:7e01:xxxx:xxxd /64 префикс из /56 префикса с сервера.
Конфиг /etc/config/network
Прочитав работу «Techniques and Countermeasures of TCP-IP OS Fingerprinting on Linux Systems» и мануал Block and Slow Nmap with Firewalls, решил, что нужно разработать шаблон iptables для защиты своих vps-ок. Цель – по возможности скрыть пассивные отпечатки OS, а также фильтрация нежелательных подключений. Работа таблиц тестировалась в том числе и на реликтовом 2.6 ядре.
#!/bin/bash
# 1
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
ip6tables -P INPUT DROP
ip6tables -P OUTPUT ACCEPT
ip6tables -P FORWARD ACCEPT
# 2
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -N NMAP
iptables -N SSH
# 3
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
# 4
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT ! -i lo -s 127.0.0.0/8 -j DROP
iptables -A INPUT -m state --state UNTRACKED,INVALID -j DROP
iptables -t nat -A POSTROUTING -s XX.XX.XX.XX/24 -j SNAT --to-source XX.XX.XX.XX --persistent
iptables -A INPUT -i tun+ ! -s XX.XX.XX.XX/32 -p tcp --dport XXXXX -j REJECT --reject-with tcp-reset
iptables -A INPUT -i tun+ -j ACCEPT
# 5
iptables -A INPUT -p udp --dport XXXXX ! --sport 0 -m state --state NEW ! -f -m u32 --u32 "0>>22&0x3C@5&0xFF=0x38 && 0>>22&0x3C@34=0x3F3" -j ACCEPT
# 6
iptables -A INPUT -m recent --update --seconds 604800 --reap --name nmap -j DROP
# 7
iptables -A INPUT -p tcp -m multiport --dports XXXXX,XXXXX -m tcpmss --mss YYYY -m state --state NEW -j SSH
iptables -A SSH -m recent --update --seconds 604800 --reap --name ssh
iptables -A SSH -m recent --set --name ssh
iptables -A SSH -m limit --limit 1/minute --limit-burst 1 -j ACCEPT
iptables -A SSH -j DROP
# 8
iptables -A INPUT -p icmp --icmp-type 8 -m length --length XXXX -m limit --limit 1/second --limit-burst 1 -j ACCEPT
iptables -A INPUT -p icmp -m limit --limit 1/second --limit-burst 1 -j REJECT --reject-with icmp-host-unreachable
# 9
iptables -A INPUT -p tcp --sport 0 -j NMAP
iptables -A INPUT -p udp --sport 0 -j NMAP
iptables -A INPUT -m state --state NEW -f -j NMAP
iptables -A INPUT -p tcp -m osf --genre NMAP -j NMAP
iptables -A INPUT -p udp -m length --length 20:28 -j NMAP
iptables -A INPUT -p tcp ! --tcp-flags ALL SYN -m state --state NEW -j NMAP
iptables -A INPUT -p tcp --tcp-flags SYN SYN -m state ! --state NEW -j NMAP
iptables -A NMAP -m recent --set --name nmap -j DROP
# 10
iptables -t mangle -A OUTPUT -p tcp -j ECN --ecn-tcp-remove
iptables -t mangle -A OUTPUT -p tcp -j DSCP --set-dscp-class XX
iptables -t mangle -A OUTPUT -p tcp --syn -j TCPMSS --set-mss XXXX
iptables -t mangle -A OUTPUT -p tcp -j TTL --ttl-set 128
iptables -t mangle -A OUTPUT -p udp -j TTL --ttl-set 32
iptables -t mangle -A OUTPUT -p icmp -j TTL --ttl-set 128
# 11
# XXXXX service
iptables -A INPUT -p tcp --dport XXXXX -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport XXXXX -m state --state NEW -j ACCEPT
exit 0
#1 Настройка политик по умолчанию. ipv6 обычно отключена, но ip6tables -P INPUT DROP оставляю на случай, если забуду v6 выключить.
#2 Очистка таблиц перед настройкой правил.
#3 Подтверждённые соединения больше не фильтруются. Без RELATED всё замечательно работает.
#4 Внутренний трафик должен приходить только с устройства lo. -j SNAT для vpn. ! -s XX.XX.XX.XX/32 на некоторые порты доступ закрыт в том числе друзьям внутри виртуальной сети. Остальной трафик внутри vpn -i tun+ принимается без фильтраций.
#5 Мне нужен стабильный доступ к vpn даже тогда, когда мой ip-шник занесён в список блокировки (во время тестов такое случается частенько). Есть подключение по vpn – доступ к ssh гарантирован. Так как этот порт не прикрыт чёрным списком, ему назначены дополнительные проверки: первый пакет не должен быть сегментирован, например. Модуль u32 – это нечто! Оооочень доступный мануал от Bill Stearn здесь. Меня напрягало, что OpenVPN отвечает на обе доступные пробы nmap -sV. Благо, первый openvpn udp пакет обладает уникальными для каждой конфигурации признаками в зависимости от сгенерированнного Diffie–Hellman ключа. 0>>22&0x3C@5&0xFF=0x38 матчится байт-маркер OpenVPN, 0>>22&0x3C@34=0x3F3 – бред, чтобы не копировали: здесь правило будет у всех разное, можно только его оставить. Ищется просто с помощью tcpdump, wireshark и т. д. В результате vps-ка больше не отвечает ни на какие пробы запущенной на порту службы.
#6 Чёрный список со сроком жизни каждой записи в одну неделю.
#7 К сожалению, первый пакет tcp соединения (ssh) невозможно фильтровать модулем u32 – пакет обычно пустой, а провайдер режет бит TOS. Поэтому придумал помечать SYN пакеты выставлением --mss (принимает значения до 1460 включительно). Выбрал нестандартное значение и voilà: для обычного сканера порт выглядит всегда закрытым, и не нужно городить «port-knocking» и прочие «f2b». Доступ к ssh разрешён только по сертификату + подключаюсь всегда только с одной машины. Разумеется, у клиента прописано правило -t mangle -A POSTROUTING -d XX.XX.XX.XX -p tcp --syn -m multiport --dports XXXXX,XXXXX -j TCPMSS --set-mss YYYY. Это резервное правило, потому что всегда подключаюсь к ssh по vpn. -m limit --limit 1/minute нужен для замедления атак на случай, если злоумышленник подберёт значение mss. Таблица -m recent --set --name ssh не участвует в блокировках, но мне нужна, чтобы я начал вовремя паниковать (время от времени просматриваю логи блокировок).
#8 icmp отвечает только если матчится --length XXXX. Во всех остальных случаях не drop, а --reject-with icmp-host-unreachable – никого нет дома! На мой взгляд это эффективнее.
#9 Детектор tcp и udp сканеров. Ответ на пакет с запрещённого 0-го порта – пассивный признак OS. Сканирование пустыми udp пакетами – верный признак nmap. Первый пакет tcp соединения должен быть помечен SYN флагом, и только так! Он не должен быть сегментирован. Всё остальное от лукавого!
Меня не интересует блокировка случайных сканеров: каждый день они стучатся тысячами на 22 и т. п. порты. Постучатся разок, да и уходят. А вот nmap-щики отличаются настырностью, как о том свидетельствуют логи. Скан-товарищи появляются нечасто: 1 в день максимум, но таких лучше выявлять и отправлять в ж… на одну неделю.
#10 Затирание пассивных признаков OS. Цепочка -A OUTPUT транзитный трафик не изменяет, только ответы и соединения самого сервера. Бит TOS (он же ECN + DSCP) менять нужно 100%, он в дефолте выдаёт linux. «–set-mss XXXX» выставляю любой, который матчится скриптами nmap (благо исходники на гитхабе можно просмотреть и подобрать подходящее значение). По моему наблюдению удачными значениями являются 1000, 1400 и 1460. «–ttl-set 128» чаще бывает на M$. В итоге nmap после сканирования с пристрастием уверенно рапортует, что 98% на устройстве работает OS M$ 2000 server, а зная операционку, уже понятно какие надо применять эксплойты ;)
#11 Прописаны открытые порты для моих сервисов. Там их куча, оставил образец.
Изучил все расширения iptables. Больше ничего полезного для себя не нашёл. Если есть ещё интересные способы прикрытия файервола на iptables – прошу поделиться опытом. Может быть какие-то неочевидные ошибки допустил – прошу поправить. Буду рад, если мой опыт кому-нибудь пригодится.
От атак «я-у-мамы-кул-хацкеров» такие правила должны защитить. В случае с профессионалами, наверно, это не защита, но таким до моих vps-ок нет никакого дела :)
Периодически (закономерность не смог установить) PostgreSQL 12 запускает некий процесс с названием OKA. Все бы ничего, но он сжирает почти всю память. Нашел в папке PostgreSQL файлы oka и oka.pid, судя по всему, отвечающие за этот процесс.
Что это за процесс и почему он отъедает столько памяти?
Я тут решил узнать как достопочтенные лоровцы заливают бекапы в облако? У меня требования простые: делать инкрементальный шифрованный бэкап куда-нибудь в B2/S3 и т.п. (object storage). Пока что я нашел следующие варианты:
1. borg + rclone
2. rsync + руки
3. duplicty / duplicati / тысячи их
Интересует реальный опыт из первых рук, т.к. например, про п.3. некоторые писали, что оно кривое и работает через раз. А я, как бы, не очень хочу на своих данных проверять насколько хорошо оно работает.
Давно хотел организовать себе домашний офис/homelab и решил задокументировать результат, мало ли кому-нибудь окажется полезным.
В нише над камином расположена основная рабочая(домашняя?) станция, Macbook Pro вставленный в док и UPS. Пучок из нескольких DisplayPort и USB3 проводов проброшен через стену к столу.
В мониторе встроен KVM, и с одной кнопки переключается видео между macbook & PC, а так же перебрасываются все USB устройства расположенные на и под столом.
Почти все что тут есть интегрировано в HomeAssistant, включая оконные сенсоры, свет, камин и standing desk, в основном используя различные DIY устройства на ESP8266 & ESP32. Так же все управляется голосом через Amazon Echo.
Отлично работает Witcher 3 & Metro Exodus через Wine + DXVK.
Для гитары, под столом установлен JAM 96k, - тоже работает прекрасно с Jack/Wine/WineAsio & Amplitube 4.
pywal генерирует цветовую схему для всех CLI приложений и устанавливает цвет Nanoleaf Aurora & Hue через HomeAssistant. Видео
На одной из ножек стола прикреплен HTC Vive linkbox, и остается только подключить VR шлем и наслаждаться ждать когда состояние VR на Linux поднимется выше уровня плинтуса.
Yubikey для 2FA установлен рядом с усилителем, как раз примерно там где удобно его нажимать.
Чтобы не искать каждый раз розетки - по бокам стола разведены провода для питания и USB. Осциллограф и блок питания управляются через USBTMC & Sigrok. Для работы с мелкими деталями я сделал LED плату которая установлена под микрофон который теперь по совместительству - настольная лампа.
Workstation:
CPU: AMD Threadripper 1950X
AIO: Thermaltake Floe Riing 360 TT
Motherboard: ASRock - X399 Taichi
RAM: G.Skill - Trident Z RGB 32 GB (4 x 8 GB) DDR4-3200 Memory
SSD: HP - EX920 1 TB M.2-2280 Solid State Drive x 2
HD: WD Red WD100EFAX 10TB
GPU: EVGA - GeForce GTX 1080 Ti 11 GB SC Black Edition Video Card
GPG ключи
Установленные пакеты софта (целостность файлов)
Соответствие ключей SSH на всех хостах и клиентах
Чексумму BIOS
Адресов ARP кэша, не должно быть лишних
Списка установленных пакетов, блокировка установки новых пакетов
При dist-upgrade не должны меняться состояния запусков старых и новых сервисов, как это сделать?
Списка запущенных процессов
Списка включенных сервисов
Создавать:
Логи SSH для root, которые не мешают работе rsync, scp и т.п.
Есть что-нибудь готовое?
Наверно лучше бы если было интегрированно с grsecurity и т.п.
Tusky — легковесный Mastodon-клиент для платформы Android, который поддерживает все возможности сети Mastodon, включая фото, видео, списки, «custom emoji» а также имеет интерфейс, разработанный в соответствии с Material design.
Mastodon — федеративная социальная сеть для микроблогинга, написанная на языке Ruby и использующая стандартизированный W3C протокол ActivityPub.
Как можно посмотреть текущую статистику (сколько и какие клиенты сейчас подключены, а также можно по переданным данным за ссесию) по openvpn?
Интересует возможность не парсить логи и т.д. т.е. с помошью команды.
import socket
sock = socket.socket()
sock.bind(('127.0.0.1', 3333))
sock.listen(1)
conn, addr = sock.accept()
print ('connected:', addr)
while True:
data = conn.recv(1024)
if not data:
break
conn.send(data.upper())
conn.close()
Но сразу после отдачи данных скрипт завершается, а мне нужно, чтобы висел и отдавал на каждое обращение. Как это сделать?
Если просто убрать conn.close() - все равно завершается
Я отношусь с уважением ко всем религиям, но вот историю появления данной религии чё-то пропустил. Какие-то молодые отцы-IT-шники зырили мультики со своими детьми и понеслось? Или там чё-то более фундаментальное и идейное?
Продолжение темы Galago UltraPro – первый ноутбук с Haswell на Ubuntu. Сегодня получил девайс на руки и уже успел разобрать до винтика и собрать обратно - добавлял mSATA SSD и добивал оперативную память до 16Gb.
Собственно, первые впечатления:
Собран хорошо, скрипов нет, крышка достаточно твердая - при умеренном нажатии разводов на экране не остается. Корпус не пластиковый - скорее напоминает корпуса бизнес-ноутов от HP. Отпечатки не собирает.
Клавиатура: раскладка хороша, ход короткий, но нажатие четко фиксируется. Я пока привыкаю - это моя первая клавиатура остравного типа.
Экран шикарен - матовая (!) Full HD (!) IPS (!) матрица - попробуйте найти еще один ноут с таким экраном на рынке.
Установка памяти и mSATA SSD процедура нетривиальная. Нижняя крышка снимается целиком после откручивания 17 (!) болтиков. После этого появляется доступ к аккумулятору и SATA-разъему, а вот память и mSATA слот находятся под(!) платой - т.е. нужно снять аккум, HDD, вентиляторы, отсоединить кучу шлейфов и только тогда появляется более-менее нормальный доступ к слотам. В общем пришлось изрядно попотеть.
По системе сказать пока ничего не могу - стоит убунта 13.04 с каким-то драйвером от производителя, который непонятно что делает. Сейчас переношу свой Arch и там уже посмотрю на производительность и поведение железа, но в убунте на первый взгляд все работает как надо.
В общем задавайте вопросы, а я буду отписываться по мере появления новой информации.