如何设置特定域通过隧道传输到另一台服务器

Pet*_*mit 11 ssh http tunnel ubuntu

我在一所大学担任研究助理。我经常想通过 http 或 ssh 从家里连接到大学资源,但它们被阻止从外部访问。因此,他们有一个前端 ssh 服务器,我们可以在那里通过 ssh 进入和从那里连接到其他主机。对于 http 访问,他们建议像这样设置 ssh 隧道

ssh -L 1234:proxyserver.university.fi:8080 publicsshserver.university.fi
Run Code Online (Sandbox Code Playgroud)

并将浏览器的代理设置指向端口 1234

一切都很好,工作正常,但我不想让我所有的其他互联网流量通过这个代理服务器,每次我想连接到大学时,我都必须再次执行这些步骤。

我想要什么:

  • 每次登录计算机时都设置 ssh 隧道。我有证书,所以不需要密码
  • 有一种方法总是首先通过 ssh-server 重定向一些通配符域。这样当我在浏览器中输入 intra.university.fi 时,请求就会通过隧道。当我想通过 ssh 进入大学内的另一个资源时也是如此

这可能吗?对于 http 部分,我想我可能应该设置自己的本地透明代理以轻松完成此操作。ssh部分怎么样?

jan*_*sen 8

为此,我使用了代理自动配置 (PAC) 文件。我会把我的贴在这里,但维基百科有一个很好的示例文件.

在您的浏览器中,将“使用代理自动配置来自”指向所述文件(可能托管在共享 Web 服务器上)。几乎适用于所有还不错的浏览器。

请注意,您仍然需要设置 SSH 隧道。(或者ssh -D仅对某些主机使用SOCKS 代理,在您的 PAC 中定义——但 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() + '.');
Run Code Online (Sandbox Code Playgroud)

然后,转到 Firefox 的高级网络设置并将其指向该文件。如果成功,您将在 JavaScript 控制台 (Ctrl+Shift+J) 中看到“PAC 已加载”消息。如果您不使用 Firefox,请删除“警报”行。

这是一个非常基本的 PAC,但它应该可以帮助您。我的还查看 IP 网络掩码以确定内部/外部服务等。

让我们知道你相处得如何。


Xeo*_*oss 8

这真的很容易做到。我一直使用它来访问我们生产网络服务器背后的数据库。

1)第一部分是我刚才问的一个问题。

你可以在你的 ~/.bashrc 中给它起别名。

添加该行

alias university_ssh="ssh -L 1234:proxyserver.university.fi:8080 publicsshserver.university.fi" 
Run Code Online (Sandbox Code Playgroud)

并使用 source ~/.bashrc 重新加载 bashrc 文件

现在您只需输入 university_ssh即可通过 ssh 连接到您的数据库服务器。

2)接下来,您需要编辑您的 /etc/hosts 文件以添加 university.loc(.loc 是一个假 TLD)并将其指向 localhost::1234。例如,我的主机文件如下所示:

127.0.0.1       localhost
127.0.1.1       ubuntu-64-desktop
127.0.0.1       code2design.loc    localhost
Run Code Online (Sandbox Code Playgroud)

现在我可以在我的 PC 上输入 code2design.loc 来访问我本地版本的 code2design.com。

3)最后将您的浏览器代理改回无,因为您不再需要它。由于现在输入university.loc已设置为使用该隧道。

更新

我会尝试将端口添加到主机文件(127.0.0.1:portlocalhost:port),如果您担心虚拟主机损坏,您也可以将.locTLD更改为真正的.fiTLD。

所以对你来说它可能是这样的:

127.0.0.1       localhost
127.0.1.1       ubuntu-64-desktop
127.0.0.1       university.fi    localhost:1234
Run Code Online (Sandbox Code Playgroud)

  • 你是。严肃地说。来自“man Hosts”:“IP_address canonical_hostname [aliases...]”。IMO,这不是一个足够的解决方案。 (2认同)