ssh通过Socks代理(最简单的方式)


今天,我遇到一个奇怪的问题.我需要在家用我的私人电脑穿透防火墙访问公司内部的git仓库(没有VPN客户端).但是公司的git服务器(git@git.corp.example.com)只允许SSH链接,不支持HTTP请求.

注意: git对 HTTP协议的仓库 支持HTTP代理.

# HTTP代理方法, 译者注
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'

总之,在网上有一堆解决基于SSH仓库代理的办法,但是大部分让人疑惑,或者需要额外的软件.

img-responsive

那…有更好的办法?

有一个更好的办法,我向你展示如何只使用OpenSSH和netcat中内置的功能以最小影响做到这一点.

1. 安装Socks代理

如果你还不知道Socks代理,你可以用OpenSSH创建一个.

(这对于网页浏览十分有用,就像你通过SSH连接的盒子上一样)

你可以通过添加 -D 参数来监听端口:

ssh -D 1080 jumphost.corp.example.com

这样操作, 你就像正常的SSH会话一样连接到 jumphost.corp.example.com, 它还会在localhost:1080上设置一个SOCKS代理.你可以打开浏览器的网络设置并设置socks代理到localhost的1080端口上来测试此功能.

现在,当你浏览网页时,来自jumphost.corp.example.com的请求会通过OpenSSH -D参数端口的SOCKS服务器传输.十分漂亮哈?

2. 在SSH配置中添加代理

所以,现在你有一个在localhost:1080上运行的SOCKS代理.你可以告诉OpenSSH使用该隧道来处理针对特定hostname的所有请求. 我们会用netcat(nc)来执行此操作.

添加下面的参数到你的 ~/.ssh/config文件中:

Host git.corp.example.com
  ProxyCommand=nc -X 5 -x localhost:1080 %h %p
# 参数介绍, 译者注

-X 5 表示 socks5
-X 4 表示 socks4
-X connect 表示 https

-x 当前代理的端口和地址

%h 目标hostname,请求传递的参数
%p 目标端口,请求传递的参数

正如你看到的,当我们执行ssh git.corp.example.com时, 事实上OpenSSH会用netcat通过localhost:1080代理网络数据流.

注意: 如果你不知道 netcat, 你应该了解一下! 它能通过网络连接发送原始数据流.

事实上,此操作十分优雅.之前OpenSSH直接发送到git.corp.example.com的数据流现在是通过我们用netcat创建(步骤1)的SOCKS隧道发送的.

3. 像大佬一样用Git

现在,我们在本地启动了一个SOCKS代理(步骤1),并告诉OpenSSH任何来自git.corp.example.com的请求都用代理执行.
没有什么其他要做的了,可以像往常一样使用Git了.

git clone git@git.corp.example.com/parabuzzle/jedimaster.git

这样就能拉取到我需要的内部代码.(不需要VPN客户端).

完成了! 喝杯啤酒, 享受下SysAdmin魔法的光辉!

4.参考链接

此文原文链接 mikeheijmans.com.
所有引用内容版权归原作者所有.
使用 知识共享“署名-非商业性使用-相同方式共享 3.0 中国大陆”许可协议 授权.

最近的文章

macOS获取应用BundleID并修改默认语言

一.获取Bundle ID 第一种办法: osascript -e 'id of app "SomeApp"' 举例如下:# MacBookPro:~ srefan$ osascript -e 'id of app "Safari"'com.apple.Safari 第二种办法: mdls -name kMDItemCFBundleIdentifier -r SomeApp.app 举例如下:MacBookPro:~ srefan$ mdls -name kMDItemCFBund...…

配置师继续阅读
更早的文章

Chisel-LLDB命令插件,让调试更Easy

一.概述 LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的开源调试器。LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的步骤来操作程序的进展。(这里有一个关于调试器如何工作的总体的解释。) 相信每个人或多或少都在用LLDB来调试,比如po一个对象。LLDB的是非常强大的,且有内建的,完整的 Python 支持。今天我们主要介绍一个 f...…

转载侠继续阅读