IrineSistiana/simple-tls

SIP003 android 不能正常工作

kuyagic opened this issue · 20 comments

服务器端相关配置
shadowsocks-libev server

{
    "server":"127.0.0.1",
    "server_port":8888,
    "local_port":1080,
    "password":"password",
    "timeout":60,
    "method":"aes-128-gcm"
}

simple-tls cmd line

/usr/local/bin/simple-tls -b <server_ip>:2083 -d 127.0.0.1:8888 -s -cert /root/.acme.sh/<domain>/fullchain.cer -key /root/.acme.sh/<domain>/<domain>.key -wss -path /cdn

使用cloudflare 作为此 服务器的 前端
假设cdn 域名为 <cdn-domain>

其中 上述simple-tls 服务器端 指定的证书内包含了 <cdn-domain> 的 DNS name

在 linux 虚拟机中
simple-tls cmd line

simple-tls -n <cdn-domain> -b 127.0.0.1:9050 -d <cdn-domain>:2083 -wss -path /cdn

shadowsocks-libev client cmd line

ss-local -s 127.0.0.1 -p 9050 -l 9988 -k password -m aes-128-gcm

然后 测试 9050 socks5 端口能正常工作

然后下面是 android ss + SIP003 插件配置

SS 基本配置
服务器 : <cdn-domain>
端口 : 2083
密码加密方式同 server

SIP003配置

path=/cdn;wss;n=<cdn-domain>;

然后链接后 测试不通过.

在Cloudflare上操作,如下图:
Screenshot_20200602-102601__01

在Cloudflare上操作,如下图:
Screenshot_20200602-102601__01

经过测试 问题依旧. 因为使用的是 强制的 https 的端口 2083 应该和这个TLS 设置没有很大关系

主要是 linux 上 是可以链接的 .另外测试了 用 simple-tls 转发通过cf的ws下的 纯socks5 代理 也是可以成功的.

但是 SIP003 总是测试失败 没有更多的日志 服务器上的 simple-tls 也没有报错.

另外我在 SIP003 上测试不使用 CDN 直接使用 <domain>:2083 也是失败.
直接用 https://<domain>:2083/cdn 和 访问 https://<cdn-domain>:2083/cdn
返回是相同的错误

WebSocket protocol violation: Connection header "Keep-Alive" does not contain Upgrade

服务器端的 simple-tls 也是返回如上错误

但是直接访问 http://<cdn-domain>:2083 的话是返回

400 Bad Request
The plain HTTP request was sent to HTTPS port
cloudflare

所以cf 到我服务器应该确实走的是 https的协议 和 TLS 设置无关

我在安卓手机端用此插件的CDN模式,可以正常连接,没看出来你的是什么状况。

/usr/local/bin/simple-tls -b <server_ip>:2083 -d 127.0.0.1:8888 -s -cert /root/.acme.sh/<domain>/fullchain.cer -key /root/.acme.sh/<domain>/<domain>.key -wss -path /cdn

你似乎应该把 -b <server_ip>:2083 改成 -b 0.0.0.0:2083-b :2083

@kuyagic 意思是只有Android的插件不能用?

需要提供 Android 的log才能确定问题。

adb执行

logcat | grep libss

注意打码保护隐私

@kuyagic 意思是只有Android的插件不能用?

需要提供 Android 的log才能确定问题。

adb执行

logcat | grep libss

注意打码保护隐私

我服务器环境拆了...如果你这里有条件可以设置下使用 cf 的 2083的 https 端口来复现下 Android 的问题. 我linux 下是正常的 可能还是apk 问题

/usr/local/bin/simple-tls -b <server_ip>:2083 -d 127.0.0.1:8888 -s -cert /root/.acme.sh/<domain>/fullchain.cer -key /root/.acme.sh/<domain>/<domain>.key -wss -path /cdn

你似乎应该把 -b <server_ip>:2083 改成 -b 0.0.0.0:2083-b :2083

我服务器是多IP的 所以写了 指定的IP地址 并 CF 的记录里也是对应好的. 这个应该不是问题.
等有时间明天 我再试试看 尝试抓下 Android Log

@kuyagic 意思是只有Android的插件不能用?

需要提供 Android 的log才能确定问题。

adb执行

logcat | grep libss

注意打码保护隐私

下面是 adb 的日志 看上去可能还是 端口号没有正确处理的问题

adb logcat | findstr libss
06-02 19:34:36.793  8198  8198 D GuardedProcessPool: start process: /data/app/xyz.truenight.shadowsocks-2J-SPA1C7KuheMEZs3ipJw==/lib/arm64/libss-local.so -b 127.0.0.1 -l 1080 -t 600 -S /data/user_de/0/xyz.truenight.shadowsocks/no_backup/stat_main -c /data/user/0/xyz.truenight.shadowsocks/no_backup/shadowsocks.conf -V -u --acl /data/user_de/0/xyz.truenight.shadowsocks/no_backup/bypass-lan-china.acl --fast-open
06-02 19:34:36.971  8198  7526 E libss-local: 2020/06/02 11:34:36 main: simple-tls
06-02 19:34:36.971  8198  7526 E libss-local: 2020/06/02 11:34:36 main: simple-tls is running as a sip003 plugin
06-02 19:34:37.083  8198  7526 E libss-local: 2020/06/02 11:34:37 setsockopt: TCP_FASTOPEN_CONNECT, protocol not available
06-02 19:34:37.339  8198  7526 E libss-local: 2020/06/02 11:34:37 setsockopt: TCP_FASTOPEN_CONNECT, protocol not available
06-02 19:34:40.081  8198  7526 E libss-local: 2020/06/02 11:34:40 ERROR: doClient: dialWebsocketConn: failed to WebSocket dial: failed to send handshake request: Get "https://<cdn-domain>/cdn": context deadline exceeded
06-02 19:34:40.333  8198  7526 E libss-local: 2020/06/02 11:34:40 ERROR: doClient: dialWebsocketConn: failed to WebSocket dial: failed to send handshake request: Get "https://<cdn-domain>/cdn": context deadline exceeded
06-02 19:34:44.370  8198  7526 E libss-local: 2020/06/02 11:34:44 setsockopt: TCP_FASTOPEN_CONNECT, protocol not available
06-02 19:34:47.360  8198  7526 E libss-local: 2020/06/02 11:34:47 ERROR: doClient: dialWebsocketConn: failed to WebSocket dial: failed to send handshake request: Get "https://<cdn-domain>/cdn": context deadline exceeded
06-02 19:34:48.610  8198  7526 E libss-local: 2020/06/02 11:34:48 setsockopt: TCP_FASTOPEN_CONNECT, protocol not available
06-02 19:34:51.386  8198  7526 E libss-local: 2020/06/02 11:34:51 setsockopt: TCP_FASTOPEN_CONNECT, protocol not available
06-02 19:34:51.608  8198  7526 E libss-local: 2020/06/02 11:34:51 ERROR: doClient: dialWebsocketConn: failed to WebSocket dial: failed to send handshake request: Get "https://<cdn-domain>/cdn": context deadline exceeded
06-02 19:34:53.429  8198  7526 E libss-local: 2020/06/02 11:34:53 setsockopt: TCP_FASTOPEN_CONNECT, protocol not available
06-02 19:34:53.627  8198  7526 E libss-local: 2020/06/02 11:34:53 setsockopt: TCP_FASTOPEN_CONNECT, protocol not available
06-02 19:34:54.377  8198  7526 E libss-local: 2020/06/02 11:34:54 ERROR: doClient: dialWebsocketConn: failed to WebSocket dial: failed to send handshake request: Get "https://<cdn-domain>/cdn": context deadline exceeded
06-02 19:34:56.427  8198  7526 E libss-local: 2020/06/02 11:34:56 ERROR: doClient: dialWebsocketConn: failed to WebSocket dial: failed to send handshake request: Get "https://<cdn-domain>/cdn": context deadline exceeded
06-02 19:34:56.464  8198  7526 E libss-local: 2020/06/02 11:34:56 setsockopt: TCP_FASTOPEN_CONNECT, protocol not available
06-02 19:34:56.626  8198  7526 E libss-local: 2020/06/02 11:34:56 ERROR: doClient: dialWebsocketConn: failed to WebSocket dial: failed to send handshake request: Get "https://<cdn-domain>/cdn": context deadline exceeded
06-02 19:34:58.414  8198  7526 E libss-local: 2020/06/02 11:34:58 setsockopt: TCP_FASTOPEN_CONNECT, protocol not available
^C^C

理论上 访问的应该是 https://<cdn-domain>:2083/cdn 这个wd 地址. 可能只处理了 默认的 443 端口

@kuyagic

理论上 访问的应该是 https://:2083/cdn 这个wd 地址. 可能只处理了 默认的 443 端口

已测试443,2083,2087端口,均可连接,不能复现问题。即使开启wss模式,simple-tls也会遵守shadowsocks-andorid里设置的端口。

另外好像你用的并不是官方的shadowsocks-andorid。

可能是shadowsocks版本问题或系统问题。

@kuyagic 难道是Cloudflare的WebSockets没打开?
Screenshot_20200602-195542

@kuyagic 难道是Cloudflare的WebSockets没打开?
Screenshot_20200602-195542

确认已经开了 websocket 因为这个域名我一直在用 websocket 的.

@IrineSistiana 我发现上一个版本的rh参数,只能在自签证书模式下使用,我只试成功过tls+自签证书的模式。CDN模式时使用rh参数,是无法连接。当然还有其他组合没有测试,不知道新版本能行不。在没有电脑在身旁的情况下,单用手机去测试实在麻烦,只能在这里反馈下,抱歉!

@kuyagic

理论上 访问的应该是 https://:2083/cdn 这个wd 地址. 可能只处理了 默认的 443 端口

已测试443,2083,2087端口,均可连接,不能复现问题。即使开启wss模式,simple-tls也会遵守shadowsocks-andorid里设置的端口。

另外好像你用的并不是官方的shadowsocks-andorid。

可能是shadowsocks版本问题或系统问题。

使用了 官方的shadowsocks-andorid 后 问题依旧. logcat 内容相同
手机是 Oneplus 5 系统是 Pixel Experience 2020-05-29 build 版本

@kuyagic

理论上 访问的应该是 https://:2083/cdn 这个wd 地址. 可能只处理了 默认的 443 端口

已测试443,2083,2087端口,均可连接,不能复现问题。即使开启wss模式,simple-tls也会遵守shadowsocks-andorid里设置的端口。
另外好像你用的并不是官方的shadowsocks-andorid。
可能是shadowsocks版本问题或系统问题。

使用了 官方的shadowsocks-andorid 后 问题依旧. log cat 内容相同

@IrineSistiana 我发现上一个版本的rh参数,只能在自签证书模式下使用,我只试成功过tls+自签证书的模式。CDN模式时使用rh参数,是无法连接。当然还有其他组合没有测试,不知道新版本能行不。在没有电脑在身旁的情况下,单用手机去测试实在麻烦,只能在这里反馈下,抱歉!

另外 我在开启 rh 模式后 代理最简单的 3proxy提供的 socks5 代理时候失败

simple-tls 客户端输出如下

ERROR: doClient: openTunnel: random header is too short or too large

服务器端没有输出

客户端命令行如下

simple-tls -n <cdn-domain> -b 127.0.0.1:9050 -d <cdn-domain>:2083 -wss -path /cdn -rh

测试命令

curl --socks5 127.0.0.1:9050 -L ifconfig.co

-b <server_ip>:2083 改成 -b 0.0.0.0:2083 或 -b :2083

你有试过上面这个么? @kuyagic

-b <server_ip>:2083 改成 -b 0.0.0.0:2083 或 -b :2083

你有试过上面这个么?

这个不是问题
我linux下是成功的 ip绑定 我是多ip的 所以指定了IP 而没有用 all interface

-b <server_ip>:2083 改成 -b 0.0.0.0:2083 或 -b :2083

你有试过上面这个么? @ kuyagic

或许我们可以 用 IM 来交流下
https://t.me/duyaoo
如果方便的话 可以私聊我

@kuyagic

你还是等大佬处理吧, 我是真不知道咋回事了。😀

@kuyagic

你还是等大佬处理吧, 我是真不知道咋回事了。😀

好的 @IrineSistiana 大佬如果有需要可以 telegram 联系我

我猜是因为用的是shadowsocks-android beta版。

beta版(5.0.6以上)不知道从哪个版本开始把插件参数格式改了。插件会导致连不上。simple-tls v0.4.2 已做出修正。

因为是古老的issue我就close了。