用于从Ruby on Rails应用发出HTTP请求的出站端口

时间:2018-08-14 08:10:58

标签: ruby-on-rails ruby http httparty

我的应用程序(在CentOS 6上的puma和nginx上,在puma上使用jRuby的Ruby on Rails)希望对远程REST API服务进行直接的服务器到服务器请求。 我的应用程序与服务所在的网络位于不同的网络中,这意味着IT部门必须配置防火墙,以便允许这些请求。

他们想知道

  • 源(IP和端口)和
  • 目标(IP和端口)

除了源端口以外,所有内容都非常简单。我的应用程序甚至可能只使用一个端口吗?如果没有,我至少可以提供一定范围的端口吗?如何配置?

1 个答案:

答案 0 :(得分:1)

解决方案

我刚刚看到了,您可以使用:local_port:local_host请求选项:

显然,如果要指定local_port,则必须指定local_host,这是一个局限性,一直下降到Socket,甚至可能是事件connect(2)

# Get the first local IP address which is not the loopback
# There are far better way of doing this, this is just for the example
addr = Socket.ip_address_list.select(&:ipv4?).detect{|addr| addr.ip_address != '127.0.0.1'}

# Start a connection using a predefined port
HTTParty.get 'http://google.com', local_port: 60000, local_host: addr.ip_address

如果要覆盖本地端口,则必须同时指定local_host和local_port的原因是Socket使用Addrinfo.getaddrinfo,如果仅指定了端口,它将返回环回地址。

这是由于getaddrinfo(3)

  

如果在hints.ai_flags中未设置AI_PASSIVE标志,则返回的套接字地址将适用于connect(2),sendto(2)或sendmsg(2)。如果node为NULL,则将网络地址设置为回送接口地址(对于IPv4地址,为INADDR_LOOPBACK,对于IPv6地址,为IN6ADDR_LOOPBACK_INIT);打算与在同一主机上运行的对等方进行通信的应用程序使用此地址。

在这种情况下未设置AI_PASSIVE,因为我们不想bind,而是connect

使用环回地址,因此外部网络无法访问,这就是为什么我们也需要指定local_host的原因。


原始答案

您可以这样操作:首先创建Net::HTTP实例,然后配置local_port(R / W属性),然后再开始连接。

如果使用任何其他方式建立连接,则可能需要查看文档以查看是否有这种方法。

http = Net::HTTP.new(address, port)
http.local_port = 666
http.local_host = 'your ip address'
http.start do
  # whatever
end

local_portattr_accessor@local_port直接用于打开TCP套接字:TCPSocket.open(conn_address, conn_port, @local_host, @local_port)