• IPTABLES问题:DNAT下如何解决内网访问内部服务器问题


    这个问题,困扰了我几年了,今天终于得到解决。

    问题是这样的,在局域网内部有一台服务器,通过IPTABLES的网关提供对外服务,做过IPTABLES网关的人都知道,这很容易做到,只要在网关机器上写一个DNAT的地址转换即可。但是如果是内部机器去访问网关的外部地址,则访问不了了,解决之道是:内网的机器,要么在内部建立一个DNS服务器为那太服务器提供DNS解析,要么在要访问的机器上设置hosts。但这两个解决方法都没涉及到IPTABLES,不是根本的解决之道。有的时候这种解决之道还不一定能实现实际需求。

    要解决这个问题,首先要分析为何在内网访问不了?

    首先你可能在网关上做了一个DNAT

       iptables -t nat  -A PREROUTING   -d $InternetIp   -p tcp  --dport 8000 -j  DNAT --to-destination 192.168.0.13:80

    也就是访问网关的$InternetIp地址的时候会转换地址到192.168.0.13

    现在,当一台局域网内的机器(如192.168.0.51)访问 $InternetIp的8000端口时,网关机器发现应该转换到192.168.0.13的80端口。服务器192.168.0.13接收到该请求时,发现请求的机器来自局域网内(192.168.0.51),因此就直接发送响应给局域网内机器(192.168.0.51).问题就在了,局域网内的机器是把请求发送给网关的$InternetIp地址,并没有发送给内部服务器(192.168.0.13),所以这个包是不期望的,会把它丢掉。

    那到底该怎么做呢?那台内部机器(192.168.0.51)如果得到从网关的响应包,那局域网内部机器(192.168.0.51)就会认为这个包是它应该得到的响应包了(因为是发送给网关的)

    所以只要在网关机器上再做一个SNAT就解决了,请看下面的:

    iptables -t nat -A POSTROUTING -d 192.168.0.13 -s 192.168.0.0/24 -p tcp --dport 80 -j SNAT  --to-source 192.168.0.1

  • 相关阅读:
    threeJS嵌入可交互的普通页面
    分片上传与断点续传
    如何使用高压放大器驱动高容性负载
    【MySQL数据库】基本命令操作及语句总结
    【Python深度学习】Python全栈体系(三十)
    大数据请把文章推给想了解DLL的人
    机器人控制LinuxCNC与EtherCAT介绍&&PDO&SDO,搭建环境步骤
    Spring Boot 项目统一结果,统一异常,统一日志,写的太好了
    中国纺织服装市场深度全景调研及投资前景分析报告
    有源噪声控制问题讨论
  • 原文地址:https://blog.csdn.net/obestboy/article/details/134471125