首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

5.安装Orber | 5. Installing Orber

5.1安装过程

本章介绍如何在Erlang环境中安装Orber。

制备

首先,您必须决定是否要将Orber作为一个:

  • 单节点(非分布式) - 与其他Orber实例和其他供应商提供的ORB的所有通信均使用OMG GIOP协议。
  • 多节点(分布式) - 同一个Orber节点domain通过Erlang分发协议进行通信。对于所有其他Orber实例,即不属于domain其他供应商的ORB的一部分,使用OMG GIOP协议。

使用哪种方法是高度特定于实现的,但是您应该考虑几件事情:

  • Orber域中的所有节点都应该具有相同的安全级别。
  • 如果容量大于负载(流量),单节点Orber可能是一个很好的解决方案。
  • 在某些情况下,分布式系统架构需要单节点Orber安装。
  • 多节点Orber使负载平衡成为可能,并创建了一个更容错的系统。如果使用分布式Mnesia表,则对象也可以具有统一的视图。
  • 由于GIOP协议产生比Erlang分发协议更大的开销,因此与ORB间通信(GIOP)相比,在与同一Orber域内的对象进行通信时性能会更好。

您还必须决定是否希望Orber使用disc_copies和/或存储内部数据ram_copies。您应该选择哪种存储类型取决于您的应用程序中是否打算使用Mnesia。如果您打算使用,disc_copies您必须先创建一个Mnesia模式,其中包含有关计划运行Orber的Erlang节点位置的信息。有关更多背景信息,请参阅Mnesia文档。

在某些情况下,绝对有必要更改Orber的默认配置。 例如,如果两个Orber-ORB应能够通过GIOP进行通信,则它们必须具有唯一的域域。 请参阅配置设置部分。 如果您遇到任何问题; 请参阅本用户指南中关于调试的章节。

跳跃启动Orber

启动Orber最简单的方法是使用orber:jump_start(Port),它启动一个带有(很可能)唯一域(即“IP-number:Port”)的单节点ORB。 此功能只能在开发和测试过程中使用。 对于任何其他情况,请按照以下各节所述安装并启动Orber。 侦听端口,即iiop_port配置参数,被设置为提供的端口。

警告

使用orber时,如何配置Orber:jump_start(端口)可能会随时更改而不会发出警告。 因此,此操作不得用于交付给客户的系统中。

安装单节点Orber

由于单个节点Orber通过OMG GIOP协议进行通信,所以不需要启动Erlang分发(即使用-name / -sname)。

如果我们用ram_copies不需要创建基于磁盘的架构。只需使用:

代码语言:javascript
复制
erl> mnesia:start().
erl> corba:orb_init([{domain, "MyRAMSingleNodeORB"}]).
erl> orber:install([node()], [{ifr_storage_type, ram_copies}]).
erl> orber:start().
      

如果您需要安装disc_copies您必须首先创建一个Mnesia模式。否则,安装与RAM安装类似:

代码语言:javascript
复制
erl> mnesia:create_schema([node()]).
erl> mnesia:start().
erl> corba:orb_init([{domain, "MyDiskSingleNodeORB"}]).
erl> orber:install([node()], [{ifr_storage_type, disc_copies},
                              {nameservice_storage_type, disc_copies}]).
erl> orber:start().
      

您仍然可以选择将IFR数据存储为ram_copies,但如果节点重新启动,则必须重新安装数据(即调用orber:install / 2)。 因此,由于IFR数据相当静态,您应该使用disc_copies。 有关更多信息,请参阅参考手册中的orber部分。

如果你不需要改变Orber的配置,你可以跳过orb_init/1。但是,您至少应该设置IIOP超时参数。

安装基于RAM的多节点ORBER

Orber使用Erlang分发协议。因此,您必须首先启动它,例如使用:

代码语言:javascript
复制
hostA> erl -sname nodeA
      

在这个例子中,我们假设我们想要使用两个节点; nodeA和nodeB。 由于Mnesia必须知道哪些其他节点应作为发行版的一部分,因此我们需要添加Mnesia配置参数extra_db_nodes或使用mnesia:change_config / 2。 首先,我们必须在所有节点上启动Mnesia,然后才能安装Orber:

代码语言:javascript
复制
nodeA@hostA> mnesia:start().
nodeA@hostA> mnesia:change_config(extra_db_nodes, 
                                  [nodeA@hostA, nodeB@hostB]).
      

之后,我们必须首先确保两个节点将使用相同的域名,然后我们才能安装Orber:

代码语言:javascript
复制
nodeA@hostA> corba:orb_init([{domain, "MyRAMMultiNodeORB"}]).
nodeA@hostA> orber:install([nodeA@hostA, nodeB@hostB],
                           [{ifr_storage_type, ram_copies}]).
nodeA@hostA> orber:start().
      

请注意,您只能调用orber:install/1/2在其中一个节点上。现在,我们可以在另一个节点上启动Orber:

代码语言:javascript
复制
nodeB@hostB> corba:orb_init([{domain, "MyRAMMultiNodeORB"}]).
nodeB@hostB> orber:start().
      

安装基于磁盘的多节点Orber

至于基于RAM的多节点Orber安装,必须启动Erlang分发(例如,erl -sname nodeA)。主要区别在于,当它是基于磁盘的时候,必须创建一个Mnesia模式:

代码语言:javascript
复制
nodeA@hostA> mnesia:create_schema([nodeA@hostA, nodeB@hostB]).
nodeA@hostA> mnesia:start().
      

在这个例子中,我们假设我们想要使用两个节点; nodeAnodeB。由于无法在多个节点上创建模式。因此,我们所要做的就是启动Mnesia(即调用mnesia:start()nodeB

在所有节点上启动Mnesia之后,您必须确认所有节点具有相同的域名,然后才能安装Orber:

代码语言:javascript
复制
nodeA@hostA> corba:orb_init([{domain, "MyDiskMultiNodeORB"}]).
nodeA@hostA> orber:install([nodeA@hostA, nodeB@hostB],
                           [{ifr_storage_type, disc_copies}]).
nodeA@hostA> orber:start().
      

请注意,您只能调用orber:install/1/2在其中一个节点上。现在,我们可以在另一个节点上启动Orber:

代码语言:javascript
复制
nodeB@hostB> corba:orb_init([{domain, "MyDiskMultiNodeORB"}]).
nodeB@hostB> orber:start().
      

5.2配置

必须正确配置Orber,以避免恶意攻击,并自动终止不再使用的IIOP连接。提取有关Orber的配置参数的信息的简单方法是调用操作orber:info/1/2。Orber提供以下配置参数:

键值

范围

默认

domain

string()

"ORBER"

iiop_port

integer() >= 0

4001

nat_iiop_port

integer() > 0 | {local, integer(), {integer(), integer()}}

The same as iiop_port

iiop_out_ports

0 | {integer(),integer()}

0

iiop_out_ports_attempts

integer() > 0

1

iiop_out_ports_random

true | false

false

iiop_max_fragments

integer() > 0 | infinity

infinity

iiop_max_in_requests

integer() > 0 | infinity

infinity

iiop_max_in_connections

integer() > 0

infinity

iiop_backlog

integer() > 0

5

iiop_packet_size

integer() > 0 | infinity

infinity

ip_address

string() | {multiple, string()}

All interfaces

ip_address_local

string()

Defined by the underlying system

nat_ip_address

string() | {multiple, string()} | {local, string(), {string(), string()}}

The same as ip_address

objectkeys_gc_time

integer() > 0 | infinity

infinity

giop_version

{1,0} | {1,1} | {1,2}

{1,1}

iiop_setup_connection_timeout

integer() > 0 | infinity

infinity

iiop_connection_timeout

integer() > 0 | infinity

infinity

iiop_in_connection_timeout

integer() > 0 | infinity

infinity

iiop_out_keepalive

true | false

false

iiop_in_keepalive

true | false

false

iiop_timeout

integer() > 0 | infinity

infinity

interceptors

{native, atom()}

-

local_interceptors

{native, atom()}

-

orbInitRef

string() | undefined

undefined

orbDefaultInitRef

string() | undefined

undefined

orber_debug_level

0 - 10

0

flags

integer() >= 0

0

iiop_acl

{atom(), string()} | [{atom(), string(), string()}]

[]

secure

no | ssl

no

ssl_generation

2 | 3

2

iiop_ssl_port

integer() >= 0

4002

iiop_ssl_accept_timeout

integer() > 0 | infinity

infinity

iiop_ssl_backlog

integer() > 0

5

iiop_ssl_ip_address_local

string()

Defined by the underlying system

nat_iiop_ssl_port

integer() > 0 | {local, integer(), {integer(), integer()}}

The same as iiop_ssl_port

ssl_server_options

list()

See the SSL application for valid options.

ssl_client_options

list()

See the SSL application for valid options.

iiop_ssl_out_keepalive

true | false

false

iiop_ssl_in_keepalive

true | false

false

表'Orber配置参数'的评论:

自Orber域以来,它们应该通过IIOP进行通信,必须拥有唯一的名称,如果两个域具有相同的名称,则通信将失败。域名可以不包含^G(ie \007)。iiop_port如果设置为0,操作系统将选择任何空闲端口。

注意:在UNIX系统上,最好使IIOP端口高于1023,因为不推荐以root用户身份运行Erlang。

nat_iiop_port该值可以是整数,也可以是{local,DefaultNATPort,[{Port,NATPort}]}。另请参阅防火墙配置

iiop_out_ports当设置为0时,将使用任何可用的端口。如果指定了范围,Orber将只在尝试连接到另一个ORB时使用本地端口(Orber充当客户端ORB)。如果所有端口都在使用中,通信将失败。因此,设置iiop_connection_timeout也是绝对必要的。否则,不再使用的连接将阻止进一步的通信。例如,如果使用erl -orber iiop_out_ports“{5000,5020}”,Orber将仅在连接时使用端口5000到5020。如果通过SSL进行通信,请确保使用支持本地{port,Port}选项的版本。另请参阅防火墙配置

iiop_out_ports_random要求iiop_out_ports定义端口范围。如果是这种情况,Orber将从该序列中随机选择一个端口。iiop_out_ports_attempts要求iiop_out_ports定义端口范围。如果这样的话Orber会接受一些由该参数定义的超时,当试图连接到另一个ORB时。

iiop_max_fragments限制每个请求允许的IIOP片段的数量。iiop_max_in_requests限制每个传入连接的并发传入请求数。iiop_max_in_connections限制并发传入连接的数量。iiop_backlog定义未决传入连接队列可能增长到的最大长度。iiop_packet_size定义传入请求的最大大小。如果超过此限制,则连接关闭。IP地址如果orber只应监听多接口主机上的特定ip接口或者如果导出的IOR:s应包含多个组件,则使用此选项。该值是作为字符串或{multiple,IPList}的IPv4或IPv6地址。后者要求该对象可通过列表中的所有IP地址获得。ip_address_local此选项定义Orber在通过IIOP连接到另一个ORB时将使用的默认本地接口,即Orber充当客户端ORB。该值是作为字符串的IPv4或IPv6地址。可以通过定义iiop_acl或传递Orber通用接口上下文来覆盖ip_address_local。如果未使用此选项,则底层操作系统将选择使用哪个接口。有关更多信息,请参阅接口配置部分。

nat_ip_address该值是作为字符串(IPv4或IPv6),{multiple,IPList}或{local,DefaultNATIPAddress,[{IPAddress,NATIPAddress}}}的IP地址。另请参阅防火墙配置

objectkeys_gc_time如果使用选项{persistent,true}启动对象,则应该设置此选项。该值是整数()秒。

giop_version定义默认的GIOP协议版本。

iiop_setup_connection_timeout该值是一个整数(秒)或原子无穷大。该选项仅适用于客户端连接。如果设置此选项,则尝试连接到其他ORB将在给定的时间限制后超时。请注意,如果时间限制较大,TCP协议可能会在提供的值之前超时。

iiop_connection_timeout该值是一个整数(0到1000000之间的超时时间)或原子无穷大。此选项仅适用于客户端对象连接,即对服务器连接不起作用。设置此选项将导致客户端连接被终止,当且仅当没有挂起的请求时。如果有客户还在等待回复,Orber会在给定秒数后再次尝试。此选项的主要目的是减少打开连接的数量;例如,没有必要保持连接,每天只使用一次,随时打开。

iiop_in_connection_timeout与iiop_connection_timeout相同。唯一的区别是这个选项只影响传入的连接(即Orber充当服务器端的ORB)。

iiop_out_keepalive当没有其他数据交换时,在连接的套接字上启用定期传输。如果另一端没有响应,则连接被认为中断,并且将被终止。启用时,将设置SO_KEEPALIVE套接字级别选项。

iiop_in_keepalive与iiop_out_keepalive相同。唯一的区别是此选项仅影响传入连接。

iiop_timeout该值是一个整数(0到1000000之间的超时时间)或原子无穷大。该选项仅在客户端有效。设置此选项会导致所有内部ORB请求超时并引发系统异常,例如TIMEOUT,如果在给定的时间限制内没有传递回复。

拦截器如果有人设置了这个参数,例如,erl -orber interceptors“{native,['myInterceptor']}”,Orber将为所有的ORB间通信使用提供的拦截器。'myInterceptor'是拦截器的模块名称。有关更多信息,请参阅用户指南和参考手册中的拦截器章节。

local_interceptors如果已定义,则通过Orber Environment Flags激活本地拦截器时将使用其值。如果未定义,但标志已设置,Orber将使用拦截器参数的值。

orbInitRef设置这个选项,例如,erl -orber orbInitRef [\“NameService = corbaloc :: host.com/NameService \”]将改变corba:resolve_initial_references(Key)尝试查找与给定Key匹配的对象的位置。调用corba:list_initial_services()时,键也会出现。这个变量覆盖orbDefaultInitRef

orbDefaultInitRef如果找不到与orbInitRef匹配的键,并且设置了此变量,则它将确定orber:resolve_initial_references(键)尝试查找与给定键匹配的对象的位置。用法:erl -orber orbDefaultInitRef \“corbaloc :: host.com \”。

orber_debug_level范围是0到10.使用级别10是最详细的配置。该选项将生成使用error_logger的异常情况报告。建议不要将此选项用于交付系统,因为某些报告不会被视为错误。主要目的是在开发过程中提供协助。

Flag默认情况下没有标志被激活。Orber环境标志中描述了可用的配置设置。

iiop_acl

该选项必须通过设置Orber Environment Flags参数来激活。这个参数的值应该是[{Direction,Filter}]和/或[{Direction,Filter,[Interfaces]}]的列表。的方向,tcp_in,ssl_in,tcp_out或ssl_out,确定是否访问控制列表(ACL)适用于传入或传出连接和IIOP或IIOP通过SSL。该过滤器使用扩展的无类别域间路由(CIDR)格式。例如,“123.123.123.10”限制与特定主机的连接“123.123.123.10/17”允许来自或来自任何主机的连接等于17个最高有效位。Orber还允许用户指定某个端口或端口范围,例如分别为“123.123.123.10/17#4001”和“123.123.123.10/17#4001/5001”。IPv4或没有压缩的IPv6字符串被接受。

列表(IPv4或IPv6字符串)可能只包含一个用于传出连接的地址。对于传入连接,接口列表可能包含多个IP字符串。如果设置为传出连接并授予访问权限,则Orber将在连接到服务器端ORB时使用该本地接口。对于传入连接,客户端ORB需要在本地使用其中一个列出的接口。如果不这样做,访问将被拒绝。模块orber_acl提供了用于评估过滤器和地址访问控制的操作。另请参阅接口配置防火墙配置章节。

安全确定Orber将使用的安全模式,如果它是不安全的域或使用的安全机制的类型,则为否。目前,默认情况下,Orber符合CSIv1级别0,这意味着通过SSL/TLS的IIOP。本手册后面的安全性章节介绍了如何在Orber中获得安全性以及如何使用这些选项。

ssl_generation定义安装了哪个SSL版本,即可用的API。默认值2是指SSL-3.1或更高版本,但早于SSL-4.0。如果设置为3,则SSL-4.0或更高版本必须可用。目前无法使用1,仅供将来使用。

iiop_ssl_port如果设置,则该值必须是大于零的整数且不等于iiop_port

iiop_ssl_accept_timeout该值是一个整数(以秒为单位的超时)或原子无穷大,并确定SSL握手可能需要多长时间。应该设置此选项以避免客户端从不启动握手。

iiop_ssl_backlog定义未决传入连接队列可能增长到的最大长度。

iiop_ssl_ip_address_local此选项定义Orber在通过IIOP SSL连接到另一个ORB时将使用的默认本地接口,即Orber充当客户端ORB。该值是作为字符串的IPv4或IPv6地址。通过定义iiop_acl或传递Orber通用接口上下文来覆盖iiop_ssl_ip_address_local是可能的。如果未使用此选项,则底层操作系统将选择使用哪个接口。有关更多信息,请参阅接口配置部分。

nat_iiop_ssl_port如果设置,则该值必须是大于零的整数或{local,DefaultNATPort,[{Port,NATPort}]}。另请参阅防火墙配置

ssl_server_optionsOrber是服务器时的SSL选项列表。通常,它只是从旧选项中删除'ssl_server_'前缀,即ssl_server_verify将在此选项列表中进行验证。请参阅SSL应用程序以获取可能的选项及其值的正确列表。

ssl_client_optionsOrber是客户时的SSL选项列表。一般来说,它只是从旧选项中删除ssl_client_前缀,即ssl_client_depth只是在这个选项列表中的深度。请参阅SSL应用程序以获取可能的选项及其值的正确列表。

iiop_ssl_out_keepalive当没有其他数据交换时,在连接的套接字上启用定期传输。如果另一端没有响应,则连接被认为中断,并且将被终止。启用时,将设置SO_KEEPALIVE套接字级别选项。要求安装的SSL版本支持keepalive选项,并且ssl_generation指向此版本。

iiop_ssl_in_keepalive与iiop_ssl_out_keepalive相同。唯一的区别是此选项仅影响传入连接。

可以使用额外的超时参数调用操作:

代码语言:javascript
复制
erl> module_interface:function(ObjRef, Timeout, ..Arguments..).
erl> module_interface:function(ObjRef, [{timeout, Timeout}], ..Arguments..).
erl> module_interface:function(ObjRef, ..Arguments..).    

额外的超时参数将覆盖配置参数。iiop_timeout然而,它是不可能使用的。infinity若要重写超时参数,请执行以下操作。超时值选项对于驻留在同一Orber域中的对象也是有效的。

iiop_setup_connection_timeoutiiop_timeoutiiop_connection_timeoutiiop_in_connection_timeout应该使用的变量。指定的值是实现特定的,即,WAN或LAN,但他们应该从范围iiop_setup_connection_timeoutiiop_connection_timeout

要在配置文件中更改这些设置,-config必须将该标志添加到erl命令中。有关更多信息,请参阅参考手册config(4)。这些值也可以在启动时作为选项单独发送到Erlang节点,有关详细信息,请参阅参考手册erl(1)

Orber环境旗

Environment Flags允许用户激活调试设备或更改Orber的行为。后者可能会导致Orber不再符合OMG标准,当与不符合要求的ORB通信时,这可能是必需的。

Hexadecimal Value

OMG Compliant

Description

0001

no

Exclude CodeSet Component

0002

yes

Local Typechecking

0004

yes

Use Host Name in IOR

0008

yes

Enable NAT

0020

yes

Local Interceptors

0080

yes

Light IFR

0100

yes

Use IPv6

0200

yes

EXIT Tolerance

0400

yes

Enable Incoming ACL

0800

yes

Enable Outgoing ACL

1000

yes

Use Current Interface in IOR

可以使用上述标志的任何组合,并将行为更改如下:

  • 排除代码集组件-指示Orber排除导出IOR:s中的CodeSet组件。激活时,客户端和服务器之间不会就字符和宽字符转换进行协商。如果IDL规范包含数据类型wchar和/或wstring,此标志很可能会导致问题。
  • 本地Typechecking - 如果激活,将检查参数,回复和引发的异常,以确保数据正确。如果发生错误,error_logger则用于生成报告。由于额外的开销,一个人可能不会使用此选项来交付系统。由于这个选项激活用于在目标节点上产生的所有对象类型检查,但也可以使用的选项{local_typecheck, boolean()},调用时oe_create/2oe_create_link/2corba:create/4corba:create_link/4,以覆盖配置参数。
  • 在IOR中使用主机名-通常Orber在输出ior:s中插入IP-号。在某些情况下,这将导致客户端打开两个连接而不是一个连接。
  • 启用NAT -如果此标志设置,就可以使用NAT(网络地址转换)配置参数(nat_iiop_portnat_iiop_ssl_portnat_ip_address)。
  • 本地拦截器-使用拦截器进行本地调用。
  • 轻型IFR-如果没有显式使用IFR,并且设置了此标志,Orber将使用最小的IFR来减少内存使用和安装时间。
  • 使用IPv 6-当激活此选项时,Orber将使用IPv6进行跨兽人通讯。
  • 出口公差-即使回叫模块导致退出,服务器也会存活下来。
  • 启用传入ACL-激活传入连接的访问控制。
  • 启用传出ACL-激活对传出连接的访问控制。
  • 在IOR中使用当前接口-设置后,Orber将将请求通过的接口添加到导出的本地IOR:s。

调用操作orber:info/1/2将以可读的方式显示当前设置的标志。

5.3防火墙配置

防火墙用于保护对象与其他网络或子网络中的客户端,但也限制内部对象可能连接到的主机(即inbound protectionoutbound protection)。防火墙可以根据以下条件限制访问:

  • 运输水平-根据TCP标头中的地址信息执行访问控制决策。
  • 应用水平-了解GIOP消息和支持的特定传输级ORB协议,例如IIOP。

本节描述如何配置Transport Level防火墙。它必须事先了解源到目标映射,并且在概念上有一个包含表单元组的配置表:({inhost:inport}, {outhost:outport})如果没有端口限制,那么配置防火墙是相当容易的。否则,我们必须考虑下列备选办法:

  • 传入请求-Orber只使用配置参数指定的端口号。iiop[医]港iiop[医]SSL[医]港其他ORB%27可能使用多个端口,但应该可以更改此行为。请参阅其他ORB文档。
  • 传出请求 - 包括Orber在内的绝大多数ORB,要求操作系统在连接到服务器端ORB时提供空闲的本地端口。使用Orber时可以改变这种行为(即设置配置参数iiop_out_ports)。

警告

使用该选项iiop_out_ports可能会导致Orber用完有效端口号。例如,其他应用程序可能会窃取某些端口,或者到其他ORB的并发传出连接数可能会高于预期。减少但不能消除你应该使用的风险iiop_connection_timeout

防火墙配置示例:

代码语言:javascript
复制
# "Plain" IIOP
To: Orber-IPNo:(iiop_port)     From: ORB-IPNo:X
To: ORB-IPNo:Z                 From: Orber-IPNo:(iiop_out_ports | Any Port)

# IIOP via SSL
To: Orber-IPNo:(iiop_port)     From: ORB-IPNo:X
To: Orber-IPNo:(iiop_ssl_port) From: ORB-IPNo:Y
To: ORB-IPNo:Z                 From: Orber-IPNo:(iiop_out_ports | Any Port)
    

如果通过TCP Firewall with NAT(网络地址转换)进行通信,我们必须激活此行为并定义外部地址和/或端口。

图5.1:带有NAT的tcp防火墙

使用NAT可以为不同的网络域使用不同的主机数据。这样我们就可以共享Internet协议地址资源或模糊资源。要启用此功能的Enable NAT标志必须设置和nat_iiop_portnat_iiop_ssl_portnat_ip_address配置,其映射到iiop_portiiop_ssl_portip_address分别。因此,必须将防火墙配置为正确地将外部转换为内部表示。如果这些NAT参数分配了单个端口号或IP地址,则只有在将IOR导出到另一个ORB时才会使用这些参数。何时ip_address设置为{multiple, [IPAddress]}nat_ip_address应该以相同的方式进行配置,以便防火墙可以将每个NAT IP地址转换为有效地址。如果对象应该可以通过不同的接口和端口访问,另请参阅Interface Configuration选项{local, DefaultNATIPAddress, [{IPAddress, NATIPAddress}]}和/或{local, DefaultNATPort, [{Port, NATPort}]}应用。默认的NAT IP地址和端口应由ip_address_local防火墙转换为值和默认监听端口。如果在列表中未找到IP地址和/或端口,则默认值将被插入到IOR中。防火墙必须能够正确翻译这些内容。

如果有必要限制对安全网络内的ORB的访问,但同一主机上运行的其他应用程序可能未被阻止,则可以使用应用程序级防火墙或Orber访问控制列表(ACL)。后者使得用户可以用Orber定义哪些主机可以作为服务器或客户端进行通信。这是通过定义配置参数来实现的iiop_acl。无类别域间路由(CIDR)Filter确定哪个对等接口和另一个ORB可能使用的端口。

Filter

Peer Interface(s)

Peer Port(s)

"10.1.1.1"

10.1.1.1

any

"10.1.1.1/8"

10.0.0.0-10.255.255.255

any

"10.1.1.1/8#4001"

10.0.0.0-10.255.255.255

4001

"10.1.1.1/8#4001/5001"

10.0.0.0-10.255.255.255

4001-5001

Orber ACL也允许用户定义可以使用哪个本地接口,但不会检测到spoofing。该操作orber_acl:match/2/3可以轻松验证访问是否被授予。例如,如果Orber将以ACL启动[{tcp_out, "10.1.1.1/8#4001/5001"}],那么其orber_acl:match/2行为如下:

代码语言:javascript
复制
erl> orber_acl:match({11,1,1,1}, tcp_out).
false

erl> orber_acl:match({10,1,1,1}, tcp_out).
true

erl> orber_acl:match({11,1,1,1}, tcp_out, true).
{false,[],0}

erl> orber_acl:match({10,1,1,1}, tcp_out, true).
{true,[],{4001,5001}}
    

只有当返回的布尔值为真时,额外的返回值才会有所不同。在上面的示例中,{true,[],{4001,5001}}意思是"10.1.1.1"如果服务器端ORB在4001-5001范围内的端口上侦听传入连接请求,则Orber可以使用任何本地接口连接到。请注意,调用该orber_acl:match/2/3操作不会导致Orber发起连接尝试。原因是,这个函数可能用于活动节点以及测试环境。因此,如果本地接口当前不可用或通过给定主机/端口没有可用的服务器端ORB,Orber将不会检测到该接口。

5.4接口配置

在许多情况下,只要简单地配置底层操作系统,就可以为所有应用程序使用本地接口。但是,在某些情况下,由于防火墙配置等原因,需要为不同的应用程序使用不同的本地接口。有时,甚至有必要为单个CORBA对象使用特定的接口。本节描述了如何以不同的方式改变这种情况。

默认行为是Orber让OS配置决定将在IOR中添加哪个接口:s导出到另一个ORB,以及连接到另一个ORB时使用的本地接口(Orber充当客户端ORB)。后者可以通过设置配置参数iiop_ssl_ip_address_local和/或ip_address_local通过SSL和IIOP分别影响IIOP 来覆盖。这些参数可以通过使用Orber通用interface上下文或定义ACL(访问控制列表)来覆盖。如果包含本地接口(例如[{tcp_out, "10.0.0.0/8", ["10.0.0.1"]}]),后者总是优先。如果接口被排除(例如[{tcp_out, "10.0.0.0/8"}]),所选择的接口将,按照以下顺序,可以通过确定#'IOP_ServiceContext'{}ip_address_local/iiop_ssl_ip_address_local底层系统的配置或。

为生成的存根/骨架添加接口上下文的方法如下:

代码语言:javascript
复制
Ctx = #'IOP_ServiceContext'{context_id = ?ORBER_GENERIC_CTX_ID, 
                            context_data = {interface, "10.0.0.1"}},
'CosNaming_NamingContext':resolve(NS, [{context, [Ctx]}], Name),
    

也可以将上下文添加到corba:string_to_object/2, corba:resolve_initial_references/2, corba:resolve_initial_references_remote/3, corba:list_initial_services_remote/2, corba_object:not_existent/2, corba_object:non_existent/2corba_object:is_a/3corba_object如果提供的IOR是外部的,则导出的操作会受到影响。corba:string_to_object/2如果传递一个corbaloc或一个corbaloc字符串(参见INS本章),该函数可能需要接口上下文,corba:resolve_initial_references_remote/3而且corba:list_initial_services_remote/2始终连接到另一个ORB,并且可能需要添加上下文。corba如果通过设置orbInitRef和/或orbDefaultInitRef配置参数重新调用呼叫,则其余操作将受到影响。有关更多信息,请参阅每个模块的参考手册。

配置将IOR导出到另一个ORB时应使用哪个接口由nat_ip_address设置标志16#1000ip_address顺序决定。Orber通过所有接口或由其定义的接口来监听传入连接ip_address。使用orber:add_listen_interface/2/3和可以添加和删除额外的监听接口orber:remove_listen_interface/1。在这种情况下,应设置16#1000标志,并在必要时设置配置参数{local, DefaultNATIPAddress, [{IPAddress, NATIPAddress}]}和/或{local, DefaultNATPort, [{Port, NATPort}]}

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com