显然,如果使用魔法路由器作为服务聆听端口并转发到终端应用程序服务器,那么所有远程IP都是127.0.0.1或本地主机的IP,例如: 192.168.1.X。
我们提供以下方法来获得真正的远程连接IP。记得设定远端允许的IP子网,否则remoteip.html将返回空值。
如果您知道端口,可在如下网页浏览器中返回:
http://192.168.1.1:8888/remoteip.html?P=12345
从魔法路由器返回真正远程IP的vb样例代码如下:
Set oXML = CreateObject("Microsoft.XMLHTTP")
oXML.Open "Get", "http://192.168.1.1:8888/remoteip.html?P=" & Socket(Index).RemotePort, False
oXML.Open "Get", "http://192.168.1.1:8888/remoteip.html?P=" & Socket(Index).RemotePort & "&T=" & Int(Rnd() * 1000000), False '使用本地主机IP,响应是很慢的,可以使用如192.168.1.x的IP代替,但是需要在远端管理这顶允许的IP子网为192.168.1.0,并设定密码。
oXML.Send
Debug.Print oXML.ResponseText
PHP代码实现如下:
<?php
//you can overwrite $_SERVER['REMOTE_ADDR'], put this overwrite coding at the very beginning of php pages.
//echo "Before overwrite ip: ".$_SERVER['REMOTE_ADDR']."<br>";
$_SERVER['REMOTE_ADDR'] = GetRemoteIP();
//echo "After overwrite ip: ".$_SERVER['REMOTE_ADDR'];
function GetRemoteIP()
{
$handle = @fopen("http://192.168.1.1:8888/remoteip.html?P=".$_SERVER['REMOTE_PORT']."&T=".rand(), "r"); // where rand() is must, force to update, not to check cache
if ($handle) {
$contents = stream_get_contents($handle);
if ($contents) {
$RemoteIP = $contents;
} else {
$RemoteIP = '127.0.0.1'; //do not return non ip string if fail, return a default.
}
} else {
$RemoteIP = '127.0.0.1'; //do not return non ip string if fail, return a default.
}
fclose($handle);
return $RemoteIP;
}
?>
在远端管理允许通过IP选项
如果将魔法路由器连接到魔法路由器,那么第二个魔法路由器总是会返回第一个魔法路由器的IP(查询remoteip.html可参阅相关资料)。因此,您需要在第一个魔法路由器里启用通过IP,那么第一个魔法路由器允许通过并传递真正的远端IP到下一个魔法路由器上。第二个魔法路由器并不需要启用。如果您启用它,终端应用程序服务器将收到错误的数据。
标准路由支持"通过IP"功能,而且必须设定路由器模式为"单独"或者"服务器端"模式,中介/反向连接是不支持"通过IP"功能的。
"通过IP"的目的是什么?
允许通过IP到最后一个魔法路由器,才可以在Web服务器(Apache)站点http://192.168.1.x:8888/remoteip.html?P=12345上查询到真正的远程连接IP 。
"通过IP"是专门为自动转换/负载平衡设计的。如果有多个魔法路由器被连接到一块,socket的远端IP将变得毫无意义,此时您需要启用"通过IP"机能。连接到应用程序服务器的最后一个魔法路由器时不需要启用此机能的。