Создайте свой собственный сервер ретрансляции 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
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose