1.IPtables的网络"防火"功能
上一篇讲的防火墙主于主机设置,也就是对一台机子的设置,主要是对filter的INPUT和OUTPUT的过滤,这篇来讲讲Iptables的网络防火功能.route和NAT
2.route路由
如图:A主机本身没有公网IP,它要访问web服务器需要B主机做路由,而B本身也是一台Linux主机,我们如何通过B主机访问互联网呢?
2-1.首先为计算机A添加一条路由
只要是去往192.168.0.0/16这个网络的报文请求都由172.16.251.233这个地址作为网关.
vim /etc/sysconfig/network-script/route-eth0
添加一条:192.168.0.0/16 via 172.16.251.233
尝试去用A主机去pingB主机的外网网卡
这里有疑问了,我们的B主机并没有开启forward功能,为什么A主机能ping通B主机的外网网卡?在Linux中有一个很重要的概念,对于Linux而言,IP地址并不是网卡的,而是内核的.所以这里可以ping通
2-2.开启B主机的forward功能并查看
使用命令:sysctl -w net.ipv4.ip_forward=1(只是临时有效),cat /proc/sys/net/ipv4/ip_forward
2-3.这时候A主机能ping通C主机吗?
来看看
可以看到是ping不通的,为什么?是A的报文不能到达C吗?其实不是的,是A的报文到达了C,而C的网关没有指向B,所以C找不到路回话,所以要给C的网关指向B(在NAT中,就不需要C指网关了,因为NAT中B和C就是在一个网段内的)
2-4.设置web服务器的网关指向192.168.1.10
2-5.使用A主机pingC主机,A和C已经建立连接
2-6.这时候来分析这种情况,如下图中,我们要让主机A可以上网,主机D不能上网,该如何实现
2-7.给主机D加个路由,并查看是否能ping通服务器C,这里主机D是笔者的真实机(物理机windows 8系统的)
2-8.尝试分别用主机A和主机D访问主机C的web服务
2-9.限制主机D访问web,这里主要是设置转发的了,因为是路由啊.有两种策略,一是内网内所有的主机都可以访问web,只限制D主机,二是内网内所有的主机都不能访问web,只开放A主机,只是使用第二种.首先在B主机上关闭所有的转发功能,并尝试用主机A和主机D访问
使用命令:关闭主机B的路由功能
主机A访问web
主机D访问web
2-10.查看主机B是否匹配到拦截的报文
使用命令:iptables –L –nv
2-11:在主机B上设置过Iptables给主机A放行
使用命令:iptables –A FORWARD –s 172.16.251.209 –d 192.168.1.105 –p tcp –dport 80 –j ACCEPT
允许进来
使用命令:iptables –A FORWARD –s 192.168.1.105 –d 172.16.251.209 –p tcp –sport 80 –j ACCEPT
允许出去
2-12.分别再次尝试主机A和主机D能否访问web
A主机访问
D主机访问
2-13.查看web服务器的httpd日志,为了和后面的NAT做比较的,route直接使用自己的网址访问了web,而后面做NAT的时候用的是B主机的公网IP,这里只是为了自己记忆
3.NAT网络地址转换
Basic 静态NAT:每个内网内的主机在NAT服务器上都有对应的一个公网地址来完成对内网地址的转换
NAPT:动态每个内网主机在NAT服务器上只有一个公网IP,各个内网主机在转换IP的时候使用不同的端口,而NAT内部自建有一个会话表,记录各个IP和端口的对应信息.如:内网要访问web,NAT服务器会把内网的192.168.1.10:22022转换成自己的2.2.2.2:33033与1.1.1.1:80通信,当报文返回的时候,都返回给2.2.2.2:33033,而NAT服务器通过查询自建的表,又把数据发送给192.168.1.10:22022,所以数据出去的时候会修改源地址,数据回来的时候会修改目标地址.(只是把私有ip转换成公网ip,所以-to-source是B主机的公网网卡的ip)
源地址转换:SNAT,用于让内网主机访问互联网
目标地址转换:DNAT,让互联网上主机访问本地内网中某服务器上的服务
iptables正是基于SNAT和DNAT这两个机制实现地址转换技术
3-1.在上面的基础上,建立一条NAT规则,(笔者的B主机的内网IP改变了,为172.16.251.244,需要重新指一下路由,其他的都不变)
首先在B主机上的nat表中添加一条规则:
使用命令:iptables –t nat –A POSTROUTING –s 172.16.251.209 –d 192.168.1.105 –j SNAT --to-source 192.168.1.10
3-2.再用A主机去访问C主机
A主机访问C主机
看C主机的IP来源
可以和2-13比较,看出来route和NAT的区别
3-3.A主机请求C主机,对于含有hello字符的包都丢弃
首先笔者已经在C主机的index.html内添加了hello(这里的字符区分大小写),并且为了区别,新建了一个网页aa.html
在B主机上建立规则
尝试访问C主机的index.html和aa.html页面
查看B主机的规则是否被匹配到
4.DNAT(目标地址转换),如图:
现在A主机要访问web服务,但是不直接访问C的地址,而是访问B的外网IP,B实际上是没有web服务的,他只是把目标地址C映射到本地的外网端口上,让外网的用户看起来好像是B提供了web服务一样,但实际上web服务是有C提供的......诶 好乱
4-1.尝试用外网访问NAT服务器的
4-2.在NAT服务器上添加一条规则
使用命令:iptables –t nat –A PREROUTING –d 172.16.251.244 –p tcp –dport 80 –j DNAT –to-destination 192.168.1.105
意思是:只要访问目标地址是172.16.251.244的,并且目标ip是80的,都转发到192.168.1.105的80端口上,这就是目标地址转换,DNAT
4-3.再次尝试访问NAT,可以看到访问成功
5.练习题:基于FORWARD链转发对内部ftp服务的访问
vsftp服务比较特别,它有两条通道,一条命令通道,一条数据通道,所以要放行的话,必须两条通道都放行,我们已经知道他的命令通道的接口是tcp的21号端口,而数据通道的接口是随机的.那如何实现转发呢?
5-1. 注意事项
首先要加载ip_nat_ftp和ip_conntrack_ftp这两个模块,这是临时生效的
使用命令:modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
在/etc/sysconfig/iptables-config中,
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"这是永久生效的
5-2.写iptables的配置信息
iptables -A FORWARD -d 192.168.1.105 -s 172.16.251.209 -p tcp --dport 21 -j ACCEPT #对于目标地址是192.168.1.105 源地址是172.16.251.209,协议是tcp,目标端口是21的都放行 iptables -A FORWARD -s 192.168.1.105 -d 172.16.251.209 -p tcp --sport 21 -j ACCEPT ##对于源地址是192.168.1.105 目标地址是172.16.251.209,协议是tcp,源端口是21的都放行 iptables -A FORWARD -s 172.16.251.209 -d 192.168.1.105 -p tcp -m state –state RELATED,ESTABLISHED -j ACCEPT #状态是RELATED,ESTABLISHED的放行 iptables -A FORWARD -d 172.16.251.209 -s 192.168.1.105 -p tcp -m state --state ESTABLISHED -j ACCEPT #状态是ESTABLISHED的放行
原文:http://lidefu.blog.51cto.com/3429777/1386485