开发者社区 问答 正文

求助一个LINUX端口转发的问题!希望大家可以帮到我!!!

说明:本人有一台服务器,由于软件有加密狗,没办法托管阿里云!有电信固定IP一条,有时候移动ADSL,联通ADSL访问电信固定IP无法访问!
就想通过阿里云来实现,目前问题已经得到解决,客户访问阿里云服务器,通过阿里云转发我们自己的电信固定IP!
又出现了一个新问题,我来举个例:
访问者IP:123.123.123.123
阿里云ECS:111.111.111.111
自有电信公网IP:222.222.222.222
操作系统 LINUX CentOS 7.2
配置防火墙
iptables -t nat -A PREROUTING -d 111.111.111.111 -p tcp --dport 80 -j DNAT --to-destination 222.222.222.222:80
iptables -t nat -A POSTROUTING -d 222.222.222.222 -p tcp --dport 80 -j SNAT --to 111.111.111.111


转发成功,但是在我们服务器上看到的访问者的IP是阿里云的111.111.111.111,而不是访问者IP,123.123.123.123
请大神们帮忙看看怎么解决这个问题!!!!

展开
收起
精英软件 2016-09-04 14:06:06 2939 分享 版权
阿里云 AI 助理回答

要解决您提到的问题,即在转发流量的同时保留原始访问者的IP地址,您需要在阿里云ECS实例上启用并配置IP伪装(MASQUERADE)以及正确的SNAT规则,以便将源IP地址传递给您的私有服务器。以下是修改后的iptables规则示例:

  1. 确保数据包能正确DNAT到您的私有服务器: 这一步您已经正确设置了:

    iptables -t nat -A PREROUTING -d 111.111.111.111 -p tcp --dport 80 -j DNAT --to-destination 222.222.222.222:80
    
  2. 修改POSTROUTING规则以使用MASQUERADE而非静态SNAT: 使用MASQUERADE可以让ECS自动选择合适的源IP地址进行SNAT,这对于动态IP环境特别有用,同时它也会传递客户端的原IP作为TCP连接的一部分(通过HTTP头部X-Forwarded-For或在其他协议中类似机制)。但请注意,这要求ECS实例本身具有公网IP,并且与目标服务器(自有电信公网IP)之间的网络路由可达。

    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    

    其中eth0是对外网卡的接口名称,可能根据您的实际配置有所不同,请替换为正确的接口名。

  3. 在您的应用层面处理X-Forwarded-For头: 由于直接通过网络层传递原始IP可能不总是可行或安全的,大多数情况下,应用程序会通过检查HTTP请求头中的X-Forwarded-For来识别原始客户端IP。如果您的软件支持,您应该配置它来读取这个头信息以获取真实用户IP。

  4. 保持规则持久化: 记得将上述iptables规则保存,以免重启后丢失。具体方法取决于您的Linux发行版,通常可以通过安装iptables-persistent服务或者编写脚本在系统启动时应用规则。

  5. 测试和验证: 在完成以上步骤后,确保重新加载iptables规则使之生效,并从不同来源IP进行访问测试,检查日志或应用界面是否正确显示了原始访问者IP。

请按照上述步骤调整配置,并注意监控和测试,以确保一切按预期工作。您也可以通过ECS一键诊断全面排查并修复ECS问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答