공부/JUN STUDY

Wireguard VPN android 라이브러리 github 예제 (Anton2319) 분석 in Windows

JUNFUTURE 2024. 1. 2. 19:39

아래 자료들을 참고해 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/

 

GitHub - Anton2319/WireGuardExamples: Examples for https://github.com/Anton2319/Anton2319/blob/master/articles/wireguard-guide/a

Examples for https://github.com/Anton2319/Anton2319/blob/master/articles/wireguard-guide/article.md - GitHub - Anton2319/WireGuardExamples: Examples for https://github.com/Anton2319/Anton2319/blob/...

github.com

 

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의 구현채이다.