如何从 docker 容器通过 ssh 传输 TCP 流量?

Posted

技术标签:

【中文标题】如何从 docker 容器通过 ssh 传输 TCP 流量?【英文标题】:How to tunnel TCP traffic over ssh from a docker container? 【发布时间】:2019-02-09 13:05:05 【问题描述】:

这是我的情况: 我有一个基于 lambci/lambda:build-nodejs8.10 在家里本地运行的应用程序。应用程序通过两个 url 向远程服务器发送 https 请求。但是,远程服务器只接受来自我办公室网络的 IP 的请求。我可以使用 *** 连接到办公室网络,但它没有配置为给我一条通往互联网的路由,只访问网络上的机器。我能做的就是通过 ssh 连接到办公网络上的机器,这些机器可以访问互联网。

尝试解决方案和以前的解决方案: 在我只需要向一个 URL 发送请求之前,比如说 remote1.com。我通过 ssh 转发端口解决了这个问题,如下所示:

    在我的本地机器上连接到 ***

    使用 bash shell 以交互模式启动 docker 容器

    将remote1.com 的流量重定向到本地主机:

    echo "127.0.0.1 remote1.com" >> /etc/hosts

    通过 ssh 将流量转发到 127.0.0.1:443 到 office.machine.com:

    ssh user@office.machine.com -L 443:remote1.com:443

    从新终端连接到 docker 容器并启动应用程序。

这仅适用于一个远程 URL。尝试执行步骤 2-4 两次将不起作用,因为端口已被转发。

我尝试在 docker-container 上运行 sshuttle。安装它工作正常(通过克隆 git repo):

git clone https://github.com/sshuttle/sshuttle.git
cd sshuttle
sudo ./setup.py install

但运行它会导致以下错误:

iptables v1.4.18: can't initialize iptables table `nat': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
firewall manager: undoing changes.
firewall manager: undoing IPv4 changes.
iptables v1.4.18: can't initialize iptables table `nat': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
firewall manager: Error trying to undo IPv4 firewall.
firewall manager: ---> Traceback (most recent call last):
firewall manager: --->   File "/usr/local/lib/python2.7/site-packages/sshuttle-0.78.5.dev10+g561b648-py2.7.egg/sshuttle/firewall.py", line 270, in main
firewall manager: --->     method.restore_firewall(port_v4, socket.AF_INET, udp, user)
firewall manager: --->   File "/usr/local/lib/python2.7/site-packages/sshuttle-0.78.5.dev10+g561b648-py2.7.egg/sshuttle/methods/nat.py", line 99, in restore_firewall
firewall manager: --->     if ipt_chain_exists(family, table, chain):
firewall manager: --->   File "/usr/local/lib/python2.7/site-packages/sshuttle-0.78.5.dev10+g561b648-py2.7.egg/sshuttle/linux.py", line 33, in ipt_chain_exists
firewall manager: --->     raise Fatal('%r returned %d' % (argv, rv))
firewall manager: ---> Fatal: ['iptables', '-t', 'nat', '-nL'] returned 3
firewall manager: undoing /etc/hosts changes.
firewall manager: Error trying to undo /etc/hosts changes.
firewall manager: ---> Traceback (most recent call last):
firewall manager: --->   File "/usr/local/lib/python2.7/site-packages/sshuttle-0.78.5.dev10+g561b648-py2.7.egg/sshuttle/firewall.py", line 282, in main
firewall manager: --->     restore_etc_hosts(port_v6 or port_v4)
firewall manager: --->   File "/usr/local/lib/python2.7/site-packages/sshuttle-0.78.5.dev10+g561b648-py2.7.egg/sshuttle/firewall.py", line 51, in restore_etc_hosts
firewall manager: --->     rewrite_etc_hosts(, port)
firewall manager: --->   File "/usr/local/lib/python2.7/site-packages/sshuttle-0.78.5.dev10+g561b648-py2.7.egg/sshuttle/firewall.py", line 30, in rewrite_etc_hosts
firewall manager: --->     os.link(HOSTSFILE, BAKFILE)
firewall manager: ---> OSError: [Errno 18] Invalid cross-device link
fatal: ['iptables', '-t', 'nat', '-nL'] returned 3
c : fatal: cleanup: ['/usr/bin/python', '/usr/local/bin/sshuttle', '-v', '-v', '--method', 'auto', '--firewall'] returned 99
 s:   Ready: 1 r=[4] w=[] x=[]

我能做什么和不能做什么:

可以:

在我的本地 PC (Win/Ubuntu) 上安装软件和更改配置 在 docker-image 上安装软件(但并非所有软件包都默认可用)

不能:

在远程或办公室服务器上更改配置或安装软件

有没有办法通过 ssh 通过办公室计算机运行来自 docker 容器中运行的应用程序的所有(或所有 HTTPS 请求到两个特定 url)TCP 流量?

【问题讨论】:

【参考方案1】:

也许proxychains 可以帮助你。

首先,改变你的 ssh 命令,在 9050 端口打开一个 socks 代理:

ssh user@office.machine.com -D 9050

然后配置你的 docker 镜像以像这样启动节点:

proxychains node --node_parameters

这将导致节点应用程序发出的所有请求都通过位于 localhost:9050 的 socks 代理。

【讨论】:

以上是关于如何从 docker 容器通过 ssh 传输 TCP 流量?的主要内容,如果未能解决你的问题,请参考以下文章

Docker+SSH,如何定期将 docker 镜像从一台主机安全地传输到另一台主机?

如何通过 SSH 连接到 MySQL Docker 容器?

如何从Docker容器SSH到远程服务器

如何仅将 Docker 容器端口公开给 localhost,以便也可以通过 ssh 隧道访问它?

如何将 Kafka 消息通过管道传输到 docker 容器中?

如何从 Docker 容器克隆 Git 存储库