我在一所大学担任研究助理。我经常想通过 http 或 ssh 从家里连接到大学资源,但这些资源被阻止从外部访问。因此,他们有一个前端 ssh 服务器,我们可以从那里 ssh 进入其他主机。对于 http 访问,他们建议设置这样的 ssh 隧道
ssh -L 1234:proxyserver.university.fi:8080 publicsshserver.university.fi
并将浏览器的代理设置指向端口 1234
一切都很好并且正常运行,但我不想让我的所有其他互联网流量都通过这个代理服务器,并且每次我想连接到大学时,我都必须再次执行这些步骤。
我想要什么:
- 每次登录电脑时都设置一个 ssh 隧道。我有证书,所以不需要密码
- 有一种方法可以始终先通过 ssh 服务器重定向一些通配符域。这样当我在浏览器中输入 intra.university.fi 时,请求就会透明地通过隧道。当我想通过 ssh 进入大学内的另一个资源时也是如此
这可能吗?对于 http 部分,我想我可能应该设置自己的本地透明代理,以便轻松完成此操作。那么 ssh 部分呢?
答案1
这真的很容易做到。我一直用它来访问我们生产网络服务器后面的数据库。
1)第一部分是一个问题我之前问过。
您可以在 ~/.bashrc 中为其添加别名。
添加该行
alias university_ssh="ssh -L 1234:proxyserver.university.fi:8080 publicsshserver.university.fi"
并使用 source ~/.bashrc 重新加载 .bashrc 文件
现在你只需要输入 大学_ssh通过 ssh 连接到您的数据库服务器。
2)接下来,您需要编辑 /etc/hosts 文件以添加 university.loc(.loc 是假 TLD)并将其指向 localhost::1234。例如,我的 hosts 文件如下所示:
127.0.0.1 localhost
127.0.1.1 ubuntu-64-desktop
127.0.0.1 code2design.loc localhost
现在我可以输入 code2design.loc 来在我的电脑上访问本地版本的 code2design.com。
3)最后将浏览器代理改回无,因为你不再需要它了。自从输入大学.loc现在可以使用该隧道了。
更新
我会尝试将端口添加到主机文件(127.0.0.1:port
或) ,如果您担心虚拟主机中断,localhost:port
您还可以将.loc
TLD 更改为真实TLD。.fi
因此对你来说它可能看起来像这样:
127.0.0.1 localhost
127.0.1.1 ubuntu-64-desktop
127.0.0.1 university.fi localhost:1234
答案2
我使用代理自动配置 (PAC) 文件来实现这一点。我本来想在这里粘贴我的,但维基百科有一个不错的示例文件。
在浏览器中,将“使用代理自动配置”指向上述文件(可能托管在共享 Web 服务器上)。几乎可以在所有还算不错的浏览器中使用。
但请注意,您仍需要设置 SSH 隧道。(或者ssh -D
仅对 PAC 中定义的某些主机使用 SOCKS 代理 - 但 SOCKS 在 Opera 中不起作用。)
编辑:是的,由于您似乎不太感兴趣,我将稍微扩展我的答案。:-)
要自动设置您的 SSH 隧道,sudo apt-get install autossh
并将其放入您的 crontab 中:
@reboot autossh -L 1234:proxyserver.university.fi:8080 publicsshserver.university.fi
或者,您可以将 ssh 命令放在您的~/.bash_profile
~/.bashrc 中。
现在,至于确定要代理哪些域以及直接连接哪些域,请创建一个如下 PAC:
function FindProxyForURL(url, host)
{
var httpProxy = 'PROXY 127.0.0.1:1234';
var noProxy = 'DIRECT';
var default_ = noProxy;
// Host matches that use the HTTP proxy.
var httpProxyMatches = [
'intranet.university.fi',
'webmail.university.fi',
'*yourwildcard*'
];
// Check all host patterns and network masks.
for (var i = 0; i < httpProxyMatches.length; i++) {
if (shExpMatch(host, httpProxyMatches[i])) {
alert('HTTP ' + httpProxy + ' match for host: ' + host + '; url: ' + url);
return httpProxy;
}
alert('DEFAULT ' + default_ + ' for host: ' + host + '; url: ' + url);
return default_;
}
alert('PAC loaded at ' + new Date() + '.');
然后,转到 Firefox 的高级网络设置并将其指向该文件。如果成功,您将在 JavaScript 控制台 (Ctrl+Shift+J) 中看到“PAC loaded”消息。如果您不使用 Firefox,请删除“alert”行。
这是一个非常基本的 PAC,但它应该能帮到你。我的 PAC 还会查看 IP 网络掩码以确定内部/外部服务等。
让我们知道你的情况如何。
答案3
免责声明:还没有测试过,只是一个想法。
也许您可以通过简单地编辑本地系统上的主机配置来强制私有域使用“代理”。如果您手动将所有域指向本地主机,并建立隧道,则不会:
http://privateaccess.tld:1234
发送请求至:
localhost:1234
这实际上是到内部网络代理服务器的端口转发。请求仍应针对同一域,因此代理服务器应能正确响应。
至少在我看来是这样。再次重申,这只是一个想法。
答案4
尝试使用 ssh ( ) 设置 SOCKS-proxy,ssh -D <portnumber> publicsshserver.university.fi
并将浏览器配置为使用 127.0.0.1<portnumber>
作为代理。然后,您可以添加应该或不应该使用代理的域。对于其他服务(例如 vnc),您可以使用袜子使其使用你的隧道。