IPtProxy 3.8.1

IPtProxy 3.8.1

Benjamin Erhart 维护。



IPtProxy 3.8.1

IPtProxy

为 iOS、MacOS 和 Android 提供的 Lyrebird/Obfs4proxy 和 Snowflake 可插拔传输

JitPack Maven Central Version License Platform

传输 版本
Lyrebird 0.1.0
Snowflake 2.6.0

由于 Lyrebird/Obfs4proxy 和 Snowflake 可插拔传输都是用 Go 编写的,这在 iOS 和 Android 上使用起来可能有些麻烦。这个项目封装了所有必要的处理,并提供了一个易于安装的二进制文件,其中包括对这两个的包装器。

特别解决的问题包括

  • 无法使用 gomobile 编译 main 包。这两个 PT 都已经修改以避免这一问题。
  • 由于存在一些共有的 Go 运行时函数导出,您不能将两个 gomobile 框架作为依赖项,因此这两个 PT 在这里都予以整合。
  • 运行时环境变量更改在 Swift/Objective-C 中不会被 goptlib 识别。因此,在 Go 包装器中硬编码了一些合理的值。
  • Snowflake 和 Lyrebird/Obfs4proxy 都已经修补以接受所有配置参数。
  • 该库将自动找到要使用的空闲端口并将其返回给消费应用程序。您可以使用初始值进行早期配置,这在可以相当肯定它们将可用的情况下(通常在 iOS 上)是完全可以接受的。如果情况不是这样(例如,多用户 Android 上的您的应用程序的多个实例),则应首先启动传输,然后使用返回的端口配置其他组件(例如 Tor)。

iOS/macOS

安装

IPtProxy 通过 CocoaPods 提供。要安装它,请简单地在您的 Podfile 中添加以下行

pod 'IPtProxy', '~> 3.1'

入门

在开始使用 IPtProxy 之前,您需要指定一个磁盘位置,以便传输存储状态信息和日志文件。

从版本 2.0.0 开始,不再有默认设置! 这是出于安全考虑,特别是在 Android 上。

您需要在使用任何传输之前提供 StateLocation

let fm = FileManager.default

// Good choice for apps where IPtProxy runs inside an extension:

if let ptDir = fm
    .containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.app")? 
    .appendingPathComponent("pt_state")?
    .path
{
    IPtProxy.setStateLocation(ptDir)
}

// For normal apps which run IPtProxy inline:

if let ptDir = fm.urls(for: .documentDirectory, in: .userDomainMask)
    .first?
    .appendingPathComponent("pt_state")
    .path 
{
    IPtProxy.setStateLocation(ptDir)
}

还有一个配套的库 IPtProxyUI,它解释了 IPtProxy 的使用方法,并提供在 Tor 环境中使用此库所需的所有 UI 和附加信息。

Android

安装

从版本 1.9.0 开始,IPtProxy 通过 Maven Central 提供。要安装它,请简单地在您的 build.gradle 文件中添加以下行

implementation 'com.netzarchitekten:IPtProxy:3.1.0'

它还通过 JitPack 提供。要从那里安装它,请将以下行添加到您的 build.gradle 文件中

implementation 'com.github.tladesignz:IPtProxy:3.1.0'

并添加此行到您的根 build.gradle,在 repositories 的末尾

allprojects {
  repositories {
    // ...
    maven {
      url 'https://jitpack.io'
      content {
        includeModule('com.github.tladesignz', 'IPtProxy')
      }
    }
  }
}

对于在 Android Studio Bumblebee | 2021.1.1 或更高版本中创建的新 Android Studio 项目,需要在根级别的文件 settings.gradle 中添加 JitPack 仓库,而不是添加到 build.gradle 文件中。

dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
    // ...
    maven {
      url 'https://jitpack.io'
      content {
        includeModule('com.github.tladesignz', 'IPtProxy')
      }
    }
  }
}

安全问题

由于在 Java/Android 生态系统中,通过利用仓库的顺序注入恶意包,以及在搜索顺序中排在原始版本之前的仓库释放恶意版本相对容易,因此,确保自己安全的方法就是在使用多个仓库时,明确声明哪些包应该从哪个仓库加载。

https://docs.gradle.org.cn/5.1/userguide/declaring_repositories.html#sec::matching_repositories_to_dependencies

入门指南

如果您正在构建新的 Android 应用程序,请确保在您的 Android Manifest 中声明它使用 INTERNET 权限。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="my.test.app">

    <uses-permission android:name="android.permission.INTERNET"/>
    <application ...

在开始使用 IPtProxy 之前,您需要指定一个磁盘位置,以便传输存储状态信息和日志文件。

从版本 2.0.0 开始,不再有默认设置! 这是出于安全考虑,特别是在 Android 上。

在使用任何交通方式之前,您需要提供 StateLocation

Context#getCacheDir()Context#getFilesDir()Context#getNoBackupFilesDir() 是此处的良好选择。

不要使用应用私有存储之外的其他目录!

File ptDir = new File(getCacheDir(), "pt_state");

IPtProxy.setStateLocation(ptDir.getAbsolutePath());

构建

要求

该仓库包含预编译的iOS和Android版本IPtProxy。如果您想自行编译,则需要Go 1.16作为先决条件。

在编译iOS时,您需要安装Xcode,在编译Android时需要安装Android NDK。

构建脚本需要gomobile二进制文件,如果尚未安装,则会安装它。然而,您仍需要使其可在您的$PATH中访问。

因此,如果要添加,请将$GOPATH/bin添加到$PATH。默认的$GOPATH位置是$HOME/go

export PATH=$HOME/go/bin/:$PATH` 

iOS

请确保已安装Xcode及Xcode的命令行工具。然后运行

rm -rf IPtProxy.xcframework && ./build.sh

这将创建一个IPtProxy.xcframework,您可以直接将其拖到您的应用程序中,如果您不想依赖CocoaPods的话。

Android

请确保javac包含在您的$PATH中。如果您没有JDK实例,在Debian系统上,您可以使用以下命令安装:

apt install default-jdk 

如果它们尚不存在,请确保设置了$ANDROID_HOME$ANDROID_NDK_HOME环境变量

export ANDROID_HOME=~/Android/Sdk
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/$NDK_VERSION

rm -rf IPtProxy.aar IPtProxy-sources.jar && ./build.sh android

这将创建一个IPtProxy.aar文件,如果您不想依赖Maven Central或JitPack,可以直接将其拖到您的应用程序中。

在某些CPU架构上,由于Go 1.16不再支持某些设置标志,gobind可能会失败并显示错误。

go tool compile: exit status 1
unsupported setting GO386=387. Consider using GO386=softfloat instead.
gomobile: go build -v -buildmode=c-shared -o=/tmp/gomobile-work-855414073/android/src/main/jniLibs/x86/libgojni.so ./gobind failed: exit status 1

如果是这种情况,您需要将这些标志设置为编译IPtProxy

export GO386=sse2

发布

发布提交需要以下内容:

添加 变更日志

在以下位置更新 IPtProxy 和依赖项的版本号

执行全新构建

rm -rf IPtProxy.xcframework && ./build.sh
rm -f IPtProxy.aar IPtProxy-sources.jar && ./build-android.sh

标记并推送更改

git add .
git commit -m Release version <tag>.
git tag <tag>
git push
git push --tags

CocoaPods

pod trunk push

Maven Central

  • 运行bundle.sh方式如下
./bundle.sh <version> [<GPG signing key ID>] 

如果您没有定义您的签名密钥,将使用第一个可用的密钥。如果没有密钥,则不进行签名。Maven Central会拒绝未经签名的工件。

要查看您的可用密钥,请运行以下命令

gpg --list-secret-keys

另见:https://gitlab.com/-/snippets/2482490

作者

为Guardian Projecthttps://guardianproject.info

许可

IPtProxy可在MIT许可下获得。有关更多信息,请参阅LICENSE文件。