Project

girl

0.01
The project is in a healthy, maintained state
escape evil.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies
 Project Readme

girl

流量 -> 代理 ---!---> vps -> 目的地

代理,不论http,https,socks5,shadowsocks,会受到邪恶阻拦。

妹子,回避邪恶。

回避邪恶

代理受到阻拦,是因为协议,协议本身即是特征。

但如果人人拥有自己的特征,也就没了特征。

因此,妹子的设计非常简单,并不加密,仅开头一段随机流量,之后即进行消息来回,随机流量的长度,以及消息的带头字符,读自配置文件,配置文件随机生成。

没了,你已经做到了。

流程图

流量 -> 代理 -> 妹子近端 -> 域名命中proxy.white.txt?- hit -> 解析域名 -> ip命中proxy.direct.txt?- hit -> 目的地
                                              \                                             \
                                               \                                             `- no -> 远端 -> 目的地
                                                \
                                                 `- no -> 远端 -> 解析域名 -> 目的地

远端

通常是海外vps。

  1. 安装ruby,妹子:
dnf install ruby
gem install girl
  1. 创建 proxyd.run.rb:
require 'girl/proxyd'

Girl::Proxyd.new File.expand_path('../proxyd.conf.json', __FILE__)
  1. 启动远端:
ruby proxyd.run.rb
  1. proxyd.conf.json 样例:
{
    "proxyd_port": 6060, // 远端端口
    "ims": [ "taka-pc" ] // 允许的近端标识
}
  1. 做成服务:

/etc/systemd/system/proxyd.service

[Unit]
Description=girl proxyd
After=network.target

[Service]
PIDFile=/run/proxyd.pid
User=root
ExecStart=/usr/bin/ruby /boot/proxyd.run.rb
ExecStartPost=/bin/sh -c "echo $MAINPID > /run/proxyd.pid"

[Install]
WantedBy=multi-user.target

近端

可以是本机,内网服务器,路由器,各种派。

  1. 安装ruby:

windows:

访问 https://rubyinstaller.org/ 或者 https://rubyinstaller.cn/ 下载和安装ruby

ubuntu:

apt install ruby
  1. 安装妹子:
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
gem install girl
  1. 创建 proxy.run.rb:
#!/usr/bin/env ruby
require 'girl/proxy'

Girl::Proxy.new File.expand_path('../proxy.conf.json', __FILE__)
  1. 启动近端:
ruby proxy.run.rb
  1. proxy.conf.json 样例:
{
    "redir_port": 6666,                          // 代理端口
    "rsvd_port": 53,                             // dns端口
    "tspd_port": 7777,                           // 网关端口
    "proxyd_host": "1.2.3.4",                    // 远端服务器
    "proxyd_port": 6060,                         // 远端端口
    "direct_path": "/boot/proxy.direct.txt",     // 直连ip段
    "white_path": "/boot/proxy.white.txt",       // 直接解析的域名列表
    "nameserver": "114.114.114.114 192.168.1.1", // 直连dns服务器,多个用空格分隔
    "im": "taka-pc"                              // 近端标识
}
  1. proxy.direct.txt
curl -O http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest
cat delegated-apnic-latest | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > proxy.direct.txt
cat delegated-apnic-latest | grep ipv6 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, $5) }' >> proxy.direct.txt
  1. proxy.white.txt 样例:
# 此行及空白行会被忽略

biliapi.net
bilibili.com
bilibili.tv
bilivideo.com

国内dns服务器返回的查询结果中如果包含海外ip,和域名和结果ip都无关,你的ip会被上报给出海网关,和海外vps的通信会受到严格的,临时的限流,只要服务器在任意知名vps供应商的ip段内。

另外,和上报无关,vps发往国内的udp流量本身就受严格限流。

因此,必须以白名单的形式就近查询,白名单之外的域名必须走tcp中转查询。

妹子的代理及dns服务即按上述设计。

  1. 下载一个海外资源,比较一下速度:

直连:

curl -x '' -O https://fra-de-ping.vultr.com/vultr.com.100MB.bin

走妹子:

curl -x http://127.0.0.1:6666 -O https://fra-de-ping.vultr.com/vultr.com.100MB.bin

或者:

curl -x socks5h://127.0.0.1:6666 -O https://fra-de-ping.vultr.com/vultr.com.100MB.bin

妹子同时支持三种代理:http, http tunnel, socks5。

  1. 做成服务:

/etc/systemd/system/proxy.service

[Unit]
Description=girl proxy
After=network.target

[Service]
PIDFile=/run/proxy.pid
User=root
ExecStart=/usr/bin/ruby /boot/proxy.run.rb
ExecStartPost=/bin/sh -c "echo $MAINPID > /run/proxy.pid"

[Install]
WantedBy=multi-user.target

设备端设代理

不用装任何东西,直接填代理,系统自带的代理。

windows:

开始 > 设置 > 网络和Internet > 代理 > 手动设置代理 > 使用代理服务器 > 开 > 填近端的地址和端口
添加忽略:192.168.*;
勾选请勿将代理服务器用于本地(intranet)地址 > 保存

macos:

系统偏好设置 > 网络 > 选中一个连接 > 高级 > 代理 > 打勾http和https代理 > 填近端的地址和端口 > 好 > 应用
添加忽略:127/8, localhost, 169.254/16, 192.168/16

ios:

设置 > 无线局域网 > wifi详情 > 配置代理 > 手动 > 填近端的地址和端口 > 存储

android:

设置 > WLAN > 长按一个连接 > 修改网络 > 显示高级选项 > 代理 > 手动 > 填近端的地址和端口 > 保存

ps4:

设定 > 网路 > 设定网际网路连线 > 使用Wi-Fi/使用LAN连接线 > 自订 > 选择一个连接 > 一路默认到Proxy伺服器 > 使用 > 填近端的地址和端口 > 继续

ns:

设置 > 互联网 > 互联网设置 > 选择一个连接 > 更改设置 > 代理服务器设置 > 启用 > 填近端的地址和端口 > 保存

steam如果开了着色器预缓存会导致它忽略代理,务必关闭:设置 > 下载 > 启用着色器预缓存 > 关

dns服务

有的软件api走代理但cdn采取直连,且该cdn国内dns查询只能得到假ip,例如TikTok app。

妹子近端同时提供dns服务,会把该cdn的域名中转给远端查到真ip。

dns查询 -> 网关 -> 妹子dns端口 -> 命中缓存?- hit -> 返回ip
                            \
                             `- no -> 域名命中proxy.white.txt?- hit -> 就近解析域名 -> 返回ip
                                                              \
                                                               `- no -> 远端解析域名 -> 返回ip

让systemd-resolved不再监听53端口:

sed -i 's/#DNSStubListener=yes/DNSStubListener=no/' /etc/systemd/resolved.conf
systemctl restart systemd-resolved

手机里,dns改手动填192.168.1.59(派的内网ip),且只留它一个(避免解析到假ip),TikTok即可正常使用。

网关服务

有的软件会先直连再走代理,可能是为了先验ip,例如Grok app。

还有软件完全无视系统代理,无视环境变量,例如ns上的youtube。

妹子近端同时提供网关服务,可使直连也走妹子,然后区分国内外的去到远端中转。

流量 -> 网关prerouting -> 妹子网关端口-> ip命中proxy.direct.txt?-- hit ---> 目的地
                                                             \
                                                              `-> no -> 远端 -> 目的地

nft把tcp流量转给妹子的网关端口:

transparent.conf

flush ruleset ip

table ip nat {
    chain prerouting {
        type nat hook prerouting priority dstnat;
        ip daddr {1.2.3.4, 0.0.0.0/8, 10.0.0.0/8, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.168.0.0/16, 255.255.255.255} return
        tcp dport {80, 443} redirect to :53
    }

    chain postrouting {
        type nat hook postrouting priority srcnat;
        oif eth0 masquerade
    }
}

其中 1.2.3.4 为远端ip。

apt install nftables
nft -f transparent.conf
nft list ruleset ip

手机/游戏机/pc里,ipv4地址改为手动配置,网关和dns都设为192.168.1.59,Grok app等即可正常使用。

上了伪装的eth0每次收到数据包都需替换其源ip,会影响速度,可以用完去掉:nft flush ruleset ip

野外

野外手机上网,蜂窝网络环境,openvpn连国内vps是可正常用的,想上外网可搭配妹子。

国内vps里,nft配置同上,同时,openvpn服务端配置添加redirect-gateway,并设dns查询走vpn:

server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 10.8.0.1"