Как стать автором
Обновить
0
0

Пользователь

Отправить сообщение

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

ip/route/print where gateway="containers" 
Flags: D - DYNAMIC; A - ACTIVE; c - CONNECT
Columns: DST-ADDRESS, GATEWAY, DISTANCE
    DST-ADDRESS    GATEWAY     DISTANCE
DAc 172.20.0.0/24  containers         0
ipv6/route/print where gateway="containers"
Flags: D - DYNAMIC; X - DISABLED, I - INACTIVE, A - ACTIVE; c - CONNECT, s - STATIC
Columns: DST-ADDRESS, GATEWAY, DISTANCE
#     DST-ADDRESS           GATEWAY     DISTANCE
  DAc fd08:172:20::/64      containers         0
  DAc fe80::%containers/64  containers         0

Ну а дальше мы просто создаём WG интерфейсы и пиры для каждого inbound в контейнере

/interface wireguard
add listen-port=13233 mtu=1420 name=VLESS-WG private-key="секрет"
add listen-port=13234 mtu=1420 name=WARP-WG private-key="секрет"
/interface wireguard peers
add allowed-address=0.0.0.0/0,::/0 endpoint-address=172.20.0.2 endpoint-port=3126 interface=VLESS-WG name=peer4 public-key="секрет" 
add allowed-address=0.0.0.0/0,::/0 endpoint-address=172.20.0.2 endpoint-port=3125 interface=WARP-WG name=peer5 public-key="секрет"

создаём таблицы маршрутизации

/routing table 
add disabled=no fib name=vless
add disabled=no fib name=warp

Добавляем dummy lookup rule (возможно в актуальных версиях ROS уже не нужно, раньше без этого ipv6 маршрутизация не работала)

/routing rule
add action=lookup disabled=no interface=WARP-WG routing-mark=warp table=warp
add action=lookup disabled=no interface=VLESS-WG routing-mark=vless table=vless

Добавляем маскарадинг

/ip firewall nat
add action=masquerade chain=srcnat comment="WARP-WG masq" out-interface=WARP-WG
add action=masquerade chain=srcnat comment="VLESS-WG masq" out-interface=VLESS-WG
/ipv6 firewall nat
add action=masquerade chain=srcnat comment="WARP-WG masq" out-interface=WARP-WG
add action=masquerade chain=srcnat comment="VLESS-WG masq" out-interface=VLESS-WG

Дальше нам нужно повесить на интерфейсы WG какие-нибудь IP адреса, любые, из приватного диапазона(по ним будет идти маршрутизация только до приложения в контейнере). Например так. Опять же, в целом можно без этого, т.к. маршрутизировать мы будет тупо по интерфейсу, но некрасиво.

/ip address 
add address=172.19.0.2 interface=WARP-WG network=172.19.0.2
add address=172.19.0.3 interface=VLESS-WG network=172.19.0.3
/ipv6 address
add address=fd08:172:19::3/128 advertise=no interface=VLESS-WG no-dad=yes
add address=fd08:172:19::2/128 advertise=no interface=WARP-WG no-dad=yes

Наконец добавляем правила, по которым траффик будет заворачиваться в соотв. таблицу маршрутизации

/ip firewall mangle
add action=mark-routing chain=prerouting comment=VLESS dst-address-list=vless new-routing-mark=vless passthrough=yes routing-mark=!vless
add action=mark-routing chain=prerouting comment=WARP dst-address-list=warp new-routing-mark=warp passthrough=yes routing-mark=!warp
/ipv6 firewall mangle
add action=mark-routing chain=prerouting comment=VLESS dst-address-list=vless new-routing-mark=vless passthrough=yes routing-mark=!vless
add action=mark-routing chain=prerouting comment=WARP dst-address-list=warp new-routing-mark=warp passthrough=yes routing-mark=!warp

Здесь мы отправляем всё, что будет в соотв. адрес листе в соотв. ему таблицу маршрутизации. Если нужно заворачивать несколько адрес листов в один интерфейс или как-то более гибко рулить всем этим безобразием - можно добавить свои цепочки и делать в них jump. Напр. как-то так:

/ipv6 firewall mangle
add action=mark-connection chain=prerouting_warp comment="WARP_chain" dst-address-list=!vpnexclude new-connection-mark=warp
add action=mark-routing chain=prerouting_warp comment="WARP_chain" dst-address-list=!vpnexclude new-routing-mark=warp passthrough=yes
add action=jump chain=prerouting comment=WARP dst-address-list=youtube jump-target=prerouting_warp routing-mark=!warp
add action=jump chain=prerouting comment=WARP dst-address-list=facebook jump-target=prerouting_warp routing-mark=!warp

В этом примере я создал для ipv6 отдельную цепочку prerouting_warp, в которой заворачиваю траффик в таблицу warp и помечаю соединение(можно собрать любое количество нужных правил). При этом проверяю, что коннект не идёт на адреса из списка, подключение до которых ни в коем случае не должно происходить через VPN - в качестве защиты от своих кривых рук. Ну и дальше двумя правилами закидываю в эту цепочку траффик для адресс листов youtube и facebook. Можно так, можно как в предыдущем примере - в зависимости от подхода и решаемой задачи. Как больше нравится и как удобнее.

Ну и вишенкой на торте - создаём маршруты в дикий интернет для наших новых таблиц маршрутизации

/ip route
add comment=WARP disabled=no distance=1 dst-address=0.0.0.0/0 gateway=WARP-WG routing-table=warp
add comment=VLESS disabled=no distance=1 dst-address=0.0.0.0/0 gateway=VLESS-WG routing-table=vless
/ipv6 route
add comment=WARP disabled=no distance=1 dst-address=2000::/3 gateway=WARP-WG routing-table=warp
add comment=VLESS disabled=no distance=1 dst-address=2000::/3 gateway=VLESS-WG routing-table=vless

Так уже же выложил. Посмотрите переписку чуть выше.

"listen": "172.20.0.2",

где 172.20.0.2 - это ip, который мы назначили на veth, к которому присоединён контейнер.

Наверное заработает, я лично не пробовал. Проблем вижу две - во первых, банально сложнее дебажить, т.к. даже шелл внутри контейнера с xray-core не открывается, уж не знаю почему). А во-вторых, dokodemo-door - это в любом случае один интерфейс, соотв. мы можем иметь только один аутбаунд(если не морочиться с маршрутами на уровне самого xray). А вот WG-интерфейсов можно наплодить сколь угодно много. Простота, единообразие, и возможность при минимальном изменении конфига утащить контейнер куда угодно(хоть на другой комп в ЛВС, хоть на удалённую площадку). При этом в приложении к использованию дома я вообще не вижу никакого пенальти по производительности(скорее всего если начать пытаться рулить сотнями одновременных подключений и гигабитными каналами разница вылезет, но у кого есть реально такие задачи - тот точно не будет разворачивать сервис в недодокере на роутере)

Хех. Лично мне больше понравился n1, как-то он для дома выглядит покомпактнее. Хотя если нужен хотсвап дисков - n2 конечно лучше. И если честно - не вижу смысла в спец ОС для NAS, по крайней мере в приложении к домашней хранилке. Обычный дебиан справится не хуже.

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

    {
      "listen": "172.20.0.2",
      "port": 3125,
      "protocol": "wireguard",
      "settings": {
        "mtu": 1420,
        "secretKey": "PrivkeyB",
        "peers": [
          {
            "privateKey": "PrivkeyA",
            "publicKey": "PubkeyA",
            "allowedIPs": [
              "0.0.0.0/0",
              "::/0"
            ],
            "keepAlive": 0
          }
        ],
        "kernelMode": false
      },
      "streamSettings": null,
      "tag": "inbound-172.20.0.2:3125",
      "sniffing": {
        "enabled": false,
        "destOverride": [
          "http",
          "tls",
          "quic",
          "fakedns"
        ],
        "metadataOnly": false,
        "routeOnly": false
      }
    }
/interface/wireguard/print                 
Flags: X - disabled; R - running 

 4  R name="WARP-WG" mtu=1420 listen-port=13234 private-key="PrivkeyA" 
      public-key="PubkeyA" 

/interface wireguard peers
add allowed-address=0.0.0.0/0,::/0 endpoint-address=172.20.0.2 endpoint-port=3125 interface=WARP-WG name=peer5 public-key=\
    "PubkeyB"

При этом на самом деле PrivkeyA в конфиге сервера по большому счёту не должен быть нужен, не знаю зачем он его хранит - может это последствия генерации конфига через x-ui. Короче общая логика тут крест-накрест. С каждой стороны(и на сервере и на клиенте) есть конфиг интерфейса WireGuard, где живёт приватный ключ. К нему будут подключаться с публичным ключём те, у кого сконфигурен соотв. пир. И есть конфига пира с публичным ключом, к котому он сам в свою очередь будет подключаться. По сети идёт обмен именно публичными ключами, которые сравниваются с приватными.

Скопирую сюда свой постик на другом ресурсе

На микроте ставим пакет с контейнерами, ребутаемся, включаем контейнеры /system/device-mode/update container=yes На железке после этого нужно будет нажать кнопку mode за ограниченное время, удалённо включить контейнеры не выйдет, т.к. потанцевальная дыра в безопасности. Дальше создаём VETH для нашего контейнера, создаём отдельный бридж для контейнеров, навешиваем туда ip адреса(я тут добавляю и ipv6 и ipv4 адрес. На самом деле для схемы с роутингом через WG интерфейс достаточно только v4, но у меня все контейнеры настроены единообразно, так что для общего понимания оставлю)

/interface/veth/add address=172.20.0.2/24,fd08:172:20::2/64 gateway=172.20.0.1 gateway6=fd08:172:20::1 name=xray_eth
/interface/bridge/add name=containers
/interface/bridge/port/add bridge=containers interface=xray_eth
/ip/address/add address=172.20.0.1/24 interface=containers interface=xray_eth
/ip/firewall/nat/add action=masquerade chain=srcnat comment="from containers masq" out-interface-list=WAN src-address=172.20.0.0/24
/ipv6/address/add address=fd08:172:20::1 interface=containers
/ipv6/firewall/nat/
add action=masquerade chain=srcnat comment="from containers masq" out-interface-list=WAN src-address=fd08:172:20::/64
add action=masquerade chain=srcnat comment="to containers masq" out-interface=containers
/ipv6/firewall/filter/add action=accept chain=forward comment="Allow Containers" out-interface-list=WAN src-address=fd08:172:20::/64

Последние два правила если что рождены в попытке заставить работать схему с byeDPI, для xray это тоже не нужно(при условии что вы отправляете траффик на ipv4 адрес. Если у вас ipv6-only VPS - то нужно, всё нужно) Дальше втыкаем в микрот флешку, из интерфейса форматируем её в EXT4(Обязательно! Иначе при распаковке контейнера порушатся разрешения фалов и ничего не взлетит) Конфигурим местный докер

/container/config/set ram-high=384.0MiB registry-url=https://ghcr.io/ tmpdir=usb1/pull

Аттеншн! Тут ram-high=384.0MiB - это конфиг для AX3 с гигом оперативы. У AС3 её всего 256Мб и с пустым конфигом и установленным пакетом wifi-qcom доступно примерно 145Мб(а с подробным конфигом и под нагрузкой - что-то около 70Мб). У AC2(128Мб) при таких же вводных доступно и того меньше - всего примерно 30Мб. Для AC2 вероятно придётся вообще перейти на легаси Wifi драйвер, иначе с ресурсами ну совсем грустно. Соотв. выставляем параметр с запасом, так чтоб и самому роутеру хватило. При превышении лимита процессы в контейнере начнут нещадно троттлиться, т.е. работать будет, но с дикими тормозами. А вот если память у роутера закончится - скорее всего он тупо крашнется. Не доводим и не включаем старт контейнера при загрузке пока не отладим всё. Скачиваем образ

/container/add comment=xray-core remote-image=xtls/xray-core:main interface=veth1 root-dir=usb1/xray/store

После этого можно попробовать его стартануть и убедиться что всё найс и ничего не сыпется. Дальше нужно приготовить конфигу xray (файлик config.json) Либо выдёргиваем его из /usr/local/x-ui/bin/config.json (не с сервера разумеется, а с заранее где-то настроенной клиентской инсталляции x-ui. В самом конфиге придётся поправить ip-шники при этом, очевидно), либо пишем ручками. Должно получиться что-то такое

{
  "log": {
    "access": "none",
    "dnsLog": false,
    "error": "./error.log",
    "loglevel": "error"
  },
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "inboundTag": [
          "api"
        ],
        "outboundTag": "api"
      },
      {
        "type": "field",
        "ip": [
          "geoip:private",
          "192.168.88.0/24"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "geoip:ru"
        ],
        "outboundTag": "warp"
      },
      {
        "type": "field",
        "protocol": [
          "bittorrent"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "inboundTag": [
          "inbound-172.20.0.2:3125"
        ],
        "outboundTag": "warp"
      },
      {
        "type": "field",
        "inboundTag": [
          "inbound-172.20.0.2:3126"
        ],
        "outboundTag": "VLESS-VPS"
      }
    ]
  },
  "dns": null,
  "inbounds": [
    {
      "listen": "172.20.0.2",
      "port": 3126,
      "protocol": "wireguard",
      "settings": {
        "mtu": 1420,
        "secretKey": "секрет",
        "peers": [
          {
            "privateKey": "секрет",
            "publicKey": "секрет",
            "preSharedKey": "секрет",
            "allowedIPs": [
              "0.0.0.0/0",
              "::/0"
            ],
            "keepAlive": 0
          }
        ],
        "kernelMode": false
      },
      "streamSettings": null,
      "tag": "inbound-172.20.0.2:3126",
      "sniffing": {
        "enabled": false,
        "destOverride": [
          "http",
          "tls",
          "quic",
          "fakedns"
        ],
        "metadataOnly": false,
        "routeOnly": false
      }
    },
    {
      "listen": "172.20.0.2",
      "port": 3125,
      "protocol": "wireguard",
      "settings": {
        "mtu": 1420,
        "secretKey": "секрет",
        "peers": [
          {
            "privateKey": "секрет",
            "publicKey": "секрет",
            "allowedIPs": [
              "0.0.0.0/0",
              "::/0"
            ],
            "keepAlive": 0
          }
        ],
        "kernelMode": false
      },
      "streamSettings": null,
      "tag": "inbound-172.20.0.2:3125",
      "sniffing": {
        "enabled": false,
        "destOverride": [
          "http",
          "tls",
          "quic",
          "fakedns"
        ],
        "metadataOnly": false,
        "routeOnly": false
      }
    }
  ],
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "AsIs"
      }
    },
    {
      "tag": "blocked",
      "protocol": "blackhole",
      "settings": {}
    },
    {
      "tag": "VLESS-VPS",
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "секрет",
            "port": 443,
            "users": [
              {
                "id": "секрет",
                "flow": "xtls-rprx-vision",
                "encryption": "none"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "reality",
        "realitySettings": {
          "publicKey": "секрет",
          "fingerprint": "chrome",
          "serverName": "популярный.хост.близко.к.VPS",
          "shortId": "секрет",
          "spiderX": "/"
        },
        "tcpSettings": {
          "header": {
            "type": "none"
          }
        }
      }
    },
    {
      "tag": "warp",
      "protocol": "wireguard",
      "settings": {
        "mtu": 1420,
        "secretKey": "секрет",
        "address": [
          "172.16.0.2/32",
          "секрет"
        ],
        "workers": 2,
        "domainStrategy": "ForceIP",
        "reserved": [
          166,
          231,
          19
        ],
        "peers": [
          {
            "publicKey": "секрет",
            "allowedIPs": [
              "0.0.0.0/0",
              "::/0"
            ],
            "endpoint": "список известных хостов и портов есть в сети. Подберите тот, что будет работать для вас",
            "keepAlive": 0
          }
        ],
        "kernelMode": false
      }
    }
  ],
  "transport": null,
  "policy": {
    "levels": {
      "0": {
        "statsUserDownlink": true,
        "statsUserUplink": true
      }
    },
    "system": {
      "statsInboundDownlink": true,
      "statsInboundUplink": true,
      "statsOutboundDownlink": true,
      "statsOutboundUplink": true
    }
  },
  "api": {
    "tag": "api",
    "services": [
      "HandlerService",
      "LoggerService",
      "StatsService"
    ]
  },
  "stats": {},
  "reverse": null,
  "fakedns": null,
  "observatory": null,
  "burstObservatory": null
}

Тут у меня конфига на два входа и к ним два выхода - в WARP и в свой VLESS VPN Подкидываем эту конфигу на флешку по пути /usb1/xray/ Добавляем маунт поинт и привязываем его к контейнеру

/container/mounts/add dst=/etc/xray/config.json name=xray_config src=/usb1/xray/config.json
/container/set mounts=xray_config [ /container/find comment=xray-core ]

После чего можно рестартовать контейнер.

Всё, дальше совсем легко. Любым удобным способом настраиваем Wireguard подключения к нашему контейнеру, добавляем таблицы маршрутизации, настраиваем удобный нам вариант заворота траффика. Мануалов про эту часть в сети полно.

ИМХО xray удобнее цеплять через wireguard. Xray поддерживает его в качестве инбаунда и не нужен второй контейнер. Особенно актуально становится когда в xray заведено несколько профилей VPN, тогда вместо 2+ доп. контейнеров просто добавляем нужное количество входных wireguard интерфейсов и настраиваем маршрутизацию 1к1 по выходным интерфейсам. Да, wireguard туннель, не выходящий за пределы роутера выглядит довольно странным решением, но это работает, потерь по производительности нет а по ресурсам гораздо выгоднее.

Сам. Это проще чем может показаться. В том же Solidworks есть шикарная встроенная обучалка, которая позволит сносно моделить уже через несколько дней. Тонкости оформления чертежей по ЕСКД оно конечно не раскроет - но оно нам и не надо). И если есть навыки обращения со штангенциркулем - всё обязательно получится.

Проблема именно в том что пробовал, потому и осуждаю. В несостоятельности термоклея вы можете убедиться самостоятельно, вплавив в клеевой стержень резьбовую втулку, вкрутив винт и выдернув оную втулку буквально от руки( в крайнем случае пассатижами если нет удобного длинного винта под рукой, но точно не прикладывая особых усилий). Если у вас ваши методы работают долгие годы - вы вероятно либо очень везучий человек, либо просто не сталкивались со случаями, когда крепление петель идёт недоделанным с завода, либо когда в силу уронения об кафель родным посадкам наступает полный и безотлагательный карачун. Волею случая на этих выходных у жены сломалась петля на её MSI b4 modern(как раз вариант с изначально некомпетентной конструкцией).

Как можно заметить на фото - спасать тупо нечего, крепление уничтожено

https://imgur.com/a/cwgtY6q

Поэтому на помощь приходит её величество переходная пластина(благо модель я сохранил. Правая петля отлетела спустя 5 месяцев после покупки и после ремонта живёт уже третий год)

https://imgur.com/a/shi66qy

Перфорация нужна для увеличения площади контакта с клеевой массой.

Зачищаем от ошмётков родных креплений, вклеиваем по месту на благословенный двухкомпонентный поксипол и о чудо - держится даже на двух винтах из четырёх и никуда не убегает.

https://imgur.com/a/AgNY5at

Да, знаю, не аккуратно, заляпал материнку(которую обломался скидывать), но для себя - не страшно.

Как бонус - заменяем ножку на распечатку, которая тоже треснула в момент подрыва петли.

https://imgur.com/a/aVXGwm2

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

Я натурально зарегался чтобы ответить, до сего дня мне было полностью ОК в RO режиме. Термоклей - это очень, очень плохой способ ремонта, даже самые жёсткие его сорта не имеют достаточной жёсткости для удержания вплавляемых резьбовых вставок м2-м2.5(а именно такие и применяют в ноутбуках). Впрочем, эпоксидка так же не походит. Есть ровно один хороший способ ремонта таких поломок - зачистка площадки от остатков заводских креплений и создание переходной пластины. Вариантов тут много, самый простой путь - печать на 3D принтере под размеры конкретного ноута из PETG, в которую будут вплавлены родные или новые(в зависимости от ушатанности) вставки. При его отсутствии - можно отрезать от куска АБС подходящей толщины, можно даже нарезать резьбы в латунной пластинке, зависит от фантазии и наличия материалов. И дальше эта пластина по всей площади вклеивается в корпус и в неё уже прикручивается петля. Ну а то что делает ТС в подавляющем большинстве случаев развалится через несколько дней либо требует сильного прослабления затяжки петель.

Информация

В рейтинге
5 982-й
Зарегистрирован
Активность