SNAT:局域网共享一个公网IP接入lnternel,好处如下
1、保护内网用户安全,因为公网地址总有一些人恶意扫描,而内网地址在公网没有路由所以无法被扫描,能被扫描的只有防火墙这一台,这样就减少了被攻击的可能。
2、Ipv4地址匮乏,很多公司只有一个ipv4地址,但是却有几百个用户需要上网,这个时候就需要使用SNAT。
3、省钱,公网地址付费,使用SNAT只需要一个公网ip就可以满足几百人同时上网。
DNAT:向internel发布内网服务器
在内网中有服务器,如果想让公网用户访问有有两种方法。
配置双网卡,一网卡对内,一网卡对外;一般是高访问量的web服务器,为了避免占用网关的流量才这样做,使用不是很广泛。
内网web服务器,或是ftp服务器,为了用户在公网也可以访问,有不想买公网ip地址,采用DNAT方案。
环境拓扑图:
环境说明:
系统环境 |
主机名 |
地址配置 |
功能描述 |
|
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"
配置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
环境拓扑图:
环境说明:
系统环境 |
主机名 |
地址配置 |
功能描述 |
|
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"