Создайте свой собственный сервер ретрансляции DERP, и с этого момента Tailscale будет работать гладко.
Создайте свой собственный сервер ретрансляции DERP, и с этого момента Tailscale будет работать гладко.

Оригинальная ссылка 🔗 https://fuckcloudnative.io/posts/custom-derp-servers/

👉Предыдущая статьяПредставлено, как использовать Headscale заменять Tailscale Официальный сервер управления и доступ к клиентам на различных платформах. В этой статье будет рассказано, как сделать Tailscale Использовать пользовательские DERP Серверы. Возможно, многие люди не знают DERP да Какого черта?,Это не имеет значения,Я начну ссервер ретрансляцииНачни говорить。

Что такое СТАН

Tailscale изконечная цельда Пусть двоегде угодно в сетииз Настройка машинысоединение «точка-точка»(прямое соединение),Но реальный мир сложен,В большинстве случаев машина находится NAT и за брандмауэром, в это время необходимо добиться прямого соединения путем сверления отверстий, т.е. NAT проникнуть.

NAT в соответствии с Поведение сопоставления NATиПоведение брандмауэра с отслеживанием состоянияМожетразделен многих типов, но для NAT С глубокой точки зрения вам не нужно заботиться о таком количестве типов, вам просто нужно посмотреть на NAT Или межсетевой экран с отслеживанием состояния будет строго проверять цели Endpoint,По этому фактору,Может Воля NAT разделен на Easy NAT и Hard NAT

  • Easy NAT и его варианты называются “Endpoint-Independent Mapping” (EIM, независимое сопоставление конечных точек) Вот Endpoint относится к цели Endpoint,То есть, да,Пока брандмауэр с отслеживанием состояния видит, что клиент инициирует исходящий пакет,,Соответствующему входящему пакету будет разрешен вход.,Не имеет значения, кто отправил этот входящий пакет.
  • hard NAT и варианты, называемые “Endpoint-Dependent Mapping”(EDM, сопоставление, зависящее от конечной точки) Этот вид NAT для каждой цели Endpoint Чтобы создать соответствующее отношение отображения. существует такое из устройства, если клиент до определенной цели Endpoint Инициировал исходящий пакет, предполагая, что публичная сеть клиента IP да 2.2.2.2, то межсетевой экран с отслеживанием состояния откроет порт, предполагая, что да 4242. тогда только из этой цели Endpoint Только входящие пакеты 2.2.2.2:4242,Другие клиенты не допускаются。Этот вид NAT Более строгий, так это называется Hard NAT。

для Easy NAT, нам нужно только предоставить стороннюю службу, которая может сообщить клиенту «публичную сеть, которую он видит». ip:port что такое", а затем эта информация каким-то образом сообщается узлу связи (пиру), и последний знает, по какому адресу устанавливать соединение! вид услуга называется STUN (Session Traversal Utilities for NAT, приложение для обхода сеанса NAT). Его рабочий процесс показан ниже:

  • блокнот для STUN Сервер отправляет запрос: «С вашей точки зрения,Какой адрес у моего? "
  • STUN Сервер возвращает ответ: «Я видел ваш UDP Сумкада Приходите с этого адресаиз:ip:port”。

Что такое реле

для Hard NAT Например, СТАН Это не сработает, даже если STUN Получил публичную сеть клиента ip:port Сообщение узлу связи не поможет, потому что брандмауэр не работает. STUN Разрыв открывается только общением. Этот разрыв позволяет только. STUN Входящие пакеты поступают, а другие коммуникационные узлы не могут войти, даже если знают об этом разрыве. Обычно уровень предприятия NAT Все принадлежат Hard NAT。

В этом случае сверлить дыры нельзя, но и сдаваться нельзя. Можно выбрать компромиссный метод: создать сервер ретрансляции (сервер ретрансляции), клиент связывается с сервером ретрансляции, а сервер ретрансляции затем отправляет пакет Relay. к партнеру связи.

Что касается работоспособности реле, то она зависит от конкретной ситуации:

  • Если вы можете подключиться напрямую, очевидно, нет необходимости использовать реле;
  • Но если вы не можете подключиться напрямую,Путь ретрансляции очень близок к реальному пути прямой связи между двумя сторонами.,И пропускная способность достаточно большая,Релейный метод существенно не ухудшит качество связи. Задержка определенно немного увеличится,Пропускная способность займет некоторое время,ноПо сравнению с отсутствием возможности подключения вообще, это все еще приемлемо.

фактическидля Для большинства сетей,Tailscale Успешно можно просверлить отверстия с помощью различных черных технологий. Лишь в редких случаях вы выберете реле – это всего лишь разновидность. fallback механизм.

Введение в протокол реле

Существует множество способов реализации протоколов ретрансляции.

TURN

TURN означает «Обход с использованием реле вокруг NAT». Это классический метод реализации реле. Основная концепция:

  • пользователь(люди)Сначала зайдите в общедоступный Интернетиз TURN Аутентификация сервера, после успеха последний сообщит вам: «Я назначил ip:port,Далее Воля будет ретранслировать трафик за вас»,
  • Затем сообщите собеседнику IP-адрес порта Воли.,Пусть он подключится к этому адресу,Следующий шаг — рассмотреть очень простую модель связи клиент/сервер.

В отличие от STUN, этот протокол не обладает реальной интерактивностью и не очень прост в использовании, поэтому Tailscale не использует TURN в качестве протокола ретрансляции.

DERP

DERP расшифровывается как Detoured Encrypted Routing Protocol, протокол, разработанный Tailscale:

  • этодаодинОбщая цель из протокола ретрансляции пакетов, работающая под управлением HTTP выше,И большинство сетей поддерживают HTTP-Коммуникабельный.
  • Он передает зашифрованные полезные данные на основе открытого ключа места назначения.

Tailscale автоматически выберет сервер DERP, ближайший к целевому узлу, для ретрансляции трафика.

Tailscale интересен при использовании алгоритма из,Все соединения между клиентами выбираются в первую очередь DERP режим (режим реле), что означает, что соединение устанавливается немедленно (самый низкий приоритет, но 100% Можно добиться успеха из режима),пользователь Не нужно ждать。Затем параллельно начните обнаружение пути.,Обычно через несколько секунд,Мы можем найти лучший путь,Тогда Воля существующее соединение прозрачно модернизируется (обновляется) в прошлом,становитьсясоединение «точка-точка»(прямое соединение)。

Таким образом, DERP — это не только гарантированный метод связи Tailscale в случае сбоя проникновения NAT (в настоящее время его роль аналогична TURN), но и обходной канал, который помогает нам завершить проникновение NAT в других сценариях. Другими словами, это и наш метод гарантии, и инфраструктура, которые помогают нам перейти на одноранговое соединение, когда есть более проникающая связь.

Создайте свой собственный частный сервер DERP

Tailscale Закрытый ключ будет сохранен только на текущем узле, поэтому DERP server Он не может расшифровать трафик, он может только шифровать трафик и пересылать его с одного узла на другой, как и другие маршрутизаторы в Интернете. DERP Для предотвращения злоупотреблений используется немного более продвинутый протокол.

Tailscale Открытый исходный код DERP Код сервера, если интересно, можете прочитать Исходный код DERP[1]

Tailscale Есть много официальных встроенных DERP сервер,Шаг за шагом существуют по всему миру,За исключением того, что сюда не входит материковый Китай.,Вы знаете причину。Это приводит к тому, что как только трафик проходит DERP Когда сервер выполняет ретрансляцию, задержка будет очень высокой. И это официально предусмотрено DERP Сервером пользуются тысячи людей, что создает угрозу безопасности.

Чтобы добиться низкой задержки и высокой безопасности, мы можем обратиться к Официальная документация Tailscale[2]Самодельный и частныйиз DERP сервер. Существует два режима развертывания: один основан на имени домена, а другой не требует имени домена и может использоваться напрямую. IP, но для этого требуется немного черной технологии. Давайте сначала рассмотрим самый простой. доменное схема имяиз.

Использовать доменное имя

Это решение должно соответствовать следующим условиям:

  • У вас должно быть собственное доменное имя и подать заявку на получение SSL-сертификата.
  • Необходимо подготовить один или несколько облачных хостов.
  • Если сервер существует внутренний, доменное имя необходимо зарегистрировать.
  • Если сервер существует за границей,Никакой подачи не требуется

Если все вышеперечисленные условия соблюдены, вы можете начать развертывание, выполнив следующие действия.

Рекомендуется использовать Docker напрямую для развертывания. Я уже создал образ Docker и могу развернуть его напрямую:

Язык кода:javascript
копировать
🐳  → docker run --restart always \
  --name derper -p 12345:12345 -p 3478:3478/udp \
  -v /root/.acme.sh/xxxx/:/app/certs \
  -e DERP_CERT_MODE=manual \
  -e DERP_ADDR=12345 \
  -e DERP_DOMAIN=xxxx \
  -d ghcr.io/yangchuansheng/derper:latest

Следует отметить несколько моментов:

  • Можно использовать 443 Используйте порты как можно больше 443 порт,Реальностьсуществовать Если это не сработает, используйте другой.изпорт;
  • По По умолчанию тоже включится STUN Сервис, UDP порт да 3478
  • Брандмауэру необходимо освободить порты 12345 и 3478;
  • Подготовьте SSL-сертификат;
  • Я закодировал часть имени домена, пожалуйста, замените ее своим собственным доменным именем.

о Сертификат Некоторые части необходимо выделить:Предположим, ваше доменное имя xxx.com,Так Сертификатизтребуется имяда xxx.com.crt,Ни один персонаж не ошибается! Та же причина,закрытый ключтребуется имяда xxx.com.key,Ни один персонаж не ошибается!

Просмотр журналов контейнера:

Язык кода:javascript
копировать
🐳  → docker logs -f derper
2022/03/26 11:36:28 no config path specified; using /var/lib/derper/derper.key
2022/03/26 11:36:28 derper: serving on :12345 with TLS
2022/03/26 11:36:28 running STUN server on [::]:3478

В настоящее время derper аварийно завершает работу после некоторого времени работы. В настоящее время нет лучшего решения. Эту проблему можно решить только регулярным перезапуском. Например, с помощью crontab установите перезапуск контейнера каждые два часа:

Язык кода:javascript
копировать
0 */2 * * * docker restart derper &> /dev/null

Для получения подробной информации, пожалуйста, обратитесь к этому issue:Derper TLS handshake error: remote error: tls: internal error[3]

Развернуто derper После этого вы можете изменить Headscale изнастроен на Использовать пользовательские DERP Сервер пропал. Шкала головы Кастомизацию можно использовать в двух формах конфигурации. DERP:
  • Дасуществовать строку URL, формат да JSON,и Tailscale Официальный сервер управления использует тот же формат и синтаксис.
  • Еще один локальный файл формата YAML

Мы можем напрямую использовать локальный файл конфигурации YAML, его содержимое следующее:

Язык кода:javascript
копировать
# /etc/headscale/derp.yaml
regions:
  900:
    regionid: 900
    regioncode: thk 
    regionname: Tencent Hongkong 
    nodes:
      - name: 900a
        regionid: 900
        hostname: xxxx
        ipv4: xxxx
        stunport: 3478
        stunonly: false
        derpport: 12345
      - name: 900b
        regionid: 900
        hostname: xxxx
        ipv4: xxxx
        stunport: 3478
        stunonly: false
        derpport: 12345
  901:
    regionid: 901
    regioncode: hs 
    regionname: Huawei Shanghai 
    nodes:
      - name: 901a
        regionid: 901
        hostname: xxxx
        ipv4: xxxx
        stunport: 3478
        stunonly: false
        derpport: 12345

Инструкции по настройке:

  • regions да YAML серединаизобъект,подиз КаждыйодинобъектвыражатьодинЗона доступности,каждыйЗона доступностиВнутри может быть несколько настроек DERP узел, то есть nodes
  • каждый Зона доступностииз regionid Невозможно повторить.
  • каждый node из name Невозможно повторить.
  • regionname Обычно используется для описания Зоны. доступности,regioncode Обычно устанавливается на Зону доступностиизаббревиатура。
  • ipv4 Поле не является обязательным, если ваше доменное имя может быть передано вам через общедоступную сеть. DERP Адрес сервера, здесь его заполнять не нужно. Если вы используете доменное имя второго уровня и у вас нет общедоступного доменного имени DNS server Добавьте соответствующие записи синтаксического анализа в , затем вам нужно указать их здесь IP(помещениедатыиз Сертификат Сумка Содержит это доменное имя второго уровня.,Это очень поддерживает,Просто создайте общее доменное имя (Сертификат).
  • stunonly: false средства Кроме использования STUN Также доступны услуги DERP Служить.
  • Доменное имя в приведенной выше конфигурации: IP Я закодировал некоторые из них, вам нужно заполнить их в соответствии с вашей реальной ситуацией.

Затем вам необходимо изменить файл конфигурации Headscale, чтобы он ссылался на пользовательский файл конфигурации DERP, указанный выше. Элементы конфигурации, которые необходимо изменить, следующие:

Язык кода:javascript
копировать
# /etc/headscale/config.yaml
derp:
  # List of externally available DERP maps encoded in JSON
  urls:
  #  - https://controlplane.tailscale.com/derpmap/default

  # Locally available DERP map files encoded in YAML
  #
  # This option is mostly interesting for people hosting
  # their own DERP servers:
  # https://tailscale.com/kb/1118/custom-derp-servers/
  #
  # paths:
  #   - /etc/headscale/derp-example.yaml
  paths:
    - /etc/headscale/derp.yaml

  # If enabled, a worker will be set up to periodically
  # refresh the given sources and update the derpmap
  # will be set up.
  auto_update_enabled: true

  # How often should we check for DERP updates?
  update_frequency: 24h

Вы можете отключить официальный сервер DERP Tailscale, чтобы проверить, может ли ваш собственный сервер DERP работать правильно.

После изменения конфигурации перезапустите службу headscale:

Язык кода:javascript
копировать
$ systemctl restart headscale

Используйте следующую команду в клиенте Tailscale, чтобы просмотреть доступные на данный момент серверы DERP:

Язык кода:javascript
копировать
$ tailscale netcheck

Report:
        * UDP: true
        * IPv4: yes, xxxxx:57068
        * IPv6: no
        * MappingVariesByDestIP: false
        * HairPinning: false
        * PortMapping: 
        * Nearest DERP: Tencent Hongkong
        * DERP latency:
                - thk: 39.7ms (Tencent Hongkong)

tailscale netcheck На самом деле только обнаруживает 3478/udp порт, Даже если netcheck Это показывает, что оно может быть связано, но это не обязательно означает, что 12345 Порт может пересылать трафик. Самый простой способ — открыть его напрямую. DERP Сервера URL: https://xxxx:12345, если вы видите следующую страницу и адресную строку SSL Если на этикетке сертификата указано, что он доступен нормально, то проблем действительно нет.

Проверьте метод соединения с партнером связи:

Язык кода:javascript
копировать
$ tailscale status
10.1.0.5        coredns              default      linux   -
                carsondemacbook-pro  default      macOS   active; direct xxxx:2756; offline, tx 50424 rx 34056
                oneplus-8t           default      android active; relay "thk"; offline, tx 1608 rx 1552
                openwrt              default      linux   active; direct xxxx:2834; offline, tx 1403688 rx 1217620

Этот клиент представляет собой облачный хост с 3 одноранговые узлы связи соответственно macOS、OpenWRT и Android Мобильная версия, macOS и OpenWRT Все в домашней сети связи, Android Мобильные телефоны используют телекоммуникационный трафик. Видно, что только Android Телефон настраивается через DERP Сервер ретранслирует трафик, и вероятность успеха пробивания отверстий довольно высока. использовать ping Чтобы проверить подключение:

Язык кода:javascript
копировать
$ ping 10.1.0.8
PING 10.1.0.8 (10.1.0.8) 56(84) bytes of data.
64 bytes from 10.1.0.8: icmp_seq=1 ttl=64 time=150 ms
64 bytes from 10.1.0.8: icmp_seq=2 ttl=64 time=131 ms
64 bytes from 10.1.0.8: icmp_seq=3 ttl=64 time=161 ms
64 bytes from 10.1.0.8: icmp_seq=4 ttl=64 time=137 ms
64 bytes from 10.1.0.8: icmp_seq=5 ttl=64 time=156 ms
64 bytes from 10.1.0.8: icmp_seq=6 ttl=64 time=169 ms
^C
--- 10.1.0.8 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5005ms
rtt min/avg/max/mdev = 131.728/151.154/169.627/13.193 ms

Вы также можете использовать инструмент командной строки Tailscale для тестирования:

Язык кода:javascript
копировать
$ tailscale ping 10.1.0.8
pong from oneplus-8t (10.1.0.8) via DERP(thk) in 104ms
pong from oneplus-8t (10.1.0.8) via DERP(thk) in 111ms
pong from oneplus-8t (10.1.0.8) via DERP(thk) in 105ms

Этот более дружелюбный и сразу скажет вам, пройден ли он. DERP сервер ретрансляции Приходитьи Другая сторона Коммуникабельный.

Если в настоящее время Tailscale Хост, на котором находится клиент, включен IPv6, тогда мобильный телефон может напрямую передавать IPv6 Соединение «точка-точка»:

Язык кода:javascript
копировать
$ /Applications/Tailscale.app/Contents/MacOS/Tailscale status
                coredns              default      linux   active; direct xxxx:45986; offline, tx 124352 rx 185736
                oneplus-8t           default      android active; direct [240e:472:da0:24a2:a07f:2a67:2a1e:4475]:37237; offline, tx 125216 rx 20052
                openwrt              default      linux   active; direct [240e:390:caf:1870:c02c:e8ff:feb9:b0b]:41641; offline, tx 181992 rx 3910120

$ /Applications/Tailscale.app/Contents/MacOS/Tailscale ping 10.1.0.8
pong from oneplus-8t (10.1.0.8) via [240e:472:da0:24a2:a07f:2a67:2a1e:4475]:37237 in 62ms

Итак, если вы включите IPv6,Можетзначительно увеличилсясоединение «точка-точка»изуровень успеха。

Используйте чистый IP

Я знаю,У большинства людей нет собственных доменных имен. Сделайте шаг назад,Даже если есть собственное доменное имя,Если нет записи,Также нет возможности развернуть существование для использования на внутренних серверах.

В настоящее время мы можем начать только с derper Исходный код был изменен и найден tailscale на складе cmd/derper/cert.go Файл, проверка доменного имени Воли, связанный с контентом, удаленным или прокомментированным:

Язык кода:javascript
копировать
func (m *manualCertManager) getCertificate(hi *tls.ClientHelloInfo) (*tls.Certificate, error) {
 //if hi.ServerName != m.hostname {
 // return nil, fmt.Errorf("cert mismatch with hostname: %q", hi.ServerName)
 //}
 return m.cert, nil
}

Вам также необходимо создать самозаверяющий сертификат, который можно создать с помощью скрипта:

Язык кода:javascript
копировать
# build_cert.sh

#!/bin/bash

CERT_HOST=$1
CERT_DIR=$2
CONF_FILE=$3

echo "[req]
default_bits  = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
countryName = XX
stateOrProvinceName = N/A
localityName = N/A
organizationName = Self-signed certificate
commonName = $CERT_HOST: Self-signed certificate

[req_ext]
subjectAltName = @alt_names

[v3_req]
subjectAltName = @alt_names

[alt_names]
IP.1 = $CERT_HOST
" > "$CONF_FILE"

mkdir -p "$CERT_DIR"
openssl req -x509 -nodes -days 730 -newkey rsa:2048 -keyout "$CERT_DIR/$CERT_HOST.key" -out "$CERT_DIR/$CERT_HOST.crt" -config "$CONF_FILE"

переписать Dockerfile, будет derper Доменное имя установлено на 127.0.0.1

Язык кода:javascript
копировать
FROM golang:latest AS builder

WORKDIR /app

# ========= CONFIG =========
# - download links
ENV MODIFIED_DERPER_GIT=https://github.com/yangchuansheng/ip_derper.git
ENV BRANCH=ip_derper
# ==========================

# build modified derper
RUN git clone -b $BRANCH $MODIFIED_DERPER_GIT tailscale --depth 1 && \
    cd /app/tailscale/cmd/derper && \
    /usr/local/go/bin/go build -ldflags "-s -w" -o /app/derper && \
    cd /app && \
    rm -rf /app/tailscale

FROM ubuntu:20.04
WORKDIR /app

# ========= CONFIG =========
# - derper args
ENV DERP_HOST=127.0.0.1
ENV DERP_CERTS=/app/certs/
ENV DERP_STUN true
ENV DERP_VERIFY_CLIENTS false
# ==========================

# apt
RUN apt-get update && \
    apt-get install -y openssl curl

COPY build_cert.sh /app/
COPY --from=builder /app/derper /app/derper

# build self-signed certs && start derper
CMD bash /app/build_cert.sh $DERP_HOST $DERP_CERTS /app/san.conf && \
    /app/derper --hostname=$DERP_HOST \
    --certmode=manual \
    --certdir=$DERP_CERTS \
    --stun=$DERP_STUN  \
    --verify-clients=$DERP_VERIFY_CLIENTS

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

Язык кода:javascript
копировать
🐳  → docker run --restart always --net host --name derper -d ghcr.io/yangchuansheng/ip_derper

и Использовать доменное Как и в случае с именемиз, брандмауэру необходимо освободить соответствующий порт (12345). и 3478)。

Просмотр журналов контейнера:

Язык кода:javascript
копировать
🐳  → docker logs -f derper
Generating a RSA private key
.......................................+++++
..............+++++
writing new private key to '/app/certs//127.0.0.1.key'
-----
2022/03/26 14:30:31 no config path specified; using /var/lib/derper/derper.key
2022/03/26 14:30:31 derper: serving on :443 with TLS
2022/03/26 14:30:31 running STUN server on [::]:3478

Если вы хотите построить свой собственный derper зеркало,Можетссылкамой GitHub Склад[4]

Ниже приводится крутая операция, мы здесь Headscale из КонфигурациясерединануждатьсяВоля DERP Доменное имя установлено на IP!не понимаюиз Может Переварите это еще раз,Тогда продолжайте читать ниже, хаха~~

Кроме derper Снаружи, хвостовая чешуя клиент还нуждатьсяПропустить проверку доменного имени,Это необходимо для существования DERP задается в конфигурации. и Headscale местных YAML Файл на данный момент не поддерживает этот элемент конфигурации, поэтому другого способа нет. Мы можем использовать только онлайн. URL . JSON Содержание конфигурации следующее:

Язык кода:javascript
копировать
{
  "Regions": {
    "901": {
      "RegionID": 901,
      "RegionCode": "ali-sh",
      "RegionName": "Aliyun Shanghai",
      "Nodes": [
        {
          "Name": "901a",
          "RegionID": 901,
          "DERPPort": 443,
          "HostName": "xxxx",
          "IPv4": "xxxx",
          "InsecureForTests": true
        }
      ]
    }
  }
}

Анализ конфигурации:

  • HostName Заполните напрямую derper из общедоступной сети IP,Прямо сейчаси IPv4 из ценностей те же.
  • InsecureForTests Должно быть установлено true,к Пропустить проверку доменного имени。

Вам необходимо превратить этот файл JSON в URL-адрес, к которому может получить доступ сервер Headscale, например, настроить Nginx на хосте Headscale или загрузить его в объектное хранилище (например, Alibaba Cloud OSS).

Затем вам необходимо изменить файл конфигурации Headscale, чтобы он ссылался на указанный выше пользовательский URL-адрес DERP. Элементы конфигурации, которые необходимо изменить, следующие:

Язык кода:javascript
копировать
# /etc/headscale/config.yaml
derp:
  # List of externally available DERP maps encoded in JSON
  urls:
  #  - https://controlplane.tailscale.com/derpmap/default
    - https://xxxxx/derp.json

  # Locally available DERP map files encoded in YAML
  #
  # This option is mostly interesting for people hosting
  # their own DERP servers:
  # https://tailscale.com/kb/1118/custom-derp-servers/
  #
  # paths:
  #   - /etc/headscale/derp-example.yaml
  paths:
    - /etc/headscale/derp.yaml

  # If enabled, a worker will be set up to periodically
  # refresh the given sources and update the derpmap
  # will be set up.
  auto_update_enabled: true

  # How often should we check for DERP updates?
  update_frequency: 24h

После изменения конфигурации перезапустите службу headscale:

Язык кода:javascript
копировать
$ systemctl restart headscale

Используйте следующую команду в клиенте Tailscale, чтобы просмотреть доступные на данный момент серверы DERP:

Язык кода:javascript
копировать
$ tailscale netcheck

Report:
 * UDP: true
 * IPv4: yes, 192.168.100.1:49656
 * IPv6: no
 * MappingVariesByDestIP: true
 * HairPinning: false
 * PortMapping: UPnP
 * Nearest DERP: Home Hangzhou
 * DERP latency:
  - home: 9.7ms   (Home Hangzhou)
  -  hs: 25.2ms  (Huawei Shanghai)
  - thk: 43.5ms  (Tencent Hongkong)

снова Проверьте метод соединения с партнером связи:

Язык кода:javascript
копировать
$ tailscale status
                coredns              default      linux   active; direct xxxx:45986; offline, tx 131012 rx 196020
                oneplus-8t           default      android active; relay "home"; offline, tx 211900 rx 22780
                openwrt              default      linux   active; direct 192.168.100.254:41641; offline, tx 189868 rx 4074772

можно увидеть на этот раз Tailscale автоматически выбраноодин Линия оптимальнаяизОдомашненный DERP Сервер действует как ретранслятор, и вы можете проверить задержку:

Язык кода:javascript
копировать
$ tailscale ping 10.1.0.8
pong from oneplus-8t (10.1.0.8) via DERP(home) in 30ms
pong from oneplus-8t (10.1.0.8) via DERP(home) in 45ms
pong from oneplus-8t (10.1.0.8) via DERP(home) in 30ms

Идеальный! Вот home Конечно, метод развертывания домашнего широкополосного доступа аналогичен вышеупомянутому внутреннему облачному хосту. Вам необходимо дополнительно включить общедоступную сеть и сопоставление портов (12345/tcp,). 3478/удап). Еще одна вещь, на которую следует обратить внимание, — это содержимое конфигурации:

Язык кода:javascript
копировать
{
  "Regions": {
    "901": {
      "RegionID": 901,
      "RegionCode": "ali-sh",
      "RegionName": "Aliyun Shanghai",
      "Nodes": [
        {
          "Name": "901a",
          "RegionID": 901,
          "DERPPort": 443,
          "HostName": "xxxx",
          "IPv4": "xxxx",
          "InsecureForTests": true
        }
      ]
    },
    "902": {
      "RegionID": 902,
      "RegionCode": "home",
      "RegionName": "Home Hangzhou",
      "Nodes": [
        {
          "Name": "902a",
          "RegionID": 902,
          "DERPPort": 12345,
          "HostName": "xxxx",
          "InsecureForTests": true
        }
      ]
    }
  }
}

По сравнению с домашними облачными хостами существует два различия в конфигурации домашнего широкополосного доступа:

  • Нужно удалить IPv4 Элементы конфигурации. Потому что домашний широкополосный доступ из общедоступной сети IP да меняется динамически, поэтому вам нужно использовать DDNS Для динамического анализа общедоступной сети IP。
  • HostName Лучше всего указать доменное имя,потому чтотыиз общедоступной сети IP да изменяется динамически и не может быть заполнено IP,пока неты不停地修改Конфигурация文件。Заполните доменное имя Это не имеет значения Ла,В любом случае доменное имя не будет проверено.,Нет необходимости беспокоиться о сертификате,При условии, что доменное имя может быть преобразовано в ваш общедоступный IP-адрес.

Запретить бесплатное использование DERP

По умолчанию DERP Серверами можно пользоваться бесплатно, если другие знают ваши DERP Адрес и порт Сервера могут использоваться им. Если на вашем сервере небольшой водопровод, и если вы используете его слишком много людей, он может вас перегрузить, поэтому нам необходимо изменить конфигурацию, чтобы улучшить производительность. проституцией бесплатно。

Специальное заявление: Используйте только доменное Только таким способом можно пройти сертификацию предотвращения Бытия. проституцией бесплатно,Используйте чистый IP Невозможно предотвратить белую проституцию, можно только тщательно скрывать свою IP и порт, не могу сообщить другим.

Нужно сделать всего две вещи:

1、существовать DERP Установить на сервер Tailscale。

Первый шаг требует существования DERP Установка услуги на хост-компьютер Tailscale клиент,Запустите масштабный процесс

2、derper Добавляем параметры при запуске --verify-clients

В этой статье рекомендуется запускать контейнер.,Содержимое Dockerfile [5]следующее:

Язык кода:javascript
копировать
FROM golang:latest AS builder

LABEL org.opencontainers.image.source https://github.com/yangchuansheng/docker-image

WORKDIR /app

# https://tailscale.com/kb/1118/custom-derp-servers/
RUN go install tailscale.com/cmd/derper@main

FROM ubuntu
WORKDIR /app

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
    apt-get install -y --no-install-recommends apt-utils && \
    apt-get install -y ca-certificates && \
    mkdir /app/certs

ENV DERP_DOMAIN your-hostname.com
ENV DERP_CERT_MODE letsencrypt
ENV DERP_CERT_DIR /app/certs
ENV DERP_ADDR :443
ENV DERP_STUN true
ENV DERP_HTTP_PORT 80
ENV DERP_VERIFY_CLIENTS false

COPY --from=builder /go/bin/derper .

CMD /app/derper --hostname=$DERP_DOMAIN \
    --certmode=$DERP_CERT_MODE \
    --certdir=$DERP_CERT_DIR \
    --a=$DERP_ADDR \
    --stun=$DERP_STUN  \
    --http-port=$DERP_HTTP_PORT \
    --verify-clients=$DERP_VERIFY_CLIENTS

По умолчанию --verify-clients Параметры установлены на false。нам не нужно Dockerfile Чтобы внести какие-либо изменения в содержимое, просто добавьте переменную среды Прямо при запуске контейнера. Сейчас можно изменить перед командой «Воля иззапуская»:

Язык кода:javascript
копировать
🐳  → docker run --restart always \
  --name derper -p 12345:12345 -p 3478:3478/udp \
  -v /root/.acme.sh/xxxx/:/app/certs \
  -e DERP_CERT_MODE=manual \
  -e DERP_ADDR=12345 \
  -e DERP_DOMAIN=xxxx \
  -e DERP_VERIFY_CLIENTS=true \
  -d ghcr.io/yangchuansheng/derper:latest

Это сделано. Даже если другие знают адрес вашего сервера DERP, они не смогут его использовать. Однако даже в этом случае вам следует стараться не сообщать другим адрес вашего сервера, чтобы другие не смогли его захватить. преимущество в этом.

Подвести итог

Эта статья познакомит вас STUN для вспомогательного NAT Значение проникновения было популяризировано несколькими распространенными протоколами ретрансляции, в том числе Tailscale Саморазвитый DERP протокол. Наконец, я шаг за шагом научу вас, как создать свой собственный личный кабинет. DERP сервер и пусть Tailscale Используйте наши собственные DERP сервер.

Ссылки

  • Как работает проникновение NAT: технические принципы и практика уровня предприятия[6]
  • Custom DERP Servers[7]
  • Encrypted TCP relays (DERP)[8]

Справочная ссылка

[1]

DERP Исходный код: https://github.com/tailscale/tailscale/tree/main/derp

[2]

Tailscale Официальная документация: https://tailscale.com/kb/1118/custom-derp-servers/

[3]

Derper TLS handshake error: remote error: tls: internal error: https://github.com/tailscale/tailscale/issues/4082

[4]

мой GitHub склад: https://github.com/yangchuansheng/ip_derper

[5]

Dockerfile содержание: https://github.com/yangchuansheng/docker-image/blob/master/derper/Dockerfile

[6]

NAT Как работает проникновение: технические принципы и практика на уровне предприятия: https://arthurchiao.art/blog/how-nat-traversal-works-zh/

[7]

Custom DERP Servers: https://tailscale.com/kb/1118/custom-derp-servers/

[8]

Encrypted TCP relays (DERP): https://tailscale.com/blog/how-tailscale-works/#encrypted-tcp-relays-derp

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода