SNAT,DNAT以及REDIRECT转发详解
最近负责的其中一个项目的服务器集群出现了点网络方面的问题,在处理过程当中又涉及到了防火墙相关的知识和命令,想着有一段时间没有复习这部分内容了,于是借着此次机会复写了下顺便将本次复习的一些内容以博客的形式记录下来。
SNAT与DNAT
-
SNAT 在路由之后 做源地址转换 (postrouting)
-
DNA 在路由之前 做目的地地址转换 (prerouting)
(1).概述
SNAT: A--->B--->C (比如我们想要访问百度,淘宝等网站)
1. 企业内部的主机A想访问互联网上的主机C,首先将请求数据包(源:ipA,目标:ipC)发送到防火墙所在主机B;
2. B收到后将数据包源地址改为本机公网网卡的ip(源:ipA,目标:ipB),然后经互联网发送给C;
3. C收到后将回应包(源:ipC,目标:ipB)转发给C的路由器,经互联网将回应包转发给B;
4. B收到回应包后修改其目的地址,即回应包改为(源:ipC,目标:ipA)然后将数据包转发给A。
实战举例说明:
-
准备工作:
C机:桥接网卡,作为外网。IP:172.17.252.227
B机:作为NAT转换机,两个网卡都有。IP:172.17.123.224 192.168.199.138
1.开启转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
或者vim /etc/sysctl.conf
`net.ipv4.ip_forward=1`
然后执行sysctl -p
A机:仅主机网卡,作为内网。IP:192.168.199.142
2.添加路由记录route add default gw 192.168.199.138
-
效果:实现内网可以访问外网,外网不可以访问内网
A机:
C机:
在这个过程中,修改了请求报文的源地址,叫做SNAT(source NAT POSTROUTING),用于局域网访问互联网。
不能在防火墙B的prerouting链上设置转换源地址的防火墙策略,因为若在B的prerouting链上设置转换源地址的防火墙策略,此时还未检查路由表,
还不知道要到达数据包中目标主机需经过本机的哪个网卡接口,即还不知道需将源地址替换为哪个公网网卡的ip,需在postrouting设置转换源地址的防火墙策略。
DNAT: C--->B--->A (比如对外发布web网站)
1. 互联网主机C想访问企业内部的web服务器A,但A的地址是私有地址,无法直接访问。此时,C可以访问防火墙的公网地址,
2. C的请求数据包(源:ipC,目标:ipB)到达防火墙B后,在B的prerouting上将请求数据包的目标地址进行修改,并将数据包(源:ipC,目标:ipA)发送给A。
3. A收到后进行回复发送响应包(源:ipA,目的ipC)到防火墙,防火墙收到后对数据包源地址进行修改,并将响应包(源:ipB,目标:ipC)给C。
实现DNAT:
在NAT转换机上:
iptables -t nat -I PREROUTING 1 -d 172.17.123.224 -j DNAT --to-destination 192.168.199.142 转换目标地址
- 效果:实现外网访问内网
C机:
利用这种机制可以将企业内部的服务发布到互联网。
在这个过程中,修改了请求报文的目标地址,叫做DNAT(destination NAT POSTROUTING),用于互联网访问局域网。
必须在防火墙的prerouting上设置修改目标地址的防火墙策略,因为若不在此处修改,请求数据包通过prerouting和路由表后,
由于目标主机是本机,就会将数据包发往input,进而被发往本地进程。
(2).用途
SNAT:源地址转换,其作用是将ip数据包的源地址转换成另外一个地址。
1. 保护内网用户安全,因为公网地址总有一些人恶意扫描,而内网地址在公网没有路由所以无法被扫描,能被扫描的只有防火墙这一台,这样就减少了被攻击的可能。
2. Ipv4地址匮乏,很多公司只有一个ipv4地址,但是却有几百个用户需要上网,这个时候就需要使用SNAT。
3. 省钱,公网地址付费,使用SNAT只需要一个公网ip就可以满足几百人同时上网。
DNAT:目的地地址转换,其作用是将一组本地内部的地址映射到一组全球地址。
在内网中有服务器,如果想让公网用户访问有两种方法。
1. 配置双网卡,一网卡对内,一网卡对外;一般是高访问量的web服务器,为了避免占用网关的流量才这样做,使用不是很广泛。
2. 内网web服务器,或是ftp服务器,为了用户在公网也可以访问,有不想买公网ip地址,采用DNAT方案。
(3). 应用场景
SNAT:
内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,
将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。
DNAT:
当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,
此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布
实现REDIRECT转发:通过改变目标IP和端口,将接受的包转发至不同端口
本例实现目标地址是本机192.168.199.143端口是80的包转发到本机8080端口:
准备工作:修改192.168.199.143主机的httpd服务的监听端口为8080
vim /etc/httpd/conf/httpd.conf
Listen 8080
systemctl restart httpd
防火墙策略:
iptables -t nat -A PREROUTING -d 192.168.199.143 -p tcp --dport 80 -j REDIRECT --to-ports 8080
效果:访问网页的时候不需要加上8080端口也可以访问,因为会把80转换为8080
可能很多人都会发现REDIRECT和上面说过的DNAT有些类似,这里要说明下DNAT和REDIRECT的区别在于,DNAT可以将其数据包发送到除本机以外的其他主机和端口,而REDIRECT则可以将收到的数据包转发到本机的其他端口,所以我理解就是DNAT的策略一般都制定在专门的NAT服务器上,而REDIRECT的策略一般制定在目标主机上当然也可以用来代替DNAT
另外在centos7上还可以用firewalld实现IP和端口的转发:
1. firewall-cmd --add-masquerade 启用伪装
2. firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.199.143 数据转发
3. firewall-cmd --reload 使策略立即生效
也可以实现转发到远程主机,只需要更改为远程主机ip即可
如果配置完以上规则后仍不生效,检查防火墙是否开启80端口,如果80端口已开启,仍无法转发,可能是由于内核参数文件sysctl.conf未配置ip转发功能,具体配置如下:
vi /etc/sysctl.conf
在文本内容中添加:net.ipv4.ip_forward = 1
保存文件后,输入命令sysctl -p生效