码迷,mamicode.com
首页 > 其他好文 > 详细

SNAT和DNAT

时间:2015-05-17 23:43:23      阅读:979      评论:0      收藏:0      [点我收藏+]

标签:dnat   snat   

SNATDNAT简介

SNAT:局域网共享一个公网IP接入lnternel,好处如下

1、保护内网用户安全,因为公网地址总有一些人恶意扫描,而内网地址在公网没有路由所以无法被扫描,能被扫描的只有防火墙这一台,这样就减少了被攻击的可能。

2、Ipv4地址匮乏,很多公司只有一个ipv4地址,但是却有几百个用户需要上网,这个时候就需要使用SNAT。

3、省钱,公网地址付费,使用SNAT只需要一个公网ip就可以满足几百人同时上网。

DNAT:向internel发布内网服务器

在内网中有服务器,如果想让公网用户访问有有两种方法。

  1. 配置双网卡,一网卡对内,一网卡对外;一般是高访问量的web服务器,为了避免占用网关的流量才这样做,使用不是很广泛。

  2. 内网web服务器,或是ftp服务器,为了用户在公网也可以访问,有不想买公网ip地址,采用DNAT方案。

SNAT实现

环境拓扑图:


技术分享

环境说明:


系统环境

主机名

地址配置

功能描述

WEB服务器

Centos6.6 64位

WEB

公网:eth0 1.1.1.1

提供web页面,供用户访问

iptables防火墙

Centos6.6 64位

iptables

内网:eth0 172.16.4.1

外网:eth1 1.1.1.2

当有用户访问公网时,修改用户请求数据报的源地址为防火墙公网地址,实现SNAT功能。

内网用户

Centos6.6 64位

LAN

内网:172.16.4.100

网关:172.16.4.1

测试客户端,用来访问外网web服务器

地址转换过程

技术分享

实验过程

前提条件:

1、配置好ip地址,内网用户需要配置网关指向防火墙,保证防火墙可以ping通内网和外网。

2、配置iptables开启路由转发功能,外网配置好web,保证内网可以访问。

开启路由转发功能,实现内外网互相访问

[root@iptables ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@iptables ~]# sysctl -p
net.ipv4.ip_forward = 1

设置完成之后内网主机就可以ping通外网WEB服务器了

[root@LAN ~]# ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=63 time=1.77ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=63 time=0.837ms

公网web服务器配置测试页并启动服务

[root@WEB ~]# echo "internet WEB" >/var/www/html/index.html
[root@WEB ~]# service httpd start

内网访问测试可以正常访问

[root@LAN ~]# curl http://1.1.1.1
internet WEB

但是:从web服务器的日志分析,访问的地址是内网地址,由于是测试环境配置了路由,所以可以访问;如果是生存环境,由于web服务器没有内网的路由,所以内网客户端的请求到达web服务器后,无法回应。

[root@WEB ~]# tail -1 /var/log/httpd/access_log
172.16.4.100 - - [23/Apr/2015:10:37:53 +0800]"GET / HTTP/1.1" 200 13 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu)libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

IPTABLES配置SNAT

配置SNAT将172.16.0.0网络所有主机只要通过防火墙上网就做源地址修改,将源地址修改为1.1.1.2。

iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -oeth1 -j SNAT --to-source 1.1.1.2

内网访问公网web服务器

[root@LAN ~]# curl http://1.1.1.1
internet WEB

查看公网服务器日志显示是防火墙外网ip地址访问的,说明SNAT配置成功。

[root@WEB ~]# tail -1 /var/log/httpd/access_log
1.1.1.2 - - [23/Apr/2015:10:42:33 +0800] "GET/ HTTP/1.1" 200 13 "lib/1.2.3 libidn/1.18 libssh2/1.4.2"

 

设置完成SNAT之后最好可以设置一下IPTABLES规则保证防火墙安全。

IPTABLES主机防火墙规则设置

iptables -A INPUT -s 172.16.4.10 -p tcp --dport 22-j ACCEPT
iptables -A OUTPUT -m state --stateESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP

IPTABLES网络型防火墙转发规则设置;如果是生产环境,可以不用配置,因为公网地址无法访问私网地址,这里配置主要是为了更接近生产环境

iptables -A FORWARD -d172.16.0.0/16  -m state --stateESTABLISHED,RELATED -j ACCEPT
iptables -AFORWARD -s 172.16.0.0/16 -j ACCEPT
iptables -PFORWARD DROP

配置完成之后内网可以访问外网,但是外网已经无法访问内网了

 

动态地址上网说明:

在某些情况下,网关的外网ip地址可能并不固定,如ADSL宽带接入时。为了解决这种问题,IPTABLES提供了一个名为MASQUERADE的数据报控制类型,MASQUERAD同样用来修改源ip地址,只不过他能够自动获取外网ip地址。

iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -oppp0 -j MASQUERADE

DNAT实现

环境拓扑图:


技术分享

环境说明:


系统环境

主机名

地址配置

功能描述

WEB服务器

Centos6.6 64位

WEB

内网:eth0:172.16.4.100

网关:172.16.4.1

提供web页面供用户访问

iptables防火墙

Centos6.6 64位

iptables

内网:eth0 172.16.4.1

外网:eth1 1.1.1.2

当用户请求公网地址的80端口时将请求转发给,内网服务器,实现DNAT功能

外网用户

Centos6.6 64位

WAN

外网:eth0:1.1.1.1

测试客户端,用来访问内网服务器

地址转换过程

技术分享

实现过程

前提条件:

清除所有SNAT的配置,IP地址等相关信息不变,保证内网和外网可以ping通。

配置过程:

配置内网web页面,并启动httpd服务

[root@WEB ~]# echo "LAN WEB" >/var/www/html/index.html
[root@WEB ~]# service httpd start

外网访问内网web服务器

[root@WAN ~]# curl http://172.16.4.100
LAN WEB

防火墙配置DNAT

iptables -t nat -A PREROUTING -d 1.1.1.2 -p tcp--dport 80 -j DNAT --to-destination 172.16.4.100

外网访问IPTABLES防火墙的公网地址,就可以打开网页了

[root@WAN ~]# curl http://1.1.1.2
LAN WEB

但是记录的日志是外网用户的地址

[root@LAN ~]# tail -1 /var/log/httpd/access_log
1.1.1.1 - - [24/Apr/2015:03:38:36 +0800] "GET/ HTTP/1.1" 200 8 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu)libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

本文出自 “梅花香自苦寒来” 博客,请务必保留此出处http://ximenfeibing.blog.51cto.com/8809812/1652136

SNAT和DNAT

标签:dnat   snat   

原文地址:http://ximenfeibing.blog.51cto.com/8809812/1652136

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!