iptables使用小计,转发对外的请求

个人学习笔记,谢绝转载!!!

原文:https://www.cnblogs.com/wshenjin/p/12434171.html


场景1

A机器(1.1.1.1)的业务日志需要不断推送到B机器(2.2.2.2)。目前因特殊原因需要下架B机器,将业务迁移到C机器(3.3.3.3),但A机器代码里写死了IP没法改。

可以在A机器上使用iptables的DNAT实现转发:在OUTPUT链上做DNAT,例如:

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A OUTPUT -o eth0 -p tcp -m tcp -d 2.2.2.2 --dport 80 -j DNAT --to-destination 3.3.3.3:80
COMMIT

开启nat转发:

net.ipv4.ip_forward = 1

场景2

另外一个需求:A机器(外1.1.1.1,内10.10.10.10)需要连接B机器(外2.2.2.2, 内20.20.20.20)的MySQL3306。现在AB机器两个机房通过专线打通,需要把连接切到内网。

在不变更业务的情况下,可以在A机器上使用iptables的DNAT+SNAT实现转发:

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A OUTPUT -d 2.2.2.2 -p tcp -m tcp --dport 3306 -j DNAT --to-destination 20.20.20.20:3306
-A POSTROUTING -d 20.20.20.20 -p tcp --dport 3306 -j SNAT --to 10.10.10.10
COMMIT

开启nat转发:

net.ipv4.ip_forward = 1

两个场景的区别

场景1,因为三台机都用公网IP互联,只修改出向数据包的目的地址,数据包的源地址对于C机器来说是可路由的,因此C机器可以正常响应到A机器。
场景2,DNAT修改了出向数据包的目的地址,A机器通过路由表走内网请求到B机器。如果不进行SNAT,那么B机器就会用数据包原地址(A机器的外网IP)作响应,这时候B机器是用内网网卡对A机器做响应的,内网是无法路由到外网,这样就无法响应了(B无法响应)。因此A机器需要SNAT把出向数据包的源地址修改为A机器的内网IP,这样通过DNAT&SNAT后,A-->B的数据包就走了内网了。
(个人理解。。。)

posted @ 2020-03-07 14:39  wshenJin  阅读(362)  评论(0编辑  收藏  举报