ssh: 使用「-L」与「-R」option登录局域网服务器并使能其使用本地代理

本文解决的问题:

  1. 一种使用「-L」option 使 ssh 能够通过跳板机登录局域网内服务器的方法
  2. 一种使用「-R」option 使远程服务器能通过 ssh 使用本地代理的方法

参考链接:

  1. 知乎专栏「SSH 基本用法」:https://zhuanlan.zhihu.com/p/21999778
  2. 简书「docker使用宿主机代理」:https://www.jianshu.com/p/01f0ee9086e2

使用「-L」连接局域网内服务器的方法

man 指令中对 -L 的描述是:

Specifies that connections to the given TCP port or Unix socket
on the local (client) host are to be forwarded to the given host
and port, or Unix socket, on the remote side.

即:将远程机器上的端口映射到本地端口。例如 -L portA:localhost:portB remote 就是将远程机器的 portB 端口映射到本地的 portA 端口上。它的实现原理在 man 手册中有详细的说明。

现在有跳板机 jump,访问 jump:1234 就可以跳转到 remote 上。可以使用以下命令实现这个目的:

ssh -NfL 22222:localhost:1234 -p 1234 username@jump
ssh -p 22222 username@localhost

其中,-N 指令意味不执行任何远程指令,即只建立连接、不做其他操作;-f 指令意为在后台运行。

使用「-R」指令让远程服务器使用本地代理

有时候因为 The Great Fire-Wall 的存在,需要让远程服务器使用代理访问某些资源,例如Google代码仓库等。实现这个目的的一种方式是使用 ssh 的 -R 指令。它的作用方式与 -L 相反,即将本地端口映射到远程端口上。

假设现在我们已经通过上述步骤连接到了远程服务器,且本地的代理端口为 8080,现在运行如下指令可以达到目的:

# local side
ssh -NfR 8080:localhost:8080 -p 22222 username@localhost
# login
ssh -p 22222 username@localhost
# remote side
export http_proxy=http://localhost:8080
export https_proxy=http://localhost:8080

扩展:在 Docker 中使用代理

在创建容器时添加如下选项,将容器的网络设置为本地网络,并在容器中设置对应的环境变量即可:

# host side
docker build -it ...[other options] --net=host imagename /bin/bash
# container side
export http_proxy=http://localhost:8080
export https_proxy=http://localhost:8080
posted @ 2022-11-14 20:10  WhoFO  阅读(661)  评论(0)    收藏  举报