V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
lbyo
V2EX  ›  git

ssh -T [email protected] 出现 nc: Proxy error: "HTTP/1.1 200 Connection established" 的错误

  •  
  •   lbyo · 133 天前 · 1179 次点击
    这是一个创建于 133 天前的主题,其中的信息可能已经有所发展或是发生改变。

    系统环境

    • ZSH: 5.7.1 (x86_64-apple-darwin19.0)
    • ProductName: Mac OS X
    • ProductVersion: 10.15.7
    • BuildVersion: 19H524
    • ClashX Version: 1.65.0.2

    SSH config 内容:

    Host github.com gist.github.com gitlab.rightcapital.io
        Hostname %h
        User git
        IdentityFile ~/.ssh/ssh_rsa
        Compression yes
        ForwardAgent yes
        UseKeychain yes
        AddKeysToAgent yes
        ServerAliveInterval 30
    

    代理配置

    • 系统代理,未开启 Enhanced mode
    • mixed-port: 7890

    控制变量

    • oh-my-zsh 的 Shell Proxy plugin 开启前后
      • 该插件读取的 $DEFAULT_PROXY 被设置为 export DEFAULT_PROXY="http://127.0.0.1:7890"

    结果对比

    关闭 shell-proxy 时,ssh -T [email protected] 执行结果:

    ❯ ssh -T [email protected]
    Hi user! You've successfully authenticated, but GitHub does not provide shell access.
    

    dig github.com 执行结果:

    ❯ dig github.com
    
    ; <<>> DiG 9.10.6 <<>> github.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27922
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 1280
    ;; QUESTION SECTION:
    ;github.com.			IN	A
    
    ;; ANSWER SECTION:
    github.com.		11	IN	A	52.74.223.119
    
    ;; Query time: 8 msec
    ;; SERVER: 192.168.50.1#53(192.168.50.1)
    ;; WHEN: Tue Jul 20 20:14:34 CST 2021
    ;; MSG SIZE  rcvd: 55
    

    开启 shell-proxy 后,ssh -T [email protected] -vvv 执行结果:

    ❯ ssh -T [email protected] -vvv
    OpenSSH_8.1p1, LibreSSL 2.7.3
    debug1: Reading configuration data /Users/user/.ssh/config
    debug1: /Users/user/.ssh/config line 1: Applying options for github.com
    debug1: Reading configuration data /etc/ssh/ssh_config
    debug1: /etc/ssh/ssh_config line 47: Applying options for *
    debug1: Executing proxy command: exec /Users/user/.oh-my-zsh/plugins/shell-proxy/ssh-proxy.py github.com 22
    debug1: identity file /Users/user/.ssh/ssh_rsa type 0
    debug1: identity file /Users/user/.ssh/ssh_rsa-cert type -1
    debug1: Local version string SSH-2.0-OpenSSH_8.1
    nc: Proxy error: "HTTP/1.1 200 Connection established"
    kex_exchange_identification: Connection closed by remote host
    

    dig github.com 执行结果:

    ❯ dig github.com
    
    ; <<>> DiG 9.10.6 <<>> github.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18005
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 1280
    ;; QUESTION SECTION:
    ;github.com.			IN	A
    
    ;; ANSWER SECTION:
    github.com.		10	IN	A	13.250.177.223
    
    ;; Query time: 2 msec
    ;; SERVER: 192.168.50.1#53(192.168.50.1)
    ;; WHEN: Tue Jul 20 20:17:13 CST 2021
    ;; MSG SIZE  rcvd: 55
    
    20 条回复    2021-07-23 18:19:59 +08:00
    QingStone
        1
    QingStone   133 天前 via iPhone
    ClashX Pro - 增强模式,请。
    lbyo
        2
    lbyo   133 天前
    大概就是图片里这个执行步骤


    @QingStone

    我在主楼特意说了
    > 系统代理,未开启 Enhanced mode

    感觉它的实现并不好,所以不太想用 。代理 git 、ssh 协议的话,正好看到这个 shell-proxy 插件够用,只不过搞不懂为什么用不了,想弄明白,就这样
    ysc3839
        3
    ysc3839   133 天前 via Android
    如果不要求使用 ssh 的话,把 git 的传输协议换成 https 应该可以解决。
    lbyo
        4
    lbyo   133 天前
    @ysc3839 #3
    呃,看起来这也不是我想要的答案,我比较想搞清楚为什么开始 proxy 以后,ssh 协议出问题了,毕竟开启前是没有问题的
    lbyo
        5
    lbyo   133 天前
    @lbyo #4 开始 => 开启
    ryh
        6
    ryh   133 天前
    试试 ssh -vvvvA -T [email protected]
    ryh
        7
    ryh   133 天前
    man ssh
    ----

    -A Enables forwarding of the authentication agent connection. This can also be specified on a per-
    host basis in a configuration file.

    Agent forwarding should be enabled with caution. Users with the ability to bypass file permissions
    on the remote host (for the agent's UNIX-domain socket) can access the local agent through the for-
    warded connection. An attacker cannot obtain key material from the agent, however they can perform
    operations on the keys that enable them to authenticate using the identities loaded into the agent.
    lbyo
        8
    lbyo   133 天前
    @ryh #6

    看起来跟 `ssh -T [email protected] -vvv` 一样
    ```
    ❯ ssh -vvvvA -T [email protected]
    OpenSSH_8.1p1, LibreSSL 2.7.3
    debug1: Reading configuration data /Users/user/.ssh/config
    debug1: /Users/user/.ssh/config line 1: Applying options for github.com
    debug1: Reading configuration data /etc/ssh/ssh_config
    debug1: /etc/ssh/ssh_config line 47: Applying options for *
    debug1: Executing proxy command: exec /Users/user/.oh-my-zsh/plugins/shell-proxy/ssh-proxy.py github.com 22
    debug1: identity file /Users/user/.ssh/ssh_rsa type 0
    debug1: identity file /Users/user/.ssh/ssh_rsa-cert type -1
    debug1: Local version string SSH-2.0-OpenSSH_8.1
    nc: Proxy error: "HTTP/1.1 200 Connection established"
    kex_exchange_identification: Connection closed by remote host
    ```
    ryh
        9
    ryh   133 天前
    话说我用 3 个 v (其实有作用的只有 3 个 v😂)的时候 debug 的信息多多了 (ssh 版本号一样)


    显示完版本后就开始交换 key ( kex )的协议,你这就直接断了,感觉还是代理服务器的问题

    debug1: Local version string SSH-2.0-OpenSSH_8.1
    debug1: Remote protocol version 2.0, remote software version babeld-83b59434
    debug1: no match: babeld-83b59434
    debug1: Authenticating to github.com:22 as 'git'
    debug1: SSH2_MSG_KEXINIT sent
    debug1: SSH2_MSG_KEXINIT received
    debug1: kex: algorithm: curve25519-sha256
    debug1: kex: host key algorithm: rsa-sha2-512
    debug1: kex: server->client cipher: [email protected] MAC: <implicit> compression: none
    debug1: kex: client->server cipher: [email protected] MAC: <implicit> compression: none
    debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
    debug1: Server host key: ssh-rsa SHA256...
    zed1018
        10
    zed1018   133 天前
    既然你都配置 ssh config 了,直接配 nc 不行么。

    ```
    Host github.com
    ProxyCommand nc -x 127.0.0.1:1080 %h %p
    ```

    如果使用 socks4,则 ProxyCommand 部分替换为:

    ```
    ProxyCommand nc -X 4 -x 127.0.0.1:1080 %h %p
    ```

    如果使用 http proxy,则 ProxyCommand 部分替换为:
    ```
    ProxyCommand nc -X connect -x 127.0.0.1:1080 %h %p
    ```
    lbyo
        11
    lbyo   133 天前
    @zed1018 #10
    我把 SSH Config 中的 `ProxyCommand nc -X connect -x 127.0.0.1:7890 %h %p` 删掉了,就是想测试一下这个 plugin
    lbyo
        12
    lbyo   133 天前
    @zed1018 #10
    我遇到的 HTTP/1.1 200 Connection established 报错,是 HTTP 协议建立连接成功的消息,设置的 DEFAULT_PROXY 也是 HTTP 协议代理地址,现在猜测是不是 nc 命令只支持 SOCKS 协议
    lostberryzz
        13
    lostberryzz   133 天前
    我怀疑是 clash http proxy 的问题,建议 nc 使用 socks5,ssh over http 可以使用 corkscrew
    lbyo
        14
    lbyo   133 天前
    @lostberryzz #13
    问题排查出来了,就是 Clash X 的问题,7890 是 mixed port,不可以用,所以要在 config.yaml 里关闭 mixed port
    开启 port 或者 socks-port 然后就可以了
    lbyo
        15
    lbyo   133 天前
    @lostberryzz #13
    不过就算是 mixed port,直接使用 ProxyCommand nc -X 5 -x localhost:7890 %h %p 是没问题的
    lostberryzz
        16
    lostberryzz   133 天前   ❤️ 1
    @lbyo 所以说 nc 还是用 socks 协议吧,我 mix port 用的好好的没什么问题,改下 nc 的命令就行
    lbyo
        17
    lbyo   133 天前
    @lbyo #15
    shell-proxy 用的是 ProxyCommand nc -X connect -x localhost:7890 %h %p
    估计就是这个 connect 参数的问题吧
    no1xsyzy
        18
    no1xsyzy   132 天前
    我怀疑你要抓个包,可能因为什么原因产生了两层 connect
    lbyo
        19
    lbyo   131 天前
    @no1xsyzy #18
    这个问题解决,我上面可能没说清楚:
    netcat 的 `-X` 是 [proxy_protocol] 的意思,具体说明:
    > -X proxy_version
    > Requests that nc should use the specified protocol when talking to the proxy server. Supported protocols are ''4'' > > (SOCKS v.4), ''5'' (SOCKS v.5) and ''connect'' (HTTPS proxy). If the protocol is not specified, SOCKS version 5 is > > used.

    https://github.com/ohmyzsh/ohmyzsh/blob/master/plugins/shell-proxy/ssh-proxy.py#L11 这一行代码说明 shell-proxy 这个 plugin 传的是 `-X connect`,即指定的 Http(s) 代理,但是 Clash X 有个问题就是会默认帮忙开启 mixed port (即使你没有设置),具体行为可以看这里( https://github.com/yichengchen/clashX/issues/558#issuecomment-883569137 );开启 mixed port 的端口( 7890 )与 `-X connect` 不兼容,所以解决办法有两种:
    1. 在代码里把 `-X connect` 改成 `-X 5`(或者删掉,效果一样,因为:If the protocol is not specified, SOCKS version 5 is used.
    2. 在 Clash X 的配置里手动设置一个 http-port 来用
    no1xsyzy
        20
    no1xsyzy   130 天前
    @lbyo 你连到 mixed port 的时候难道不是走 HTTP CONNECT 协议吗?
    200 Connection established 应该会被 nc 吃掉才对啊至少我这边 CFW + wsl 开的 mixed port 没什么问题,可能是某处的 bug 导致了 nc 发送了 connect 却认为 socks5 链接成功。根据抓包可能是 clash 的问题或者 nc 的问题。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3048 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 04:17 · PVG 12:17 · LAX 20:17 · JFK 23:17
    ♥ Do have faith in what you're doing.