我有一台本地机器作为 Web 服务器运行,其 IP 为 192.168.1.xxx。在我的 ADSL 路由器上,我已为这台机器创建了端口转发“NAT”,它工作正常但是从 Internet 到我的 Web 服务器的访问者的记录 IP 始终被分配给我的公共 IP,而不是他们的 IP。
我已尝试将 DMZ 设为本地服务器 IP,并将 NAT 设置从 ADSL 设置从 NAPT 更改为 Full Cone NAT。
更新 1:
Web 服务器是 Ubuntu 16.04 上的 Apache,我使用以下内容php跟踪用户IP的代码:
public function handle(Login $event)
{
//Perform login tracking
$log = new Loginlog();
$log->created_at = date('Y-m-d H:i:s');
$log->user_id = \Auth::user()->id;
$log->ip = $_SERVER['REMOTE_ADDR'];
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
$log->est_ip = $ip;
$log->save();
$nowDate = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s',date('Y-m-d H:i:s'));
$deletedRows = \App\Loginlog::where('created_at','<', $nowDate->subDays(config('fox.clearBeforeDays')))->delete();
// dd(\Auth::user()->id,$_SERVER['REMOTE_ADDR']);
}
更新 2:
删除第二个屏幕截图中显示的所有 NAT 角色并仅保留第三个屏幕截图中显示的 DMZ 后,上述 PHP 代码成功正确捕获了客户端的 IP!
问题是:NAT 出了什么问题,导致服务器或至少是服务器上运行的脚本无法获取客户端的 IP,而 DMZ 只允许这样做。使用 DMZ 的问题是,它使我的服务器的机器端口向所有 Internet 入站流量开放!
以下是我的路由器配置相关的屏幕截图:
答案1
您应该避免使用 DMZ,因为它太危险,会让 Internet 上的每个人都直接访问您的所有端口。
您应该使用端口转发。
请参阅端口转发文章:
如何在华为 HG531 V1 路由器上设置端口转发的简单说明