通过 SSH 隧道引导所有 android 流量

Cat*_*lla 5 linux ssh android iptables cyanogenmod

我试图从无线提供商那里完全隐藏我手机上的所有流量。

我想通过 iptables 将流量通过 SSH 隧道引导到我的家庭路由器(不确定它们是否有帮助?)。

手机已植根并运行 CyanogenMod 7.1(因此具有 iptables 功能)。

我已经看过这个问题,但我对细节仍然有些犹豫。该问题描述了如何为单个端口执行此操作 - 但我如何为每个端口上的每个数据包执行此操作?

这个问题既有实践意义,也有学术意义。谢谢。

Mad*_*col 5

这并不能解决您的用例,因为这只会引导 Firefox 的流量,但您不需要 root


TL; 博士

  1. 在 android 上安装Termux应用程序,编辑重要提示: Termux 不再在 Play 商店接收更新。而是从 F-Droid 安装应用程序和附加组件。

  2. 在 termux 安装 openssh pkg i -y openssh

  3. 使用动态端口转发通过 ssh 进入服务器 ssh user@server -D12345

  4. 在android上安装Firefox Beta(此时,普通Firefox不支持配置about:config

  5. 打开 Firefox Beta,然后转到 about:config

  6. 搜索 proxy

  7. 查找并设置以下属性:

    network.proxy.allow_hijacking_localhost: true
    network.proxy.socks: localhost
    network.proxy.socks_port: 12345
    network.proxy.type: 1
    
    Run Code Online (Sandbox Code Playgroud)

    确保network.proxy.socks_port与上面 ssh 命令中的端口匹配

  8. 大功告成!,您现在正在 Firefox 上浏览 ssh 服务器


使用 ssh 密钥的完整说明

用法

  1. 打开 Termux 并运行ssh user@server -D12345(如果您之前运行过此命令,则只需按Up+ Enter
  2. 使用代理配置的 Firefox 导航
  3. 大功告成!,您的流量正在通过服务器

安装

设置安卓

终端

  1. 安装Termux

  2. 通过运行以下命令配置 ssh 客户端:

    # Ask for storage permission
    termux-setup-storage &&
    # Install openssh
    apt install -y openssh &&
    # Generate an SSH key
    ssh-keygen -t ecdsa -f ~/.ssh/id_ecdsa &&
    # Set a password for the private key
    # Get public key
    echo -e '\nCopy the following public key:'
    cat ~/.ssh/id_ecdsa.pub
    
    Run Code Online (Sandbox Code Playgroud)
  3. (可选)如果您可以使用 ssh 访问服务器,请运行:

    ssh-copy-id user@server
    
    Run Code Online (Sandbox Code Playgroud)

    如果没有,则需要手动将公钥添加到服务器。这在下面的设置服务器部分中进行了解释

火狐

  1. 安装Firefox Beta - 如果您可以访问正常的 firefox 可能会工作about:config

  2. 打开 Firefox 并转到 url about:config,搜索proxy并设置以下配置:

    network.proxy.allow_hijacking_localhost: true
    network.proxy.socks: localhost
    network.proxy.socks_port: 12345
    network.proxy.type: 1
    
    Run Code Online (Sandbox Code Playgroud)

    确保network.proxy.socks_port用法部分中ssh 命令中使用的端口匹配

设置服务器

如果您成功运行该命令ssh-copy-id,则此处无需执行任何操作。
但如果没有,则需要手动添加生成的公钥:

echo 'public key' >> ~/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

将来我将在此处保持最新状态:https : //github.com/madacol/knowledge/blob/master/Ssh%20poor-man's-vpn%20on%20android.md

  • 很不错!具有代理设置的 Firefox Beta 改变了游戏规则! (2认同)

Nik*_*kov 4

您尝试过使用sshtunnel吗?仅靠 iptables 不足以做到这一点。

至于实际如何完成的概述:

  1. 使用 ssh 登录到您的服务器并将 HTTP 代理端口转发到 Android 设备。因此,任何流量localhost:3128实际上都会流向远程计算机(您的家庭路由器)。
  2. 由于 Android 没有全局代理设置,因此您将所有流向端口 80(HTTPS 为 443)的流量重定向到localhost:3128. 这就是 iptables 发挥作用的地方:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to localhost:3128

如果您也想重定向其他协议,可以使用具有类似设置的 SOCKS 代理。要重定向DNS,通过隧道重定向端口53等。

总而言之,要完全隐藏“所有流量”并不那么容易,所以只需使用该应用程序即可。如果您想修补 Cyanogenmod 来执行此操作,请查看源代码并修改启动脚本。