Hairpin NAT – делаем доступ к сервисам пользователям из LAN используя внешний IP

Hairpin NAT очень полезная штука в случае когда надо дать доступ внутренним сервисам (находящимся в LAN) друг к другу, используя внешний IP адрес (например, “для единообразия” или если не хочется заморачиваться с DNS).

Делается это просто:

iptables -t nat -A PREROUTING -d ${extip} -p tcp -m tcp --dport ${extport} -j DNAT --to-destination ${localhostip}
iptables -t nat -A POSTROUTING -s ${intnet} -d ${localhostip} -p tcp -m tcp --dport ${intport} -j MASQUERADE

Где:

  • extip – внешний IP адрес.
  • extport – внешний порт.
  • intport – порт сервера в локальной сети.
  • localhostip – IP адрес сервера в локальной сети.
  • intnet – внутренняя подсеть (например, 192.168.0.0/24).

Не добавляйте соответствие интерфейсов (параметр -i) в правило, это сделает Hairpin NAT нерабочим в большинстве случаев!

NAT loopback или Hairpin NAT

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

Прежде всего давайте разберемся, почему вдруг все сломалось, для этого внимательно рассмотрим следующую схему:

Мобильный клиент, с адресом принадлежащим офисной сети, обращается к серверу в этой же сети, но через внешний интерфейс маршрутизатора. Маршрутизатор привычно выполнит DNAT и отправит пакет серверу, который увидит, что адрес источник находится в одной сети с ним и пошлет обратный пакет напрямую, минуя маршрутизатор.

Но клиент устанавливал соединение с узлом 203.0.113.15, а получает пакет от узла 192.168.100.10, такой пакет получит статус INVALID и будет отброшен. Понятно, что ничего работать не будет.

Как избежать этой ситуации? Нужно сделать так, чтобы обратный пакет не отправлялся напрямую клиенту, а был возвращен маршрутизатору, для этого снова используем SNAT. Обратите внимание, что к этому времени пакет уже пройдет цепочку PREROUTING и в критериях нам следует оперировать внутренним адресом и портом назначения.

Правило DNAT при этом не меняется:

iptables -t nat -A PREROUTING -i ens35 -p tcp --dport 443 -j DNAT --to-destination 192.168.100.10

А вот в цепочку POSTROUTING мы добавляем следующее правило:

iptables -t nat -A POSTROUTING  -s 192.168.100.0/24 -d 192.168.100.10 -p tcp --dport 443 -j SNAT --to-source 192.168.100.1

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

Для обратного пакета будет выполнена автоматическая замена на основании таблицы трансляции NAT, и он будет возвращен клиенту с внешнего адреса маршрутизатора, несмотря на то что клиент находится во внутренней сети.

 

image_pdfimage_print

Windows 11 – установка на старый ПК

Способ 1

  • Запускаем программу установки Windows 11 на своём компьютере (из папки или путём создания загрузочного носителя и загрузки с него).
  • В ходе установки появится предупреждение о несоответствии оборудования минимальным системным требованиям.
  • Не закрывая это окно, вызываем командную строку комбинацией клавиш Shift+F10 и вводим в ней команду regedit.  В открывшемся редакторе реестра нужно перейти в ветку HKEY_LOCAL_MACHINE\SYSTEM\Setup и создать в ней новый раздел LabConfig (правая кнопка мыши > «Создать > «Раздел»). 
  • В новом разделе создаём три 32-битных параметра DWORD (правая кнопка мыши «Создать»> «Значение DWORD»). Параметры должны называться так: BypassTPMCheck, BypassRAMCheck и BypassSecureBootCheck. Каждому из них присваиваем значение 1.
  • Выходим из редактора реестра и закрываем командную строку. В окне с предупреждением о несовместимости (оно у нас всё ещё открыто) нажимаем кнопку «Назад» и начинаем процедуру установки заново. В этот раз уведомление о несовместимости появиться не должно.

Три DWORD-параметра, которые создаются в процессе, отключают проверку системой наличия необходимого оборудования: BypassRAMCheck — проверка наличия нужного объёма ОЗУ, BypassTPMCheck — TPM 2.0, а BypassSecureBootCheck — Secure Boot.

https://remontka.pro/windows-11-upgrade-on-unsupported-computer/
https://remontka.pro/windows-11-upgrade-on-unsupported-computer/
https://remontka.pro/upgrade-to-windows-11-22h2-unsupported-pc/

Способ 2

  • Скачать по ссылке внизу архив и распаковать
  • Скачать утилиту Media Creation Tool
  • Используя утилиту, создать ISO-файл с последней версией Windows 11 (можно создать и загрузочную флешку, если вы предполагаете, что она в будущем вам пригодится).
  • Из архива, скачанного на первом шаге, запустите файл
Skip_TPM_Check_on_Dynamic_Update.cmd
  • находящийся в папке bypass Если вы увидите предупреждение о неизвестном издателе, нажмите «Выполнить в любом случае».
  • Смонтируйте созданный ISO образ (правый клик — подключить) или подключите флешку с последней версией Windows Запустите файл setup.exe.
  • Пройдите все шаги установки (будет выполняться копирование файлов, перезагрузки и другие этапы). Не обращаем внимания на то, что в программе установки указано «Windows Server», по факту будет установлена та же версия Windows 11, которая уже есть на вашем компьютере — Home или Pro.

https://github.com/AveYo/MediaCreationTool.bat
Утилита Media Creation Tool

image_pdfimage_print

systemctl основные команды

Посмотреть статус, запустить, поставить в автозагрузку, убрать из автозагрузки, остановить, перечитать конфигурацию, рестартовать сервис

# systemctl status sshd
# systemctl start sshd
# systemctl enabled sshd
# systemctl disabled sshd
# systemctl stop sshd
# systemctl reload sshd
# systemctl restart sshd

Отобразить все активные юниты:

# systemctl list-units
  • UNIT: The systemd unit name
  • LOAD: Whether the unit’s configuration has been parsed by systemd. The configuration of loaded units is kept in memory.
  • ACTIVE: A summary state about whether the unit is active. This is usually a fairly basic way to tell if the unit has started successfully or not.
  • SUB: This is a lower-level state that indicates more detailed information about the unit. This often varies by unit type, state, and the actual method in which the unit runs.
  • DESCRIPTION: A short textual description of what the unit is/does.

Отобразить какие сервисы включены:

# systemctl list-unit-files --state=enabled
UNIT FILE            STATE
arpwatch.service     enabled
atop.service         enabled
auditd.service       enabled
autovt@.service      enabled
chronyd.service      enabled
...

–state={enabled,disabled,static}

# systemctl list-units --all --state=inactive

–state={inactive,active}

Отфильтровать также можно по типу

# systemctl list-units --type=service

–type={service,}

# systemctl list-unit-files

Отобразить Unit файл:

# systemctl cat sshd.service
# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

Посмотреть с чем конфликтует:

# systemctl show sshd -p Conflicts
Conflicts=shutdown.target

 

image_pdfimage_print

OpenEDX – разворачивание системы online курсов

Устанавливаем docker и docker-compose:

# docker -v
Docker version 20.10.17, build 100c701
# docker-compose -v
docker-compose version 1.26.0, build d4451659
# yum install python3-pip
# python3 -V
Python 3.6.8

Open edX от Tutor требует для правильной работы как минимум четырёх записей DNS, основного и трёх поддоменов.

  1. openedu.yourdomain.com (или yourdomain.com): Это основной домен
  2. preview.openedu.yourdomain.com: Судомен для предварительного просмотра страницы или курса перед публикацией
  3. studio.openedu.yourdomain.com: Поддомен для разработки курса
  4. apps.openedu.yourdomain.com

Разворачиваем openedx:
https://docs.tutor.overhang.io/install.html

# yum install git
# git clone https://github.com/overhangio/tutor
# cd tutor
# pip3 install -e .
# pip3 install tutor-mfe
# /usr/local/bin/./tutor plugins enable mfe
# /usr/local/bin/./tutor config save
# /usr/local/bin/./tutor plugins list
mfe 14.0.0
# /usr/local/bin/./tutor local quickstart

Добавляем админ пользователя

# /usr/local/bin/./tutor local createuser --staff --superuser user user@gmail.com

⚠️ Failed to enable plugin 'mfe': plugin 'mfe' is not installed.
==================================================
Interactive platform configuration
==================================================
Are you configuring a production platform? Type 'n' if you are just testing Tutor on your local computer [Y/n] y
Your website domain name for students (LMS) [www.myopenedx.com] openedu.tst-amo.net.ua
Your website domain name for teachers (CMS) [studio.openedu.tst-amo.net.ua]
Your platform name/title [My Open edX] My Open Ring
Your public contact email address [contact@tst-amo.net.ua] user@gmail.com
The default language code for the platform [en]
Activate SSL/TLS certificates for HTTPS access? Important note: this will NOT work in a development environment. [y/N] y
Configuration saved to /home/user/.local/share/tutor/config.yml
Environment generated in /home/user/.local/share/tutor/env
==============================================

https://openedu.tst-amo.net.ua
https://studio.openedu.tst-amo.net.ua

Инсталлируем DEMO курс

# /usr/local/bin/./tutor local importdemocourse

Если нужно изменить порты (как в моем случае, так как на сервере живет nginx, соответственно порт 443 занят им), настройки находятся по адресу:

# /home/user/tutor/tutor/templates/local/docker-compose.prod.yml

меняем значение 443:443 на, например, 8443:443

ports:
- "{{ CADDY_HTTP_PORT }}:80"
{% if ENABLE_HTTPS and ENABLE_WEB_PROXY %}- "8443:443"{% endif %}
environment:

Также нужно открыть новые порты на сервере (у меня Linux) и пробросить на шлюзе (Mikrotik).

Теперь зайти на платформу можно по адресу:

https://openedu.tst-amo.net.ua:8443/
https://studio.openedu.tst-amo.net.ua:8443/

 

 

STUDIO Create Course
https://www.edx.org/course/studiox-creating-a-course-with-edx-studio

MANUAL Create
https://edx.readthedocs.io/projects/open-edx-building-and-running-a-course/en/latest/set_up_course/studio_add_course_information/creating_new_course.html

https://edx.readthedocs.io/projects/edx-installing-configuring-and-running/en/dogwood/front_matter/preface.html

Install edX
https://learn.edtech.ektu.kz/ru/open-edx/install-open-edx-from-tutor

Install Amazon edX
https://blog.lawrencemcdaniel.com/tutor-1-click-installer-open-edx-installation-guide/

Описание процеса создания курса
https://pandia.ru/text/80/110/18993.php

 

image_pdfimage_print

Wake on LAN (WOL) включаем сервер по сети

Понадобилось, в свете последних событий, связанных с отключениями света, настроить автоматическое выключение и включение сервера. Бесперебойник обычный – не smart, поэтому програмную часть берем на себя. Логика простая и зависит от нескольких условий:

  1. если устройство-цель (лучше несколько) в сети не отвечает то выключаем сервер, например через 3-5 минут
  2. если устройство-цель в сети появилось, то после некоторой задержки (мало ли) включаем сервер

Для этого настраиваем mikrotik и готовим сервер.

Алгоритм:

  • Создаем скрипт
  • Подключаем Планировщик

System –> Script –> New (например check_power_TST)

:local m; :set $m "$[ /ping count=5 192.168.1.55 ]"; :put $m;
:if ($m > 3) do={ /tool wol interface=bridge mac=54:04:A6:35:A3:B6 }

:local m – назначаем локальную переменную
:set – значением которой будет результат выполнения команды ping
:put – вывести в консоль (это для проверки, потом убрать)
:if – условие, если оно совпадает, то выполнить “do” – разбудить наш сервер

System –> Sheduler –> New

На сервере в cron прописан скрипт, который мониторит наличие в сети хоста. Если хост не в сети (пропало питание)  выключить ПК.

# crontab -l
...
*/3 * * * * /home/svm/bin/shutdown.sh >/dev/null 2>&1
...
# cat shutdown.sh
#!/bin/bash
ip=192.168.1.55
ping_cmd="/usr/bin/ping -c 3 $ip > /dev/null 2>&1"
eval $ping_cmd

if [[ $? != 0 ]];
   then /usr/sbin/shutdown -h now
fi

Здесь, если не успешное [[ $? != 0 ]] выполнение команды ping (т.е. хост не доступен) запускает выключение сервера.

Можно воспользоваться на время тестирования скриптом, и меняя значение ip проверить поведение

#!/bin/bash
#If ping not saccess do shutdown tst

ip=192.168.1.55
ping_cmd="/usr/bin/ping -c 3 $ip > /dev/null 2>&1"
eval $ping_cmd

if [[ $? = 0 ]]; 
   then echo The Host $ip is UP!
   else echo ALARM! The Host $ip is DOWN!
fi

Также можно добавить уведомления в Telegram

image_pdfimage_print

Wake on LAN (WOL) включаем сервер по событию

После очередного обновления перестала работать функция Wake On Lan. Исправляем.

# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
# uname -rs
Linux 3.10.0-1160.76.1.el7.x86_64

Устанавливаем драйвер:

# yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
# yum install kmod-r8168

Перегружаемся и проверяем:

# dmesg | grep r8168
[ 7.850104] r8168: loading out-of-tree module taints kernel.
[ 7.851506] r8168: module verification failed: signature and/or required key missing - tainting kernel
[ 7.853522] r8168 Gigabit Ethernet driver 8.049.02-NAPI loaded
[ 7.853651] r8168 0000:06:00.0: irq 32 for MSI/MSI-X
[ 7.854990] r8168: This product is covered by one or more of the following patents: US6,570,884, US6,115,776, and US6,327,625.
[ 7.854997] r8168 Copyright (C) 2021 Realtek NIC software team <nicfae@realtek.com>
[ 20.125358] r8168: enp6s0: link up

Создаем сервис:

# vi /etc/systemd/system/wol.service
[Unit]
Description=Configure Wake On LAN
After=network.target

[Service]
Type=oneshot
ExecStart=/sbin/ethtool -s enp6s0 wol g

[Install]
WantedBy=basic.target

На зарубежных форумах пишут, что сейчас работает только с nmcli:

# nmcli c modify "enp6s0" 802-3-ethernet.auto-negotiate yes
# nmcli con sh enp6s0 | grep wake
802-3-ethernet.wake-on-lan: magic
802-3-ethernet.wake-on-lan-password: --

Применяем и рестартуем сервис:

# systemctl daemon-reload
# systemctl enable wol
# systemctl start wol

Перегружаем систему для чистоты эксперимента

# reboot

Проверяем логе загрузки:

# journalctl -b
....
pci 0000:06:00.0: PME# supported from D0 D1 D2 D3hot D3cold
pci 0000:06:00.0: 2.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s x1 link at 0000:00:1c.3 (capable of 7.876 Gb/s wit
....

Смотрим здесь:

# cat /proc/acpi/wakeup
Device S-state Status Sysfs node
PS2K S4 *enabled pnp:00:04
PS2M S4 *disabled
UAR1 S4 *disabled pnp:00:05
BR20 S3 *disabled
EUSB S4 *enabled pci:0000:00:1d.0
USBE S4 *enabled pci:0000:00:1a.0
P0P1 S4 *disabled pci:0000:00:01.0
P0P2 S4 *disabled
P0P3 S4 *disabled
P0P4 S4 *disabled
PEX0 S4 *disabled pci:0000:00:1c.0
PEX1 S4 *disabled pci:0000:00:1c.1
PEX2 S4 *disabled pci:0000:00:1c.2
BR14 S4 *disabled pci:0000:04:00.0
PEX3 S4 *disabled pci:0000:00:1c.3
PEX4 S4 *disabled pci:0000:00:1c.4
PEX5 S4 *disabled pci:0000:00:1c.5
PEX6 S4 *disabled
PEX7 S4 *disabled
# cat /sys/bus/pci/devices/0000:06:00.0/power/wakeup
enabled

Теперь можно включить сервер по сети с любого ПК или (как у меня автоматически) с роутера.

https://bugs.centos.org/view.php?id=16486
https://elrepo.org/tiki/HomePage
https://snapcraft.io/install/acpi-tools/centos

 

image_pdfimage_print

Wake on Lan (WOL)

Устанавливаем пакет:

# yum install wol
# wol -V
wol 0.7.1

Проверяем поддержку сетевой этого механизма:

# nmcli c show enp6s0 | grep -i wake
802-3-ethernet.wake-on-lan: magic
802-3-ethernet.wake-on-lan-password: --
# ethtool enp6s0
Settings for enp6s0:
        Supported ports: [ TP MII ]
        Supported link modes: 10baseT/Half 10baseT/Full
                              100baseT/Half 100baseT/Full
                              1000baseT/Half 1000baseT/Full
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Supported FEC modes: Not reported
        Advertised link modes: 10baseT/Half 10baseT/Full
                               100baseT/Half 100baseT/Full
                               1000baseT/Half 1000baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Advertised FEC modes: Not reported
        Link partner advertised link modes: 10baseT/Half 10baseT/Full
                                            100baseT/Half 100baseT/Full
                                            1000baseT/Half 1000baseT/Full
        Link partner advertised pause frame use: No
        Link partner advertised auto-negotiation: Yes
        Link partner advertised FEC modes: Not reported
        Speed: 1000Mb/s
        Duplex: Full
        Port: MII
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: pumbg
        Wake-on: g
        Current message level: 0x00000033 (51)
                               drv probe ifdown ifup
        Link detected: yes

По man-у:

              p   Wake on PHY activity
              u   Wake on unicast messages
              m   Wake on multicast messages
              b   Wake on broadcast messages
              a   Wake on ARP
              g   Wake on MagicPacket™
              s   Enable SecureOn™ password for MagicPacket™
              d   Disable (wake on nothing).   This  option  clears  all
                  previous options.
image_pdfimage_print

Примеры использования QoS

Равномерное распределение ширины канала между потребителями

Настроим возможность делить скорость между потребителями равномерно, т. е. 1 пользователь сможет делать загрузку со скоростью 300 Мбит/с, 2 пользователя – со скоростью 150 Мбит/с, 5 пользователя – со скоростью 60 Мбит/с и т. д. При этом, если одному пользователю будет нужно только 170 Мбит/с, а еще двоим по 80 Мбит/с, то первому достанется достанется именно 170 Мбит/с (т. к. это больше чем 1/3 от 300 Мбит/с), а двум другим достанется оставшийся канал поровну, т. е. по 65 Мбит/с.

/queue simple add max-limit=300M/300M name="Internet download/upload limit" queue=pcq-upload-default/pcq-download-default target=192.168.1.0/24

https://mikrotik.wiki/wiki/%D0%9F%D1%80%D0%BE%D1%87%D0%B5%D0%B5:%D0%9E%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D0%BE%D1%80%D0%BE%D1%81%D1%82%D0%B8_%D0%B8_%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%8B_%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB%D0%B0

image_pdfimage_print

VLAN на роутере

Алгоритм

  • Создание Bridge
  • Создание VLAN
  • Добавление портов в Bridge
  • Определение тегированный (trunk) и нетегированный (access) порт
  • Настройка локальной сети для VLAN
  • Настройка DHCP сервера для VLAN

Bridge→Bridge

/interface bridge
add admin-mac=AA:AA:E7:78:04:D7 auto-mac=no name=Bridge vlan-filtering=yes

Interfaces→VLAN

/interface vlan
add interface=Bridge name=Bridge-Vlan10 vlan-id=10
add interface=Bridge name=Bridge-Vlan20 vlan-id=20
add interface=Bridge name=Bridge-Vlan30 vlan-id=30

Bridge→Ports

/interface bridge port
add bridge=Bridge interface=ether2 pvid=10
add bridge=Bridge interface=ether3 pvid=20
add bridge=Bridge interface=ether4 pvid=30

Bridge→VLANs

/interface bridge vlan
add bridge=Bridge tagged=Bridge untagged=ether2 vlan-ids=10
add bridge=Bridge tagged=Bridge untagged=ether3 vlan-ids=20
add bridge=Bridge tagged=Bridge untagged=ether4 vlan-ids=30

IP→Addresses

/ip address
add address=192.168.1.1/24 interface=Bridge-Vlan10 network=192.168.1.0
/ip address
add address=10.20.20.1/24 interface=Bridge-Vlan20 network=10.20.20.0
/ip address
add address=10.30.30.1/24 interface=Bridge-Vlan30 network=10.30.30.0

IP→DHCP Server→DHCP

/ip dhcp-server
add address-pool=Pool-LAN-10 disabled=no interface=Bridge-Vlan10 lease-time=\
1d name=DHCP-LAN-10
/ip dhcp-server
add address-pool=Pool-LAN-20 disabled=no interface=Bridge-Vlan20 lease-time=\
1d name=DHCP-LAN-10
/ip dhcp-server
add address-pool=Pool-LAN-30 disabled=no interface=Bridge-Vlan30 lease-time=\
1d name=DHCP-LAN-30

 

image_pdfimage_print

Логирование событий на удаленный сервер rsyslog

System–>Logging–>Actions–>New Action

Type – remote

Remote Address – IP сервера syslog

Потом делаем новый Rules

В поле Topics выбираем события какие мы хотим логировать, в поле Action выбираем наш созданный action.

На стороне сервера нужно отредактировать rsyslog.conf, раскоментировав следующие строки:

# vi /etc/rsyslog.conf

# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

и создать конфигурационный файл, в котором пропишем путь для отдельного файла лога, что бы события не писались или дублировались в /var/log/messages:

# vi /etc/rsyslog.d/mikrotik.conf

$template FILENAME,"/var/log/mikrotik/%fromhost-ip%/syslog.log" 
if $fromhost-ip != '127.0.0.1' then ?FILENAME 
& stop

Проверить firewall на предмет открытия 514 udp порта.

После этого

# systemctl restart rsyslog

И можно наблюдать события

# less /var/log/mikrotik/192.168.1.1/syslog.log

Настроим ротацию логов:

# cat /etc/logrotate.d/mikrotik 
/var/log/mikrotik/*/*.log {
        weekly
        rotate 12
        compress
        olddir /var/log/mikrotik/old
        missingok
        notifempty
        create 0644 root root
}

Проверим

# /usr/sbin/logrotate -d /etc/logrotate.conf 2> /tmp/logrotate.debug

Ротация логов будет осуществляться еженедельно, во всех директориях, хранится будет хранится 12 сжатых архивов, директория для хранения /var/log/mikrotik/old.

image_pdfimage_print