IPtProxy
为 iOS、MacOS 和 Android 提供的 Lyrebird/Obfs4proxy 和 Snowflake 可插拔传输
传输 | 版本 |
---|---|
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 生态系统中,通过利用仓库的顺序注入恶意包,以及在搜索顺序中排在原始版本之前的仓库释放恶意版本相对容易,因此,确保自己安全的方法就是在使用多个仓库时,明确声明哪些包应该从哪个仓库加载。
入门指南
如果您正在构建新的 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://s01.oss.sonatype.org/#staging-upload。
- 选择上传模式“工件包”。
- 上传包和发布。
另见:https://gitlab.com/-/snippets/2482490
作者
- Benjamin Erhart, [email protected]
- Nathan Freitas
- Bim
为Guardian Projecthttps://guardianproject.info
许可
IPtProxy可在MIT许可下获得。有关更多信息,请参阅LICENSE文件。