centos iptables snat centos8官网下载教程

大家好,关于centos iptables snat很多朋友都还不太明白,今天小编就来为大家分享关于centos8官网下载教程的知识,希望对各位有所帮助!

IPtables中SNAT,DNAT和MASQUERADE的区别

IPtables中可以灵活的做各种网络地址转换(NAT)

网络地址转换主要有两种:SNAT和DNAT

SNAT是source network address translation的缩写即源地址目标转换

比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP。PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip。当外部网络的服务器比如网站web服务器接到访问请求的时候,他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip。

这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了。所以叫做SNAT,基于源地址的地址转换。

DNAT是destination network address translation的缩写即目标网络地址转换

典型的应用是,有个web服务器放在内网,配置内网ip,前端有个防火墙,配置公网ip,互联网上的访问者使用公网ip来访问这个网站。当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网ip。防火墙会把这个数据包的报头改写一次,将目标地址改写成web服务器的内网ip,然后再把这个数据包发送到内网的web服务器上这样,数据包就穿透了防火墙,并从公网ip变成了一个对内网地址的访问了,即DNAT,基于目标的网络地址转换。

MASQUERADE,地址伪装,在iptables中有着和SNAT相近的效果,但也有一些区别:

SNAT,DNAT,MASQUERADE都是NAT,MASQUERADE是SNAT的一个特例。

SNAT是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样,接收方就认为数据包的来源是被替换的那个IP的主机。

MASQUERADE是用发送数据的网卡上的IP来替换源IP,因此,对于那些IP不固定的场合,比如拨号网络或者通过dhcp分配IP的情况下,就得用MASQUERADE。

DNAT,就是指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B。

因为,路由是按照目的地址来选择的,因此,DNAT是在PREROUTING链上来进行的,而SNAT是在数据包发送出去的时候才进行,因此是在POSTROUTING链上进行的

但使用SNAT的时候,出口ip的地址范围可以是一个,也可以是多个,例如:

如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去

iptables-t nat-A POSTROUTING-s 10.8.0.0/255.255.255.0-o eth0-j SNAT–to-source 192.168.5.3

如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等几个ip然后发出去

iptables-t nat-A POSTROUTING-s 10.8.0.0/255.255.255.0-o eth0-j SNAT–to-source 192.168.5.3-192.168.5.5

这就是SNAT的使用方法,即可以NAT成一个地址,也可以NAT成多个地址

但是,对于SNAT,不管是几个地址,必须明确的指定要SNAT的ip

假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口ip192.168.5.3都会改变

而且改变的幅度很大,不一定是192.168.5.3到192.168.5.5范围内的地址

这个时候如果按照现在的方式来配置iptables就会出现问题了

因为每次拨号后,服务器地址都会变化,而iptables规则内的ip是不会随着自动变化的

每次地址变化后都必须手工修改一次iptables,把规则里边的固定ip改成新的ip

这样是非常不好用的

MASQUERADE就是针对这种场景而设计的,他的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT

比如下边的命令:

iptables-t nat-A POSTROUTING-s 10.8.0.0/255.255.255.0-o eth0-j MASQUERADE

如此配置的话,不用指定SNAT的目标ip了

不管现在eth0的出口获得了怎样的动态ip,MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去

这样就实现了很好的动态SNAT地址转换

解析iptables中SNAT和MASQUERADE之间的区别

一、SNAT与DNAT概念

IPtables中可以灵活的做各种网络地址转换(NAT),网络地址转换主要有两种:SNAT和DNAT。

SNAT是source network address translation的缩写,即源地址目标转换。比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP,PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip,当外部网络的服务器比如网站web服务器接到访问请求的时候,他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip,这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了,所以叫做SNAT,基于源地址的地址转换。

DNAT是destination network address translation的缩写,即目标网络地址转换,典型的应用是,有个web服务器放在内网配置内网ip,前端有个防火墙配置公网ip,互联网上的访问者使用公网ip来访问这个网站,当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网ip,防火墙会把这个数据包的报头改写一次,将目标地址改写成web服务器的内网ip,然后再把这个数据包发送到内网的web服务器上,这样,数据包就穿透了防火墙,并从公网ip变成了一个对内网地址的访问了,即DNAT,基于目标的网络地址转换。

二、MASQUERADE概念

MASQUERADE,地址伪装,在iptables中有着和SNAT相近的效果,但也有一些区别,但使用SNAT的时候,出口ip的地址范围可以是一个,也可以是多个,例如:

如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去,

复制代码代码如下:iptables-t nat-A POSTROUTING-s 10.8.0.0/255.255.255.0-o eth0-j SNAT–to-source 192.168.5.3

如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等几个ip然后发出去

复制代码代码如下:iptables-t nat-A POSTROUTING-s 10.8.0.0/255.255.255.0-o eth0-j SNAT–to-source 192.168.5.3-192.168.5.5

这就是SNAT的使用方法,即可以NAT成一个地址,也可以NAT成多个地址,但是,对于SNAT,不管是几个地址,必须明确的指定要SNAT的ip,假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口ip192.168.5.3都会改变,而且改变的幅度很大,不一定是192.168.5.3到192.168.5.5范围内的地址,这个时候如果按照现在的方式来配置iptables就会出现问题了,因为每次拨号后,服务器地址都会变化,而iptables规则内的ip是不会随着自动变化的,每次地址变化后都必须手工修改一次iptables,把规则里边的固定ip改成新的ip,这样是非常不好用的。

MASQUERADE就是针对这种场景而设计的,他的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT。

比如下边的命令:

复制代码代码如下:iptables-t nat-A POSTROUTING-s 10.8.0.0/255.255.255.0-o eth0-j MASQUERADE

如此配置的话,不用指定SNAT的目标ip了,不管现在eth0的出口获得了怎样的动态ip,MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去,这样就实现了很好的动态SNAT地址转换。

用一个实例深入理解iptables的SNAT/DNAT

文中对于数据包的分析,是本文的核心中的核心,望读者细读!

这是我前几天遇到的一个实际问题:

我在实验室的服务器(物理机)上启动了一个虚拟机,虚拟机通过网桥连接了服务器的一个网卡从加入到服务器所在的内部互连网段.

这个时候我希望通过访问服务器的指定端口,来连接虚拟机,注意我们访问服务器使用的是另一个网卡,与虚拟机并不在同一个网段!

显然这需要配置DNAT,但是配置后连接被拒绝,百思不得解之后在知乎提问:

iptables配置DNAT连接ssh,为什么仍然提示端口拒绝

非常感谢

@Virtual@gongjunhe@染红了的枫叶林三位同志的指点,现将所学奉上.

我的个人主机, IP为:

物理机服务器, IP为:

虚拟机, IP为:

可以看到H1和H2的em2在同一网段, H3和H2的em1在同一网段

即:

注意:

在下面的截图中,

filter表的默认Target都是Accept;

nat表没有建立任何规则;

Linux的路由转发确保是打开状态.

我们的目标是,通过H2的11122端口访问H3的22端口,即:

配置如下规则:

此时我们在H2上进行测试:

此时在H1上进行测试:

一个是拒绝连接,一个是超时,这是为什么呢?

我们看下面这个图,如果数据从H2上发送,那么将会经过OUTPUT和POSTROUTING两个链,但是我们的DNAT规则其实是配置在PREOUTING中的,因此我们从H2上访问,实际上并没有进行地址转换,因此连接被拒绝!

因此我们在OUTPUT中再配置一个看看:

再尝试ssh连接:

我们发现和H1一样,超时了,很好! WHY?

我们分别打印,H2和H1连接H3的时候, H3上的抓包情况:

H2链接时:

H1连接时:

说明H3的的确收到了来自H1和H2的连接请求.

这是因为什么呢?

因为H1和H2的数据包发送到H3, H3想返回数据,但是发现数据发不出去,因为源地址不可达!

以H1为例:

经过上述过程,就完成了一次通讯!

但是问题出在了第三步,那就是H3没办法将数据包发送到H2中,因为目的地址其实是

也即,这是H1的地址,因此即使是H3可以路由到H1(在我的机器上的确是这样的),那么也无法完成上述的环路!

怎么办呢?

我们需要将包的源地址,进行SNAT转化,将其修改为H2的地址从而帮助完成环路:

看看,此时是否成功:

H1:

[图片上传失败...(image-eb2b58-1636597174011)]

H2:

解决问题!

那么此时完整的环路是怎样的呢?

还是以H1为例:

上述过程,用梁耀湘的话说,那就是:畅通无阻

我们来分析一下,为什么H2不做SNAT,也无法成功呢?

前面提到,想要完成回路,H2必须要接收到来自H3的包,虽然我上面的拓扑没有画,但是其实H3是可以访问到H2.

但是依然不行,这个是因为H3回到H2的包源地址和目标地址必须是确定的,这样才能根据DNAT的记录去恢复原来的地址.

但是H3访问H2其实也是通过SNAT转发,这样回到H2的时候,源地址其实已经改变了,因此依然无法完成回路.

那么如果H3可以直接把数据给到H2,是不是就不用SNAT了呢?是的!

但是我们要用H2另一个网段,即

我们分析下环路:

这个关键的过程由于两者在同一网段,是可以轻松实现的.

那么这种情况下是不需要进行SNAT的.当然了,这种配置是没有价值的!

阅读剩余
THE END