Yusuke가 NAT에 구멍을 뚫습니다.
면책조항 : 이것은 제작 준비가 완료된 채팅 애플리케이션이 아닙니다. AES 암호화 연결 client <-> client
및 client <-> server
생성하지만 이 코드는 보안 전문가에 의해 감사되거나 테스트되지 않았습니다. 이는 P2P 네트워킹 및 기술에 대해 더 많이 배우고 학습에 관심이 있는 다른 사람들에게 사용되는 기술의 몇 가지 예를 제공하기 위한 단순한 연습입니다. 또한 UDP 클라이언트는 메시지의 성공적인 전달을 보장하는 프로토콜을 구현하지 않으므로 연결이 불안정하여 일부가 손실됩니다.
위 이미지를 클릭하면 실제 채팅 앱의 YouTube 동영상을 볼 수 있습니다. 오른쪽 상단에 있는 터미널은 랑데부 서버를 실행하는 VPS에 SSH로 연결됩니다. 오른쪽 하단의 터미널이 터미널 UI입니다. 왼쪽의 웹 앱은 GUI입니다.
go get github.com/wilfreddenton/udp-hole-punching
주요 패키지는 랑데부 서버입니다. VPS 또는 호스팅할 대상을 찾으세요. 모든 것을 로컬에서 실행할 수 있지만 동일한 머신에 있기 때문에 홀 펀칭이 작동하는지 여부를 실제로 테스트하지는 않습니다. 서버에 0-65535에서 들어오는 트래픽에 대해 열려 있는 TCP 및 UDP 포트가 있는지 확인하십시오.
실행하려면:
go install
사용할 수 있는 UI는 웹 UI인 gui
와 터미널 UI인 term-ui
두 가지가 있습니다. UI를 원하는 대로 조합하여 사용할 수 있습니다.
이를 사용하기 전에 main.go
파일을 열고 serverTCPIP
및 serverUDPIP
상수를 랑데뷰 서버(포트 없음)의 IP 주소로 전환해야 합니다.
웹 UI를 실행하려면
cd gui/ui
npm install
npm run build
cd ..
go install
gui
또는 gui -serverIP=<server IP here>
localhost:8000
가리키도록 하세요.연결을 끊고 새 채팅을 시작하려면 새로 고치기만 하면 됩니다.
터미널 UI를 실행하려면
cd term-ui
go install
term-ui
랑데뷰 서버가 로컬로 실행 중인 경우 term-ui -serverIP=<server IP here>
연결을 끊고 새 채팅을 시작하려면 ctrl-c
눌러 프로그램을 종료하고 다시 실행하세요.
친구가 아니라면 다른 라우터 뒤에 있는 컴퓨터에 액세스하여 거기에 클라이언트를 설정하세요.
클라이언트를 실행하고 한 클라이언트의 PeerID를 다른 클라이언트에 제공하고 네트워크 토폴로지가 홀 펀칭을 허용하는 경우 클라이언트 간에 암호화된 연결을 설정합니다.
ID
를 보내는 랑데뷰 서버에 "설정" 요청을 합니다.홀 펀칭 구현을 좀 더 간단하게 만들기 위해 클라이언트는 서로의 개인 IP 주소에 연결을 시도하지 않습니다. 동일한 NAT 뒤에 있는 클라이언트는 여전히 연결할 수 있지만 개인 IP 주소가 아닌 공용 IP 주소를 사용하여 연결됩니다. 제가 테스트한 라우터는 피어가 로컬 네트워크에 있다는 것을 이해하고 외부 인터넷으로 이동하지 않고도 연결을 용이하게 하는 것 같았습니다.