【linux】iptables创建dnat、snat端口转发

场景需求:

某市场采购了一批AWS的ec2实例,放到一个VPC虚拟局域网里面,但只有两三台需要对外开放服务的虚机分配了公网ip,自然也有上网的能力;

其它服务器比如数据库,一没有关联公网ip,二也不允许暴露在互联网,那么问题来了,如果这些服务器需要访问外部的资源如打一些依赖包,如何处理?

临时分配一个公网ip,用完再解除关联?把包从有上网能力的虚机下载下来,然后拷贝到这些服务器里?

作为专业运维人员,前者不符合规矩,容易留下把柄,后者倒不是不可以;

但今天博主要总结分享的是基于linux的iptables的nat端口转发规则以及通过yum缓存rpm包拷贝打依赖包

同时也可以回顾一下上篇文章:【windows】netsh创建的portproxy端口转发映射

iptables-nat端口转发实例配置步骤:

配置之前,我们要了解一下iptables和nat的概念,iptables是linux内核组件netfilter框架中的ip信息包过滤系统工具,也可以理解为iptables是netfilter的管理工具;

(右图是博主理解的filter结构图以供参考)

netfilter提供了linux内核对信息包传输处理的框架,由四个表五条链组成:

四个表:filter、nat、mangle、raw

五条链:prerouting、input、forward、output、postrouting

filter是一般的过滤功能,雷同防火墙的开放策略、nat用于端口映射,地址映射等、mangle则是对特定数据包的修改、raw配置后有限级最高,一般为了不再让iptables做数据包的链接跟踪处理,从而提高性能。

prerouting指数据包进入路由表之前也就是网卡的入口处;input是数据通过路由表后目的地址为本机从此入口进入本机系统处理;forward表示数据通过路由表后目的地址不是本机经过这个链路移交到postrouting从而转发前往目的地址;postrouting即流量发出和网络接口出口处,output则是由本机产生的数据由此向外转发到portrouting前往目的地址;

而今天我们要讲的就是通过iptables配置nat表,分dnat和snat两种,即目的nat和源nat;

两者的区别在于,前者是改变数据包的目的地址,后者则是改变数据包的源地址;

dnat一般配置为内部向外部开放某些端口服务使用,即是供给外部ip向内部访问的规则;

snat一般配置为内部访问外部的地址转换,如源动态端口转换,即提供内部向外部访问时转换为公网身份的规则;

废话不多说,赶快跟随博主一起来看看这个经典的配置实例吧!!!

  • 案例环境:
    首先一台web前置虚机内网ip:192.168.10.101,关联外网ip:124.207.1.1,可访问互联网;
    一台数据库db服务器内网ip:192.168.10.102,无外网ip,无法访问互联网,只能VPC内部网络互相访问;
  • 案例需求:
    让db服务器通过web虚机做转发代理访问外部资源,这里配置了一个外部yum源,供db服务器打相关依赖包;
    yum源采用的是天翼云的:mirrors.ctyun.cn、解析到ip为:101.227.253.28

①、首先在web服务器上启用转发功能:

[root@Moni ~]# echo 1>/proc/sys/net/ipv4/ip_forward

②、其次在web服务器上配置dnat规则,当db服务器访问web本地的80端口时,转发到yum源的101.227.253.28;

[root@Moni ~]# iptables -t nat -A PREROUTING -p tcp --src 192.168.10.102 --dport 80 -j DNAT --to 101.227.253.28

③、然后在web服务器上配置snat规则,把目标地址是db服务器ip192.168.10.102的数据包,源ip改成自己本地ip192.168.10.101;

[root@Moni ~]# iptables -t nat -A POSTROUTING  --src 192.168.10.102 -o eth0 -j SNAT --to 192.168.10.101

④、在db服务器上添加hosts解析yum源指向web虚机192.168.10.101,并配置yum源;

[root@Moni ~]# vi /etc/hosts
192.168.10.101 mirrors.ctyun.cn
[root@Moni ~]# vim /etc/yum.repos.d/tianyy.repo 
[tianyiyun]
name=tianyiyun-yum-source-centos6.9
baseurl=http://mirrors.ustc.edu.cn/centos/6.9/os/x86_64/
enabled=1
gpgcheck=0
思考·总结

如上配置即可实现:

db服务器通过host解析,把yum源指向了web服务器192.168.10.101;当db需要安装依赖包时向web请求,web收到后把请求通过自己的外网出口转发给真实的外部天翼云yum源;

然后天翼云yum源返回数据给web服务器,web收到发送给192.168.10.101的数据包后,把源地址在改成自己的ip,发送给db服务器;

理顺一下,整个收发过程中,请求时,源ip没有改变,即天翼云认为是数据库服务器的请求,自然也返还给db服务器,但是db服务器不认识它,因为它是向web服务器请求的;

所以回来的时候,要做一下snat转发,web服务器把包的源改成自己的,这样db服务器才能成功接收来自于web的返回数据;

有点玄乎是吧,事实上,web服务器作为中间的转发代理,不仅仅做了这两次的转发;当web服务器把数据包请求转发向天翼云yum源的时候,还自动做了两次nat转换,第一次即在出口链postrouting上,把数据包的源ip:192.168.10.102,换成了web服务器出口的公网ip:124.207.1.1,如此天翼云接受的请求源其实是这个公网ip,返回时自然也是返回给它;然后web服务器接收到返回的数据包后,在入口prerouting链上把目标ip再次做了nat转换,换成了之前请求包的源ip:192.168.10.102;最后才是后面的snat,把返回包的源ip也就是天翼云yum源ip换成自己的ip,转发给db服务器;

值得一说是,你会发现上面dnat和snat两条规则的命令,前者是配置在prerouting链上,snat则是配置在postrouting链上的,为什么,自己琢磨去吧;

而这里的结构是抽象的,要记住无论是请求包还是返回数据包都是从prerouting进入的,而不能dang把这个框架放到网络拓扑上,认为返回包是从postrouting进入的,这是理解它时经常犯的一个错误。而如果你能熟练的理解这个结构,那么恭喜你如论是做nat,还是做其它的filter或是包过滤策略,都能快速理解咯。

更晕了是吧,这也是这个案例的神奇之处,当时博主也激动的不行,参照上面那张结构图,其实不难发现它的来龙去脉;

当然我们上面说了,除了上面的方法,还可以在web服务器上下载依赖包,然后拷贝到db服务器上来:

这里其实可以用到yum的包缓存参数,如下:

[root@Moni ~]# vi /etc/yum.conf
keepcache=1 (添加这个参数打开包缓存功能)

如此,在web服务器上安装相关依赖包时,会把安装的rpm包缓存到/var/cache/yum/$basearch/$releasever/目录下;

如:/var/cache/yum/x86_64/6/base/packages/

安装后,就可以到这个目录下,拷贝到db服务器上rpm安装吧,不过考虑到依赖性,可用“--nodeps”或“--force”参数;

(好的就分享到这里,如果您有高见或好的分享,记得留言哦!)


原创文章,转载请注明:转自于公牛博客

本文链接地址:【linux】iptables创建dnat、snat端口转发

18
祝福我们的祖国繁荣昌盛
  • 请尽情挥洒您的笔墨!