0

我使用 制作了一个简单的代理服务器nc,这里是单线:

mkfifo queueueue
nc -l 8080 <queueueue | nc http://$JENKINS_HOSTNAME 80 >queueueue

它侦听端口 8080,然后将数据转发到与我们的 Jenkins 服务器的连接。Jenkins 在 VPN 后面,我运行此代理的机器具有 VPN 访问权限。

在我的另一台机器上(没有 VPN 访问权限),我想访问curlJenkins 服务器,这是通过代理发起请求的命令:

http_proxy=10.1.10.10:8080 curl --user $JENKINS_USERNAME:$JENKINS_PASSWORD http://$JENKINS_HOSTNAME/api/json

客户端和代理机器都在同一个网络上,我可以在它们之间ping和ssh,另外,我知道客户端正在连接代理服务器,我认为客户端尝试身份验证时会出现故障,这里是我尝试卷曲时的输出:

$ http_proxy=10.1.10.10:8080 curl --user $JENKINS_USERNAME:$JENKINS_PASSWORD http://$JENKINS_HOSTNAME/api/json
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="<some other url>">here</a>.</p>
<hr>
<address>Apache Server at $JENKINS_HOSTNAME Port 80</address>
</body></html>

如何使用 HTTP 基本身份验证通过这样的代理卷曲?

4

1 回答 1

1

我会为此使用 ssh 而不是 netcat。

为了避免混淆,我将具有 VPN 访问权限的节点称为“服务器”,将没有 VPN 访问权限的节点称为“客户端”。

在服务器端,您应该只需要安装并运行 ssh 服务器(在我的测试中,我有 OpenSSH_5.9p1,OpenSSL 0.9.8r 8 Feb 2011)。

在客户端,您需要执行以下操作:

1) 在您的 /etc/hosts 文件中添加您的目标 URL 在服务器上解析的地址。我无法让 curl 通过代理运行 DNS 查找,这就是为什么这是必要的。

2) 在服务器和客户端之间设置 ssh 密钥。虽然这不是必需的,但它使生活更轻松。

3) 运行以下 ssh 命令让 ssh 充当 SOCKS 代理:

user@host$ ssh -vND 9999 <server>

-v 在那里你可以看到 ssh 发生了什么, -N 告诉 ssh 不要执行远程命令 - 这对于简单的端口转发很有用 -D 这个选项实际上是把你的本地请求转发到服务器

4)现在您应该能够运行上面的 curl 命令,但添加

---socks5 localhost:9999

您的完整命令将如下所示:

curl --user $USER:$PASSWORD --socks5 localhost:9999 http://$JENKINS/api/json

如果我能弄清楚如何通过 ssh 从 curl 转发 DNS 请求,我将更新票证。

编辑:格式,糟糕的语法。

于 2013-05-13T23:06:25.270 回答