Docker容器无法使用IP白名单连接到主机应用程序

时间:2017-01-19 15:53:24

标签: docker interactive-brokers

我的主机上运行的应用程序具有以下功能:它侦听端口4001(可配置),只接受来自可信IP地址白名单的连接(默认情况下只有127.0.0.1,可以添加其他地址)但是一个接一个,不使用面具)。

(这是在java中运行的交互式代理网关应用程序,但我认为这不重要)

我在docker容器中运行另一个需要连接到宿主应用程序的应用程序。

(这是一个访问IB API的python应用程序,但我认为这并不重要)

最终我会在多台机器上尝试多个容器,但是我甚至无法让它在同一台机器上运行。

sudo docker run -t  myimage

Error: Couldn't connect to TWS.  Confirm that "Enable ActiveX and Socket Clients" is enabled on the TWS "Configure->API" menu.

(IB网关在主机上无响应)

理想我可以设置docker容器/网桥,以便所有docker容器看起来好像在特定的IP地址上,将它添加到白名单中,然后瞧。

我尝试了什么:

1)使用-p和EXPOSE

sudo docker run -t -p 4001:4001 myimage

绑定0.0.0.0:4001失败:端口已经分配。

(网关无响应)

此eithier不起作用或导致“已使用的端口”冲突。我知道这些设置是针对相反的问题而设计的(主机无法看到容器上的特定端口)。

2)设置--net = host

sudo docker run -t --net = host myimage

读取套接字时发生异常 - 由对等方重置连接

(网关无响应)

这应该有效,因为docker容器现在应该看起来像127.0.0.1 ......但它没有。

3)设置--net = host并将本地主机的真实IP地址192.168.0.12(如评论中所示)添加到白名单

sudo docker run -t --net = host myimage

读取套接字时发生异常 - 由对等方重置连接

(网关无响应)

4)将172.17.0.1,... 2,... 3添加到主机应用程序的白名单中(桥接网络为172.17.0.0,后续容器在此范围内分配)

sudo docker run -t  myimage

Error: Couldn't connect to TWS.  Confirm that "Enable ActiveX and Socket Clients" is enabled on the TWS "Configure->API" menu.

(主持人没有回应)

这非常hacky但是没有更好的工作。

PS注意这与尝试在容器内运行主机应用程序IB网关的问题不同 - 我不这样做。

我不想在另一个容器中运行宿主应用程序,尽管在某些方面可能是一个更简洁的解决方案。

4 个答案:

答案 0 :(得分:3)

运行IB网关在许多不同的级别上都很棘手,包括连接它,特别是如果你想自动化这个过程。

我们仔细研究了从其他IP连接到它,并最终放弃了 - 据我们所知,网关错误。有一个设置可以连接到网关的白色IP,但它不起作用,不能编写脚本。

在我们的构建过程中,我们创建一个docker基础映像,然后将网关和任何/所有网关的客户端添加到该映像。然后我们运行最终图像。

答案 1 :(得分:3)

(代表OP发布)

设置--net=host并从4001更改端口,以便它不会与同一网络上的网关的实时版本冲突。白名单中唯一需要的IP地址是127.0.0.1。

sudo docker run -t --net=host myimage

答案 2 :(得分:2)

使用socat将端口从网关转发到可以侦听任何地址的新端口。例如,将网关设置为侦听端口4002(仅限localhost)并使用容器中的命令

socat tcp-listen:4001,reuseaddr,fork tcp:localhost:4002

将端口转发到4001。 然后,当使用参数-p 4001:4001运行容器时,您可以使用端口4001从容器外部连接到网关。

答案 3 :(得分:1)

如果此功能对另一个人有用。我尝试了一些建议,将这些建议从运行在python容器上的Docker应用程序连接到运行在另一台服务器上的TWS IBGateway实例,但它们都没有100%正常工作。 socat选项正在连接,但是由于socat缓冲区存在我们无法修复的问题,连接被断开了。 我们发现的解决方案是从运行Docker容器的计算机到运行TWS IBGateway的计算机创建ssh隧道。

ssh -i ib-gateway.pem <ib-gateway-server-user>@<ib-gateway-server-ip> -f -N -L 4002:127.0.0.1:4001

建立此ssh隧道后,可以测试它的运行状态

telnet 127.0.0.1 4002

如果此命令成功运行,则您的ssh隧道已准备就绪。下一步是将python应用程序配置为在端口127.0.0.1上连接到4002,并用--net=host启动docker容器,以便能够访问在其上运行的ssh隧道Docker主机。