iptables回流方法

遇到的问题:私网内要被访问的(对外网提供服务的)机器这里表示为:私网服务器,它已经通过端口映射功能可以通过公网IP被访问。但是其自身和私网内的其他机器却不能通过公网IP访问这台服务器。

要实现的目标:私网内的机器可以通过其公网IP访问私网内的其它机器或者自身机器。

解决方法:

PREROUTING -s 私网网段 -d 公网IP -j DNAT --to-destination 私网服务器地址 POSTROUTING -s 私网网段 -d 私网服务器地址 -j SNAT --to-source 私网网关

实际参考样例

iptables -t nat -A PREROUTING -s 10.20.20.0/24 -d 146.15.90.96/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.20.20.100 
iptables -t nat -A POSTROUTING -s 10.20.20.0/24 -d 10.20.20.0/24 -j SNAT --to-source 10.20.20.2

第一条的意思就是只要是从(私网网段)这个地址段内访问目的地址是(公网IP)的所有数据包,变更目的地址为(私网服务器地址),这样就变成了 私网地址 访问 私网地址

然后接着第二条,所有 源地址为 私网地址 目的地址为 服务器私网地址 的数据包,变更源地址为 网关IP地址;

这样一来所有的数据都只在Linux内部处理了,不用占用外部带宽了,内网用户也可以正常使用公网域名访问了。

以上方法是我参考的其他网站上面的说明。网上iptables回流教程很多,但是这个网站上说的比较直接明白。本人实际测试时,第二条可以改为:POSTROUTING -s 私网网段 -d 私网网段 -j SNAT --to-source 私网网关。这样设置后,在内网有多台不同对外服务器的时候就不用针对每台服务器设置一次第二条规则了。

最后,还有一位作者把iptables回流问题的实质过程写了一下,有兴趣的可以看看下面的内容。直接复制过来的:

IP“回流”,这个词以前在搞Linux iptables的时候某次听过,也没去仔细思考。

之前给公司发布web服务,外网端口映射给内网服务器的时候碰到,但未解决(必要性很低)。最近在处理外网访问内网,内网有跨网访问专网这些“打洞”事宜的时候,觉得得顺便把这问题给解决了。

具体实例如下: 网吧内网一台主机192.168.0.2建了个WEB服务站点端口80,然后在网关(其内网地址是192.168.0.1、公网地址为166.227.96.166)上映射80端口到192.168.0.2的80端口,这样INTERNET上就能以http://166.227.96.166:80的地址访问到192.168.0.2的WEB站点了。 然后出现了个问题,在同网吧的另一台电脑192.168.0.3上,键入http://166.227.96.166:80,却无法访问该WEB站点。 就这个现象,我们就称之为“不支持回流”了,这里指的是网关上的映射方式不支持回流,所以说“回流”一说,是针对映射方式而言的。

现在我们来看常规情况下,是为什么会发生这种情况的 我以前对iptables特别感兴趣的时候,曾听到过这个问题,但没有深入了解。

过程如下: 192.168.0.3要请求访问166.227.96.166的80端口,根据它掌握的路由表,它本身是不知道电脑166.227.96.166在哪里的,所以把将这个数据包发送给它的默认路由,即电脑192.168.0.1。 注意:这个数据包的源地址是192.168.0.3、源端口假设是1025、目标地址是166.227.96.166、目标端口是80、SYN标志位为1、这是建立TCP连接的第一次握手。

如果“把目标地址为166.227.96.166的数据包发给了192.168.0.1”你听起来觉得有点矛盾,那么我解释一下:其实这个数据包的目标IP地址是166.227.96.166,目标MAC地址却是192.168.0.1的

电脑192.168.0.1接收到了这份数据包(因为它的身份是路由器,所以允许接收和转发目标地址不是自已、MAC地址却是自已接口MAC地址的数据包),它分析这个数据包的目标地址,发现这个数据包是需要中转到电脑192.168.0.2:80去的,于是它把这个数据包转发给了电脑192.168.0.2:80。 注意:这个数据包的源地址是192.168.0.3、源端口是1025、目标地址为192.168.0.2、目标端口为80、SYN标志位为1。我们要注意这个数据包在转发后发生了变化了,即目标地址变了。

电脑192.168.0.2顺利接到了数据包,它马上作出回应,发送一个数据包给电脑192.168.0.3。 注意:这个数据包的源地址是192.168.0.2、源端口是80、目标地址192.168.0.3、目标端口为1025、SYN标志位为1、ACK标志位为1、这是建立TCP连接的第二次握手。

电脑192.168.0.3顺利接到了数据包,然而它发现这是一个来自192.168.0.2:80的回应,因为ACK标志位值为1摆在那里呢。它想不起来什么时候给192.168.0.2:80这个目标对象发送过SYN请求,它认为这是一个错误的数据包,于是决定把这个数据包丢弃。然后继续等待166.227.96.166:80的回应,一直等到超时。 而电脑192.168.0.2这边,它等192.168.0.3:1025的第三次握手请求包发送过来,以便建立一个TCP的连接。同样也没有结果,一直等到超时。三次握手在规定的时间内没有完成,访问宣布流产了。

那么怎么样才能正常访问呢?也就是说怎么样形成“回流”呢?

玄机在于电脑192.168.0.1把第一次握手的那个数据包在转发时,不仅要修改目标地址和端口,也要修改源地址和端口,我们来看一下情况会有什么不同:

电脑192.168.0.1接收到了这份数据包(因为它的身份是路由器,所以允许接收和转发目标IP地址不是自已、MAC地址却是自已接口MAC地址的数据包),它分析这个数据包的目标地址,发现这个数据包是需要中转到电脑192.168.0.2:80去的,于是它把这个数据包通过自已的5201端口转发给了电脑192.168.0.2:80,并在内存里面记录下来了,192.168.0.1:5201已定位给了192.168.0.3:1025。 注意:这个数据包的源地址是192.168.0.1、源端口是5201、目标地址为192.168.0.2、目标端口为80、SYN标志位为1。

电脑192.168.0.2顺利接到了数据包,它马上作出回应,发送一个数据包给电脑192.168.0.1。 注意:这个数据包的源地址是192.168.0.2、源端口是80、目标地址192.168.0.1、目标端口为5201、SYN标志位为1、ACK标志位为1、这是建立TCP连接的第二次握手。

电脑192.168.0.1顺利接到了数据包,检查内存记录发现,这个数据包真正的收货人是192.168.0.3:1025,于是它把这个数据包转发给192.168.0.3。 注意:这个数据包的的源地址是166.227.96.166、源端口为80、目标地址为192.168.0.3、目标端口为1025。我们要注意这个数据包在转发后发生变化了,即源地址变了。这很重要!为什么会变,因为在它心目当中,192.168.0.2:80早已定位给了166.227.96.166:80,映射规则使然。

电脑192.168.0.3顺利接到了数据包,发现期待已久的166.227.96.166:80终于有了回音,它兴奋不已的发出第三次的握手请求。 注意:这个数据包的源地址是192.168.0.3、源端口是1025、目标地址是166.227.96.166、目标端口是80、ACK标志位为1、这是建立TCP连接的第三次握手。

跟前面的数据包一样,这个数据包会从192.168.0.1那里中转给192.168.0.2

以后192.168.0.2:80和192.168.0.3:1025之间来往通信的数据包,全部由192.168.0.1负责中转,“回流”构成了。

现在的“回流”应用常见于内网通过外网IP访问内网的服务器,这需要端口映射的基础。 Linux里的iptables可以增加一条规则来实现对回流的支持 很多硬件路由器不用设置就内建支持的 windows server 2008的dnat/snat内建的映射是可以通过远程路由和访问,但我有次试了没成功,直接用ccproxy来映射,通过。

不知大家明白了没有,这篇文章写下来的确思路更加清晰了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏即时通讯技术

迈向高阶:优秀Android程序员必知必会的网络基础

网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlC...

20420
来自专栏七夜安全博客

无线安全专题_攻击篇--MAC泛洪攻击

18540
来自专栏Java呓语

1·HTTP 概述

本文是《HTTP 权威指南》的第一章节 HTTP 概述的 读书笔记,我会尝试站在 HTTP 设计者 的角度上将知识点编辑成串,所以阅读本文您将收获 HTTP 宏...

12720
来自专栏FreeBuf

我是如何从3亿IP中找到CISCO后门路由器的

接到某单位通知让查找中国具有SYNful Knock后门的CISCO路由器,按照曼迪安特分析的报告称中国已经发现3台具有SYNful Knock后门的路由器,如...

31960
来自专栏Java架构沉思录

一文读懂负载均衡之LVS

根据官方文档LVS支持三种负载工作方式:NAT方式、TUN方式和DR方式。为了说明这三种方式的工作原理,我们首先需要了解一下基础的IP/TCP报文(注意,IP报...

24730
来自专栏即时通讯技术

网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接

本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动。

33820
来自专栏SDNLAB

数据中心内的负载均衡-MPTCP

以手机为例,手机包含两种上网方式,蜂窝移动数据网络(2G,3G,4G)和WIFI网络。我们希望在有WIFI的时候尽量使用WIFI,这样可以节省成本,没有WIFI...

65830
来自专栏散尽浮华

Centos下PPTP环境部署记录

PPTP(点到点隧道协议)是一种用于让远程用户拨号连接到本地的ISP,通过因特网安全远程访问公司资源的新型技术。它能将PPP(点到点协议)帧封装成IP数据包,以...

59080
来自专栏前端黑板报

软件工程师需要了解的网络知识:从铜线到HTTP(四)—— TCP 和路由器

JohnLui:程序员,Swift Contributor,正在写《iOS 可视化编程与 Auto Layout》 基础梳理 截至目前,我们已经得到了三个首部:...

31660
来自专栏企鹅号快讯

ALM损坏后的恢复步骤

ALM是HP出品的软件开发生命周期软件,其全称是Application Lifecycle Management,其采用B/S结构,从需求,业务模型到测试用例和...

201100

扫码关注云+社区

领取腾讯云代金券