이 문서는 소프트웨어 개발자를 대상으로 작성되었습니다. ZeroTier 사용에 대한 자세한 내용은 웹 사이트, 문서 사이트 및 토론 포럼을 참조하십시오.
ZeroTier는 지구를 위한 스마트 프로그래밍 가능 이더넷 스위치입니다. 이를 통해 모든 네트워크 장치, VM, 컨테이너 및 애플리케이션이 모두 동일한 물리적 데이터 센터 또는 클라우드 지역에 있는 것처럼 통신할 수 있습니다.
이는 암호화 방식으로 주소가 지정되고 안전한 피어 투 피어 네트워크(VL1이라고 함)를 VXLAN(VL2라고 함)과 다소 유사한 이더넷 에뮬레이션 계층과 결합하여 수행됩니다. VL2 이더넷 가상화 계층에는 네트워크 마이크로 세분화 및 보안 모니터링을 위한 세분화된 액세스 제어 규칙과 같은 고급 엔터프라이즈 SDN 기능이 포함되어 있습니다.
모든 ZeroTier 트래픽은 귀하만이 제어할 수 있는 비밀 키를 사용하여 엔드 투 엔드로 암호화됩니다. 대부분의 트래픽은 P2P로 흐르지만 P2P 연결을 설정할 수 없는 사용자를 위해 무료(그러나 느린) 릴레이를 제공합니다.
ZeroTier의 목표와 설계 원칙은 무엇보다도 Google BeyondCorp 원본 문서와 "경계 해제" 개념이 포함된 Jericho 포럼에서 영감을 받았습니다.
자세한 내용과 사전 구축된 바이너리 패키지를 보려면 ZeroTier 사이트를 방문하세요. Android 및 iOS용 앱은 Google Play 및 Apple 앱 스토어에서 무료로 제공됩니다.
ZeroTier는 BSL 버전 1.1에 따라 라이센스가 부여됩니다. 자세한 내용은 LICENSE.txt 및 ZeroTier 가격 페이지를 참조하세요. ZeroTier는 기업 및 교육 기관 내부적으로 그리고 비상업적 목적으로 무료로 사용할 수 있습니다. ZeroTier를 기반으로 비공개 소스 앱 및 장치를 구축하거나 ZeroTier 네트워크 컨트롤러 및 네트워크 관리를 SaaS 서비스로 제공하는 등 특정 유형의 상업적 사용에는 상업용 라이선스가 필요합니다.
ZeroTier에는 소량의 제3자 코드도 포함되어 있으며 BSL 라이센스가 적용되지 않습니다. 포함된 타사 코드 목록과 이에 적용되는 라이센스는 AUTHORS.md를 참조하세요. ZeroTier의 모든 제3자 코드는 자유롭게 라이센스가 부여됩니다(MIT, BSD, Apache, 공개 도메인 등).
ZeroTier 세계의 모든 것은 40비트/10자리 ZeroTier 주소 와 64비트/16자리 네트워크 ID라는 두 가지 유형의 식별자로 제어됩니다. 이러한 식별자는 길이로 쉽게 구별됩니다. ZeroTier 주소는 노드 또는 "장치"(노트북, 전화, 서버, VM, 앱 등)를 식별하는 반면, 네트워크 ID는 장치가 연결할 수 있는 가상 이더넷 네트워크를 식별합니다.
ZeroTier 주소는 VLAN을 지원하는 전 세계의 거대한 엔터프라이즈 이더넷 스마트 스위치의 포트 번호로 생각할 수 있습니다. 네트워크 ID는 이러한 포트가 할당될 수 있는 VLAN ID입니다. 단일 포트는 둘 이상의 VLAN에 할당될 수 있습니다.
ZeroTier 주소는 8056c2e21c
와 유사하고 네트워크 ID는 8056c2e21c000001
과 같습니다. 네트워크 ID는 해당 네트워크 기본 컨트롤러의 ZeroTier 주소와 이 컨트롤러에서 네트워크를 식별하는 임의의 24비트 ID로 구성됩니다. 네트워크 컨트롤러는 OpenFlow와 같은 SDN 프로토콜의 SDN 컨트롤러와 대략 유사합니다. 하지만 VXLAN과 VL2 간의 유사점과 마찬가지로 프로토콜이나 설계가 동일하다는 의미로 읽어서는 안 됩니다. my.zerotier.com에서 편리하고 저렴한 SaaS 호스팅 컨트롤러를 사용하거나, JSON 구성 파일을 조작하거나 스크립트를 작성하는 것이 괜찮다면 자체 컨트롤러를 실행할 수 있습니다.
기본 경로에는 ZeroTier One 서비스 기본 진입점( one.cpp
), 자체 테스트 코드, makefile 등이 포함됩니다.
artwork/
: 아이콘, 로고 등attic/
: 참조용으로 보관하고 싶은 오래된 내용과 실험 코드입니다.controller/
: 데스크톱 및 서버 빌드 대상에 기본적으로 구축되고 포함되는 참조 네트워크 컨트롤러 구현입니다.debian/
: Linux에서 데비안 패키지를 빌드하기 위한 파일입니다.doc/
: 매뉴얼 페이지 및 기타 문서.ext/
: 일부 플랫폼(Mac 및 Windows)에서 편의를 위해 제공되는 타사 라이브러리, 바이너리 및 설치 지원 파일입니다.include/
: ZeroTier 코어용 파일을 포함합니다.java/
: Android 모바일 앱에 사용되는 JNI 래퍼입니다. (안드로이드 앱 전체가 오픈소스는 아니지만 향후 그렇게 될 수도 있습니다.)node/
: 나머지 코드와 완전히 분리되도록 설계되었으며 독립 실행형 OS 독립적 라이브러리로 구축될 수 있는 ZeroTier 가상 이더넷 스위치 코어입니다. 개발자 참고 사항: 여기서는 C++11 기능을 사용하지 마십시오. C++11 지원이 부족한 오래된 임베디드 플랫폼에서 빌드하기를 원하기 때문입니다. C++11은 다른 곳에서도 사용될 수 있습니다.osdep/
: 특정 대상용으로 구축된 플랫폼별 항목을 포함하여 OS를 지원하고 통합하는 코드입니다.rule-compiler/
: 네트워크 수준 규칙을 정의하기 위한 JavaScript 규칙 언어 컴파일러입니다.service/
: ZeroTier 코어를 래핑하고 데스크톱, 노트북, 서버, VM 및 컨테이너용 가상 네트워크에 VPN과 유사한 연결을 제공하는 ZeroTier One 서비스입니다.windows/
: Visual Studio 솔루션 파일, Windows 서비스 코드 및 Windows 작업 표시줄 앱 UI입니다.zeroidc/
: SSO 지원 네트워크에 로그인하기 위해 ZeroTier 서비스에서 사용하는 OIDC 구현입니다. (이 부분은 Rust로 작성되었으며 앞으로 이 저장소에 더 많은 Rust가 나타날 것입니다.) dev
브랜치에서 풀 요청을 수행하세요.
릴리스는 dev
main
에 병합한 다음 태그를 지정하고 빌드를 수행하여 수행됩니다.
Mac 및 Linux에서 빌드하려면 make
입력하세요. FreeBSD 및 OpenBSD에서는 gmake
(GNU make)가 필요하며 패키지 또는 포트에서 설치할 수 있습니다. Windows의 경우 windows/
에 Visual Studio 솔루션이 있습니다.
gmake
입력하세요.binutils
필요합니다. pkg install binutils
입력하여 설치합니다./dev/tap0
~ /dev/tap3
)뿐이므로 OpenBSD에는 네트워크 멤버십이 4개로 제한됩니다.gmake
입력하세요. make selftest
입력하면 다양한 내부를 단위 테스트하고 빌드 환경의 몇 가지 측면에 대해 보고하는 zerotier-selftest 바이너리가 빌드됩니다. 새로운 플랫폼이나 아키텍처에서 이를 시도해 보는 것이 좋습니다.
-h
옵션을 사용하여 zerotier-one을 실행하면 도움말이 표시됩니다.
Linux 및 BSD에서 소스에서 빌드한 경우 다음을 사용하여 서비스를 시작할 수 있습니다.
sudo ./zerotier-one -d
대부분의 배포판, macOS 및 Windows에서 설치 프로그램은 서비스를 시작하고 부팅 시 시작되도록 설정합니다.
시스템의 홈 폴더가 자동으로 생성됩니다.
서비스는 기본적으로 127.0.0.1:9993
에서 사용 가능한 JSON API를 통해 제어됩니다. 또한 0.0.0.0:9993
수신 대기하며 이는 local.conf
에서 allowManagementFrom
가 올바르게 구성된 경우에만 사용할 수 있습니다. 네트워크 가입 및 탈퇴와 같은 표준 작업에 대한 API 호출을 수행하는 zerotier-cli 명령줄 유틸리티가 포함되어 있습니다. 홈 폴더의 authtoken.secret 파일에는 이 API에 액세스하기 위한 비밀 토큰이 포함되어 있습니다. API 문서는 service/README.md를 참조하세요.
각 OS에서 기본적으로 홈 폴더가 있는 위치는 다음과 같습니다.
/var/lib/zerotier-one
/var/db/zerotier-one
/Library/Application Support/ZeroTier/One
ProgramDataZeroTierOne
(기본값입니다. Windows가 비표준 드라이브 문자 할당 또는 레이아웃으로 설치된 경우 기본 '공유 앱 데이터' 폴더가 다를 수 있습니다.)대부분의 사용자에게는 제대로 작동합니다.
로컬 시스템 방화벽을 실행하는 경우 zerotier를 허용하는 규칙을 추가하는 것이 좋습니다. Windows용 바이너리를 설치한 경우 이 작업은 자동으로 수행되어야 합니다. 다른 플랫폼에서는 구성에 따라 로컬 방화벽 규칙을 수동으로 편집해야 할 수도 있습니다.
자세한 내용은 설명서 사이트를 참조하세요.
Mac 방화벽은 시스템 환경설정의 "보안"에서 찾을 수 있습니다. Linux에는 다양한 방화벽 구성 시스템과 도구가 있습니다.
CentOS에서는 /etc/sysconfig/iptables
에서 IPTables 규칙을 확인하세요. 다른 배포판에 대해서는 배포판 설명서를 참조하세요. 또한 Little Snitch(Mac), McAfee Firewall Enterprise(Windows) 등과 같은 상업용 타사 방화벽 애플리케이션을 실행 중인 경우 해당 애플리케이션에 대한 UI 또는 설명서를 확인해야 합니다. 일부 기업 환경에는 중앙에서 관리되는 방화벽 소프트웨어가 있을 수 있으므로 IT 부서에 문의해야 할 수도 있습니다.
ZeroTier One 피어는 UDP 포트 9993 인바운드가 열려 있는 경우 자동으로 서로를 찾아 로컬 유선 LAN을 통해 직접 통신합니다. 해당 포트가 필터링되면 서로의 LAN 알림 패킷을 볼 수 없습니다. 동일한 물리적 네트워크에 있는 장치 간 성능이 저하되는 경우 방화벽 설정을 확인하세요. LAN 자동 위치가 없으면 피어는 "루프백" NAT 통과를 시도해야 하며, 이는 때때로 실패하며 어떤 경우에도 모든 패킷이 외부 라우터를 두 번 통과해야 합니다.
특정 유형의 방화벽과 "대칭" NAT 장치 뒤에 있는 사용자는 외부 피어에 직접 연결하지 못할 수도 있습니다. ZeroTier는 포트 예측을 제한적으로 지원하며 대칭형 NAT 통과를 시도 하지만 이것이 항상 작동하는 것은 아닙니다. P2P 연결이 실패하면 UDP 패킷이 중계 서버에서 반송되어 성능이 저하됩니다. 일부 NAT 라우터에는 구성 가능한 NAT 모드가 있으며 이를 "풀 콘"으로 설정하면 이 문제가 해결됩니다. 이렇게 하면 VoIP 전화, Skype, BitTorrent, WebRTC, 특정 게임 등과 같은 항목이 모두 우리와 유사한 NAT 통과 기술을 사용하기 때문에 마술적인 개선을 볼 수도 있습니다.
사용자와 인터넷 사이의 방화벽이 ZeroTier의 UDP 트래픽을 차단하는 경우 포트 443을 통해 루트 서버에 대한 최후의 수단 TCP 터널링(https 가장)으로 대체됩니다. 이는 거의 모든 곳에서 작동하지만 UDP 또는 직접 피어 투 피어 연결에 비해 속도가 매우 느립니다 .
추가적인 도움은 당사의 지식 베이스에서 찾아보실 수 있습니다.
Prometheus 지표는 /metrics
API 엔드포인트에서 사용할 수 있습니다. 이 엔드포인트는 원치 않는 정보 유출을 방지하기 위해 metricstoken.secret
에 저장된 API 키로 보호됩니다. 지표에서 수집할 수 있는 정보에는 인스턴스가 통신하는 연결된 네트워크 및 피어가 포함됩니다.
액세스 제어는 ZeroTier 제어 인터페이스 자체와 metricstoken.secret
통해 이루어집니다. 이는 X-ZT1-Auth
HTTP 헤더 필드를 통해 베어러 인증 토큰으로 전송되거나 ?auth=<token>
으로 URL에 추가될 수 있습니다. 다음 명령을 사용하여 cURL
통해 현재 측정항목을 볼 수 있습니다.
// Linux
curl -H "X-ZT1-Auth: $(sudo cat /var/lib/zerotier-one/metricstoken.secret)" http://localhost:9993/metrics
// macOS
curl -H "X-ZT1-Auth: $(sudo cat /Library/Application Support/ZeroTier/One/metricstoken.secret)" http://localhost:9993/metrics
// Windows PowerShell (Admin)
Invoke-RestMethod -Headers @{'X-ZT1-Auth' = "$(Get-Content C:ProgramDataZeroTierOnemetricstoken.secret)"; } -Uri http://localhost:9993/metrics
ZeroTier가 실행 중인 머신의 Prometheus에서 스크래핑 작업을 구성하려면 Prometheus scrape_config
에 다음을 추가하세요.
- job_name: zerotier-one
honor_labels: true
scrape_interval: 15s
metrics_path: /metrics
static_configs:
- targets:
- 127.0.0.1:9993
labels:
group: zerotier-one
node_id: $YOUR_10_CHARACTER_NODE_ID
authorization:
credentials: $YOUR_METRICS_TOKEN_SECRET
이러한 방법 중 어느 것도 바람직하지 않은 경우 Prometheus 프록시 또는 기타 도구를 통해 메트릭을 배포하는 것이 가능할 수 있습니다. 참고: 내부적으로 테스트하지는 않았지만 아마도 올바른 구성에서 작동할 것입니다.
지표는 디스크의 ZeroTier 작업 디렉터리에서도 사용할 수 있습니다.
// 리눅스 /var/lib/zerotier-one/metrics.prom
// macOS /Library/Application Support/ZeroTier/One/metrics.prom
//윈도우 C:ProgramDataZeroTierOnemetrics.prom
측정항목 이름 | 라벨 | 측정항목 유형 | 설명 |
---|---|---|---|
zt_packet | 패킷_유형, 방향 | 계수기 | ZeroTier 패킷 유형 수 |
zt_packet_error | error_type, 방향 | 계수기 | ZeroTier 패킷 오류 |
zt_data | 프로토콜, 방향 | 계수기 | ZeroTier가 전송하거나 수신한 바이트 수 |
zt_num_networks | 계량기 | 이 인스턴스가 조인된 네트워크 수 | |
zt_network_multicast_groups_subscribed | 네트워크_ID | 계량기 | 네트워크가 가입된 멀티캐스트 그룹 수 |
zt_network_packets | network_id, 방향 | 계수기 | 네트워크당 들어오고 나가는 패킷 수 |
zt_peer_latency | node_id | 히스토그램 | 피어 대기 시간(ms) |
zt_peer_path_count | node_id, 상태 | 계량기 | 피어에 대한 경로 수 |
zt_peer_packets | node_id, 방향 | 계수기 | 피어와의 패킷 수 |
zt_peer_packet_errors | node_id | 계수기 | 피어로부터 들어오는 패킷 오류 수 |
추적하고 싶은 다른 지표가 있는 경우 이슈를 통해 문의하거나 Pull Request를 보내주세요!
http://localhost:9993/app/에는 단일 페이지 앱을 호스팅하는 데 적합한 정적 http 파일 서버가 있습니다.
zerotier-cli info -j
사용하여 zerotier-1 서비스의 homeDir을 찾으세요.
cd $ZT_HOME
sudo mkdir -p app/app1
sudo mkdir -p app/appB
echo ' <html><meta charset=utf-8><title>appA</title><body><h1>hello world A ' | sudo tee app/appA/index.html
echo ' <html><meta charset=utf-8><title>app2</title><body><h1>hello world 2 ' | sudo tee app/app2/index.html
curl -sL http://localhost:9993/app/appA http://localhost:9993/app/app2
그런 다음 http://localhost:9993/app/app1/ 및 http://localhost:9993/app/appB/를 방문하세요.
존재하지 않는 경로에 대한 요청은 SPA의 관례대로 앱 루트 index.html을 반환합니다. 원하는 경우 서비스 또는 컨트롤러 API와 통신하는 일부 자바스크립트를 작성할 수 있습니다.