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
不需要创建基于磁盘的架构。只需使用:
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安装类似:
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分发协议。因此,您必须首先启动它,例如使用:
hostA> erl -sname nodeA
在这个例子中,我们假设我们想要使用两个节点; nodeA和nodeB。 由于Mnesia必须知道哪些其他节点应作为发行版的一部分,因此我们需要添加Mnesia配置参数extra_db_nodes或使用mnesia:change_config / 2。 首先,我们必须在所有节点上启动Mnesia,然后才能安装Orber:
nodeA@hostA> mnesia:start().
nodeA@hostA> mnesia:change_config(extra_db_nodes,
[nodeA@hostA, nodeB@hostB]).
之后,我们必须首先确保两个节点将使用相同的域名,然后我们才能安装Orber:
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:
nodeB@hostB> corba:orb_init([{domain, "MyRAMMultiNodeORB"}]).
nodeB@hostB> orber:start().
安装基于磁盘的多节点Orber
至于基于RAM的多节点Orber安装,必须启动Erlang分发(例如,erl -sname nodeA)。主要区别在于,当它是基于磁盘的时候,必须创建一个Mnesia模式:
nodeA@hostA> mnesia:create_schema([nodeA@hostA, nodeB@hostB]).
nodeA@hostA> mnesia:start().
在这个例子中,我们假设我们想要使用两个节点; nodeA
和nodeB
。由于无法在多个节点上创建模式。因此,我们所要做的就是启动Mnesia(即调用mnesia:start()
)nodeB
。
在所有节点上启动Mnesia之后,您必须确认所有节点具有相同的域名,然后才能安装Orber:
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:
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相同。唯一的区别是此选项仅影响传入连接。
可以使用额外的超时参数调用操作:
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_timeout
,iiop_timeout
,iiop_connection_timeout
和iiop_in_connection_timeout
应该使用的变量。指定的值是实现特定的,即,WAN或LAN,但他们应该从范围iiop_setup_connection_timeout
到iiop_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/2
,oe_create_link/2
,corba:create/4
或corba:create_link/4
,以覆盖配置参数。
- 在IOR中使用主机名-通常Orber在输出ior:s中插入IP-号。在某些情况下,这将导致客户端打开两个连接而不是一个连接。
- 启用NAT -如果此标志设置,就可以使用NAT(网络地址转换)配置参数(
nat_iiop_port
,nat_iiop_ssl_port
和nat_ip_address
)。
- 本地拦截器-使用拦截器进行本地调用。
- 轻型IFR-如果没有显式使用IFR,并且设置了此标志,Orber将使用最小的IFR来减少内存使用和安装时间。
- 使用IPv 6-当激活此选项时,Orber将使用
IPv6
进行跨兽人通讯。
- 出口公差-即使回叫模块导致退出,服务器也会存活下来。
- 启用传入ACL-激活传入连接的访问控制。
- 启用传出ACL-激活对传出连接的访问控制。
- 在IOR中使用当前接口-设置后,Orber将将请求通过的接口添加到导出的本地IOR:s。
调用操作orber:info/1/2
将以可读的方式显示当前设置的标志。
5.3防火墙配置
防火墙用于保护对象与其他网络或子网络中的客户端,但也限制内部对象可能连接到的主机(即inbound protection
和outbound 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
。
防火墙配置示例:
# "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_port
,nat_iiop_ssl_port
和nat_ip_address
配置,其映射到iiop_port
,iiop_ssl_port
和ip_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
行为如下:
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
底层系统的配置或。
为生成的存根/骨架添加接口上下文的方法如下:
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/2
和corba_object:is_a/3
。corba_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#1000
和ip_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}]}
。
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com