오늘 SingLinkVPN을 만드는 팀 SingLinkLabs가 SingLinkVPN 앱 1세대 프로토타입의 소스 코드를 Apache-2.0 라이선스로 GitHub에 공개했습니다. Windows, macOS, Android, iOS를 지원하는 일반 사용자용 VPN 앱으로, 이번에 함께 오픈 소스로 공개된 SingLink 프로토콜 위에 하나의 코드베이스로 만들어졌습니다.
이 앱은 프로토콜과 함께 공개됩니다. 자세한 내용은 SingLink 프로토콜 오픈 소스 공개 글을 참고하세요. 두 프로젝트를 함께 보면 연결 버튼부터 암호화된 패킷까지, 개방형 VPN 프로토콜과 완성된 클라이언트가 어떻게 맞물리는지 알 수 있습니다.
저장소: SingLinkLabs / singlink-vpn-app · 상태: 1세대 프로토타입 · 라이선스: Apache-2.0 · 기술 스택: 인터페이스는 Flutter(Dart), 코어는 Go
웹사이트에서 내려받는 앱과는 다릅니다
웹사이트에서 내려받는 공식 SingLinkVPN 앱과 앱 스토어의 앱은 별개의 제품입니다. 이 앱들은 SingLink 2.0을 비롯한 당사의 프로덕션 프로토콜로 동작하며, 그 핵심 소스 코드는 이번 공개에 포함되지 않습니다. 기존 사용자에게는 달라지는 것이 없습니다.
이 프로토타입은 개방형 SingLink 프로토콜의 레퍼런스 클라이언트입니다. 이 프로토콜을 지원하는 서버에만 연결되며, 계정 로그인 기능이 없습니다. 서버 링크를 붙여 넣거나 클립보드에서 가져와 서버를 직접 추가합니다. 어떤 앱 스토어에도 출시되어 있지 않습니다.
앱의 기능
한 번 탭으로 연결과 해제. 커다란 원형 버튼이 연결 안 됨, 연결 중, 연결됨의 세 가지 상태를 보여 줍니다.
보호 상태("Not protected" 또는 "Protected")와 연결 타이머.
내 IP. 연결하면 웹사이트에 보이는 출구 IP 주소를 표시합니다.
위치 선택. 서버가 국기와 함께 목록으로 표시되며, 맨 위에는 "Quick connect (auto)"가 있습니다. 연결된 상태에서 위치를 바꾸면 자동으로 다시 연결합니다.
정직한 지연 시간. 실제로 측정한 값만 보여 줍니다. 측정하지 않은 서버에는 지어낸 숫자 대신 "—"가 표시됩니다.
실시간 속도. 다운로드·업로드 속도와 함께 현재 세션에서 사용한 데이터양을 보여 줍니다.
알기 쉬운 오류 메시지. 다음에 무엇을 해야 하는지 알려 주고, 기술적인 세부 정보는 한 번 탭으로 확인할 수 있습니다.
라이트 모드와 다크 모드. 시스템 설정을 따릅니다.
두 가지 연결 모드
휴대폰에서는 기기 전체 VPN. Android는 시스템 VpnService를, iOS는 Network Extension을 사용합니다. 모든 앱의 트래픽이 터널을 거치며, DNS 조회도 터널 안에서 이루어집니다.
컴퓨터에서는 시스템 프록시 모드. 연결하면 앱이 시스템 프록시를 설정하고, 연결을 해제하거나 앱을 종료하면 이전 설정으로 되돌립니다. 연결 중에 앱이 강제 종료되었다면 다음 실행 때 설정을 복원합니다. 브라우저와 대부분의 앱은 시스템 프록시를 따르지만, 프록시 설정을 무시하는 일부 프로그램은 따르지 않습니다. 데스크톱용 패킷 수준 VPN(macOS의 Network Extension, Windows의 Wintun)이 다음 단계로 계획되어 있습니다.
구성 방식
하나의 Flutter 코드베이스로 네 가지 앱을 모두 만들며, 모든 플랫폼에서 같은 인터페이스를 제공합니다. 인터페이스는 영어입니다.
Go 코어에는 SingLink 프로토콜이 들어 있으며, 플랫폼별 네이티브 라이브러리로 컴파일되어 앱이 직접 호출합니다.
휴대폰에서는 코어에 Google의 gVisor 사용자 공간 네트워크 스택(Apache-2.0)이 더해져, 기기 전체의 트래픽을 SingLink 연결로 바꿉니다.
처음부터 새로 작성. Flutter가 새 프로젝트용으로 생성하는 빈 템플릿을 제외하면 모든 코드가 새로 작성되었습니다. 다른 VPN 앱의 코드, 아이콘, 이미지는 가져오지 않았습니다.
플랫폼별 현황
macOS 13 이상(Apple silicon): 시스템 프록시 모드. 빌드를 마쳤고 실제 연결로 테스트했습니다.
Android 7 이상: 기기 전체 VPN. APK를 빌드했고 Android 에뮬레이터에서 실제 연결로 테스트했습니다.
iOS 15 이상: 기기 전체 VPN. iOS 시뮬레이터에서 빌드되고 실행됩니다. 다만 시뮬레이터에서는 VPN 터널을 만들 수 없으며, 실제 iPhone에서 실행하려면 Apple Developer 계정이 필요합니다.
Windows 10 및 11(x64): 시스템 프록시 모드. 코어 라이브러리는 빌드되었습니다. 앱 자체는 Windows에서 컴파일해야 하며, 저장소에 이를 수행하는 GitHub Actions 워크플로가 포함되어 있습니다.
솔직한 한계
프로토타입입니다. 개발자와 연구자, 그리고 각 구성 요소가 어떻게 작동하는지 보고 싶은 분들을 위한 것이며, 공식 앱을 대체하기 위한 것이 아닙니다.
배포에는 추가 절차가 필요합니다. Mac용으로 공개 배포하려면 Apple 서명과 공증이 필요하고, 실제 iPhone에는 Apple Developer 계정이 필요하며, Android 빌드는 테스트 키로 서명되어 있습니다.
macOS 지원은 현재 Apple silicon(M-series) Mac의 macOS 13 이상으로 한정됩니다.
데스크톱은 시스템 프록시 모드를 사용하므로, 프록시 설정을 무시하는 프로그램은 아직 지원하지 않습니다.
기반 프로토콜은 아직 초안입니다. 내부 보안 검토는 거쳤지만 제3자 감사는 아직 받지 않았고, 중국 본토에서 실전 테스트도 하지 않았습니다.
서버 이름은 서버가 보내는 그대로 표시됩니다. 인터페이스를 모두 영어로 보려면 서버 이름을 영어로 지정하세요.
빌드하고 참여하기
플랫폼별 코어와 앱의 빌드 방법은 저장소의 README에 설명되어 있습니다. 프로토콜 코어는 별도 저장소인 SingLinkLabs / singlink-protocol에 있습니다.
질문, 버그 제보, Pull Request는 GitHub에서 언제든 환영합니다. 보안 취약점은 공개 Issue가 아닌 비공개로 제보해 주세요. 절차는 프로토콜 저장소의 SECURITY.md에 안내되어 있습니다.
라이선스와 상표
코드는 Apache-2.0 라이선스로 제공됩니다. 라이선스 조건에 따라 상업적 용도를 포함해 사용, 수정, 재배포할 수 있습니다. "SingLink"와 "SingLinkVPN"이라는 이름, 그 중국어 이름, 그리고 로고는 SingLinkLabs의 상표이며, 라이선스는 이를 사용할 권한을 부여하지 않습니다. 포크는 고유한 이름과 아이콘을 사용해야 합니다. 앱에는 gVisor 네트워크 스택이 포함되어 있으며, 이 역시 Apache-2.0 라이선스입니다.
