你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
输入关键字进行搜索
搜索:
没有找到相关结果
nccloud
一、问题现象NCC2005 Was集群,使用IHS做分发,通过IHS端口登录NCC轻量端时会报“非法登录”的错误,通过server具体端口则没问题。二、问题原因 NCC有个安全机制,要校验客户端IP,代码中调用request.getRemoteAddr获取客户端IP,如果通过IHS端口登录NCC,则request.getRemoteAddr返回的是IPv6地址,如果直接通过server的具体端口登录NCC,返回的是IPv4地址,NCC无法解析IPv6地址,所以报非法登录的错误。三、NCC补丁的修改机制及存在的问题 对于这个问题,开发给过一个补丁,补丁修改方法是在校验出request.getRemoteAddr地址不合法时,从request.headers中的$WSSN去获取IP,此补丁解决了很多项目报非法登录的问题。 实际上这个补丁处理方法是不对的,$WSSN中获取到的是host信息,即应用服务器的主机信息,NC代码的本意是要获取客户端IP,这个客户端IP在NC后续处理中很多地方要用到。 如果通过一个域名去登录NCC,那么$WSSN中获取到的是主机的域名,NCC解析不了这个域名,也会报非法登录的错误。 而request.getRemoteAddr返回IPv6地址的原因是,这个方法返回的是应用服务器的IP信息,很多服务器启用了IPv6,所以返回了一个IPv6的地址。 综上所述,request中就没有包含客户端的IP信息,所以这个问题无论如何都不能通过修改代码解决,NCC2005所有使用集群的项目都存在问题。四、获取不到客户端IP的原因 从was9.0.0.11开始,was的机制做了修改,如果请求是从proxy server分发过来的,那么was要校验这个proxy server是否可信,只有proxy server在trustedSensitiveHeaderOrigin这个属性中定义的可信proxy server列表中,才会认为是可信的,如果不可信,那么was不会把客户端IP放进request.headers中,NCC代码也就无法从request中获取到客户端IP。如果不是从proxy server分发过来的,则不会有这个校验。这也就是通过IHS端口访问报错,而通过具体端口访问不报错的原因。 可以看出,这个问题不是IHS的问题,是was server的问题,即使不使用IHS,使用其他proxy server,也会有同样的问题。五、解决方案 解决方案是在每个server的Http Channel中增加一个定制属性,trustedSensitiveHeaderOrigin,值为proxy server的IP,如果有多台proxy server,可以定义多个IP,以逗号分开,为了处理简单,这个值也可以写成 *,即任何proxy server都是可信的,这就回到was9.0.0.11之前版本的状态。修改完后,重启was生效 具体操作步骤如下:(一)对was中每个server增加定制属性 (二)进server的配置界面,点击“Web容器传输链” (三)在Web容器传输链界面,列表中每项资源都要点进去增加定制属性 (四)选中一项资源,点击进入,再点击 “HTTP入站通道” (五)在HTTP入站通道界面,点击“定制属性” (六)在定制属性列表界面,点击“新建”菜单 (七)增加一个定制属性,名称为trustedSensitiveHeaderOrigin,值为proxy server的IP,建议配成*,表示信任任何proxy server,点确定、保存。 (八)对于第三步中的其他资源,重复第三到第七步的操作(九)对于每个server,做此配置修改 (十)重启was生效
要回复问题请先登录或注册
1 个回复
nccloud
一、问题现象
NCC2005 Was集群,使用IHS做分发,通过IHS端口登录NCC轻量端时会报“非法登录”的错误,通过server具体端口则没问题。
二、问题原因
NCC有个安全机制,要校验客户端IP,代码中调用request.getRemoteAddr获取客户端IP,如果通过IHS端口登录NCC,则request.getRemoteAddr返回的是IPv6地址,如果直接通过server的具体端口登录NCC,返回的是IPv4地址,NCC无法解析IPv6地址,所以报非法登录的错误。
三、NCC补丁的修改机制及存在的问题
对于这个问题,开发给过一个补丁,补丁修改方法是在校验出request.getRemoteAddr地址不合法时,从request.headers中的$WSSN去获取IP,此补丁解决了很多项目报非法登录的问题。
实际上这个补丁处理方法是不对的,$WSSN中获取到的是host信息,即应用服务器的主机信息,NC代码的本意是要获取客户端IP,这个客户端IP在NC后续处理中很多地方要用到。
如果通过一个域名去登录NCC,那么$WSSN中获取到的是主机的域名,NCC解析不了这个域名,也会报非法登录的错误。
而request.getRemoteAddr返回IPv6地址的原因是,这个方法返回的是应用服务器的IP信息,很多服务器启用了IPv6,所以返回了一个IPv6的地址。
综上所述,request中就没有包含客户端的IP信息,所以这个问题无论如何都不能通过修改代码解决,NCC2005所有使用集群的项目都存在问题。
四、获取不到客户端IP的原因
从was9.0.0.11开始,was的机制做了修改,如果请求是从proxy server分发过来的,那么was要校验这个proxy server是否可信,只有proxy server在trustedSensitiveHeaderOrigin这个属性中定义的可信proxy server列表中,才会认为是可信的,如果不可信,那么was不会把客户端IP放进request.headers中,NCC代码也就无法从request中获取到客户端IP。如果不是从proxy server分发过来的,则不会有这个校验。这也就是通过IHS端口访问报错,而通过具体端口访问不报错的原因。
可以看出,这个问题不是IHS的问题,是was server的问题,即使不使用IHS,使用其他proxy server,也会有同样的问题。
五、解决方案
解决方案是在每个server的Http Channel中增加一个定制属性,trustedSensitiveHeaderOrigin,值为proxy server的IP,如果有多台proxy server,可以定义多个IP,以逗号分开,为了处理简单,这个值也可以写成 *,即任何proxy server都是可信的,这就回到was9.0.0.11之前版本的状态。修改完后,重启was生效
具体操作步骤如下:
(一)对was中每个server增加定制属性
(二)进server的配置界面,点击“Web容器传输链”
(三)在Web容器传输链界面,列表中每项资源都要点进去增加定制属性
(四)选中一项资源,点击进入,再点击 “HTTP入站通道”
(五)在HTTP入站通道界面,点击“定制属性”
(六)在定制属性列表界面,点击“新建”菜单
(七)增加一个定制属性,名称为trustedSensitiveHeaderOrigin,值为proxy server的IP,建议配成*,表示信任任何proxy server,点确定、保存。
(八)对于第三步中的其他资源,重复第三到第七步的操作
(九)对于每个server,做此配置修改
(十)重启was生效