아래 자료들을 참고해 Wireguard 라이브러리를 사용하는 android 예제를 분석해보았다.
본 자료는 wireguard 라이브러리를 이용해 터널을 생성하고 간단한 Wireguard Connection을 가능하게 해주는 android 앱 예제 코드이다. 윈도우에서도 잘 작동하는 것을 확인 (2024.1.2)하였다.
본래 Wireguard 에서 제공하는 공식 wireguard-android 레포지토리가 있기는 하나, gradlew 실행 관련 문제로 윈도우에서 잘 실행이 되지 않았다.
참고자료
https://github.com/Anton2319/Anton2319/blob/master/articles/wireguard-guide/article.md
https://github.com/Anton2319/WireGuardExamples/
Config 정보 관리
TunnelModel.java
- vpn 커넥션을 위한 세팅 변수들이 담긴 파일이다.
- 여기에있는 변수들을 담을때 Datasource.java 에서 채워준다. 이때 API로 넣든 하드코딩으로 넣든 가능하다.
DataSource.java
TunnelDecoder.java
- 여기서는 DataSource에서 읽어온 JSON_STRING을 TunnelDecoder에서 파싱하여 TunnelModel 클래스를 리턴해준다.
package com.example.anton2319sdocsonwg;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.wireguard.config.InetNetwork;
import com.wireguard.config.ParseException;
public class TunnelDecoder {
public static TunnelModel decode(String jsonString) {
Gson gson = new Gson();
JsonObject json = gson.fromJson(jsonString, JsonObject.class);
TunnelModel model = new TunnelModel();
model.privateKey = json.get("user_info").getAsJsonObject().get("PrivateKey").getAsString();
model.IP = json.get("user_info").getAsJsonObject().get("Address").getAsString();
model.dns = json.get("user_info").getAsJsonObject().get("DNS").getAsString();
model.endpoint = json.get("user_info").getAsJsonObject().get("Endpoint").getAsString();
String allowedIPs[] = json.get("user_info").getAsJsonObject().get("AllowedIPs").getAsString().split(",\\s*");
for (String ip: allowedIPs) {
try {
model.allowedIPs.add(InetNetwork.parse(ip));
}
catch (ParseException e) {
e.printStackTrace();
}
}
model.publicKey = json.get("user_info").getAsJsonObject().get("PublicKey").getAsString();
model.url = json.get("server_info").getAsJsonObject().get("url").getAsString();
return model;
}
}
Persistent 연결을 위한 속성 클래스
WgTunnel
- wgTunnel은 wireguard 라이브러리에 내장되어있는 Tunnel을 상속받은 클래스이다. 추후 백엔드 서버에 setState 시에 전달되는 필수 인자이다.
backend.setState(tunnel, UP, new Config.Builder()
.setInterface(interfaceBuilder.addAddress(InetNetwork.parse(tunnelModel.IP)).parsePrivateKey(tunnelModel.privateKey).build())
.addPeer(peerBuilder.addAllowedIps(tunnelModel.allowedIPs).setEndpoint(InetEndpoint.parse(tunnelModel.endpoint)).parsePublicKey(tunnelModel.publicKey).build())
.build());
GoBackend
- 이건 wiregurad 라이브러리에 내장되어있는 클래스이다. vpn-service의 구현채이다.
'공부 > JUN STUDY' 카테고리의 다른 글
ubutnu에서 firebase 세팅법 (간단한 백엔드 웹서버 만들기) (0) | 2024.01.05 |
---|---|
MYSQL 설치 및 사용법 / 기본 CRUD 세팅 (ubuntu, node.js 이용) (0) | 2024.01.03 |
해킹대회(CTF) 출전을 위한 시스템해킹(Pwnable) 입문 (0) | 2023.07.13 |
ASCII 코드란? (컴퓨터가 표현할 수 없는 정보를 컴퓨터에 저장하는 방법) (0) | 2022.10.22 |
[Fuzzing101] Exercise 1 CVE-2019-13288 분석 (커맨드 분석하기) (0) | 2022.09.15 |