当前位置: > CentOS > CentOS入门 >

Centos中iptables在企业应用讲解

时间:2014-02-21 13:13来源:www.it.net.cn 作者:IT网

iptables企业应用,先看拓扑图:

如图所示,使用虚拟机搭建的实验环境:

1.笔记本电脑(简称外网用户)模拟的是外网用户
2.中间服务器(简称网关)系统Linux,使用iptables防火墙,来当作内网的网关
3.Windows2003是内网中的一台服务器
4.内网的客户端电脑
其中 :
网关eth0通过桥接方式和笔记本电脑通信,而eth1使用custom (VMnet1 host-only)方式
Windows2003也是使用custom (VMnet1 host-only)方式
 
测试:
内网客户端ping 网关

网关本身可不可以上网

 

实验开始:
一、开启网关的内核转发数据包功能,默认Linux是不开启数据包转发功能
 

  1. [root@server1 ~]# echo "1" /proc/sys/net/ipv4/ip_forward      #可以这么开启,不过重启之后就失效了,因为这个文件是内存中的

基于这种情况,要修改内核的配置文件vim /etc/sysctl.conf
 

  1. # Controls IP packet forwarding  

  2. net.ipv4.ip_forward = 1                  #找到这行,把0修改为1

 

  1. [root@server1 ~]# sysctl -p        #这条命令可以把这些指令重新加载到内核中去  

  2. net.ipv4.ip_forward = 1

  3. net.ipv4.conf.default.rp_filter = 1

  4. net.ipv4.conf.default.accept_source_route = 0

  5. kernel.sysrq = 0

  6. kernel.core_uses_pid = 1

  7. net.ipv4.tcp_syncookies = 1

  8. kernel.msgmnb = 65536

  9. kernel.msgmax = 65536

  10. kernel.shmmax = 4294967295

  11. kernel.shmall = 268435456

 

  1. [root@server1 ~]# cat /proc/sys/net/ipv4/ip_forward         #现在查看这个文件的值为1  

  2. 1  

  3. [root@server1 ~]#  

二、在网关上做SNAT使内网电脑可以连接到Internet
 

  1. [root@server1 ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 192.168.18.110

 

客户端上网还有一个前提,就是iptables filter 表中的FORWARD链默认是ACCEPT状态,这么一条才可以使客户端上网。如果默认是DROP状态的话,那客户端也是无法上网的。

 
三、能让客户端上网的方法
 
方法一、把FORWARD的默认策略设置为DROP,然后一个一个服务开放,只能开放我们知道端口(用工具抓包,然后分析出IP地址和端口)的服务或者软件,这种情况会造成迅雷等软件无法使用(因为不知道迅雷下载时候用什么端口)
 
1.能ping
 

  1. iptables -t filter -A FORWARD -p icmp -j ACCEPT

2.能看网页
内网客户机出去的目标端口是80,53都放行

  1. iptables -t filter -A FORWARD -p tcp -i  eth1  --dport 80 -s 192.168.0.0/24 -j ACCEPT  

  2. iptables -t filter -A FORWARD -p tcp  -i  eth1 --dport 53 -s 192.168.0.0/24 -j ACCEPT    

  3. iptables -t filter -A FORWARD -p udp  -i  eth1 --dport 53 -s 192.168.0.0/24 -j ACCEPT  

  4. 者 两者写其中一个即可  

  5. iptables -t filter -A FORWARD -p tcp   --dport 80 -s 192.168.0.0/24 -j ACCEPT  

  6. iptables -t filter -A FORWARD -p tcp   --dport 53 -s 192.168.0.0/24 -j ACCEPT    

  7. iptables -t filter -A FORWARD -p udp  --dport  53 -s 192.168.0.0/24 -j ACCEPT  

解析后回来的源端口是80,53的都给与放行

  1. iptables -t filter -A FORWARD -p tcp -i eth0 --sport 80 -d 192.168.0.0/24 -j ACCEPT  

  2. iptables -t filter -A FORWARD -p udp -i eth0 --sport 53 -d 192.168.0.0/24 -j ACCEPT  

  3. iptables -t filter -A FORWARD -p tcp -i eth0 --sport 53 -d 192.168.0.0/24 -j ACCEPT  

  4. 或者,两者写其中一个即可  

  5. iptables -t filter -A FORWARD -p tcp  --sport 80 -d 192.168.0.0/24 -j ACCEPT  

  6. iptables -t filter -A FORWARD -p udp  --sport 53 -d 192.168.0.0/24 -j ACCEPT  

  7. iptables -t filter -A FORWARD -p tcp  --sport 53 -d 192.168.0.0/24 -j ACCEPT

 
3.能收发邮件
 

  1. iptables -t filter -A FORWARD -p tcp --dport 25 -s 192.168.0.0/24 -j ACCEPT  

  2. iptables -t filter -A FORWARD -p tcp --sport 25 -d 192.168.0.0/24 -j ACCEPT  

  3.  

  4. iptables -t filter -A FORWARD -p tcp --sport 110 -d 192.168.0.0/24 -j ACCEPT  

  5. iptables -t filter -A FORWARD -p tcp --dport 110 -s 192.168.0.0/24 -j ACCEPT    

  6.  

  7. iptables -t filter -A FORWARD -p tcp --sport 143 -d 192.168.0.0/24 -j ACCEPT    

  8. iptables -t filter -A FORWARD -p tcp --dport 143 -s 192.168.0.0/24 -j ACCEPT    

有其他端口的类似设置就可以了,一出一进配合。
 
4.上QQ
QQ登录时可以使用2种情况,udp 8000 /tcp 80、443,会自动检测那个端口开放着,那个开放,就用那个端口登录
UDP 8000
 

  1. iptables -t filter -A FORWARD -p udp --dport 8000 -s 192.168.0.0/24 -j ACCEPT  

  2. iptables -t filter -A FORWARD -p udp --sport 8000 -d 192.168.0.0/24 -j ACCEPT    

  3.  

  4. tcp 80(跟网页端口一样80,所以只要能看网页,那就能上QQ)  

  5. iptables -t filter -A FORWARD -p tcp  --sport 80 -d 192.168.0.0/24 -j ACCEPT  

  6. iptables -t filter -A FORWARD -p tcp   --dport 80 -s 192.168.0.0/24 -j ACCEPT  

  7.  

  8. tcp 443  

  9. iptables -t filter -A FORWARD -p tcp  --sport 443 -d 192.168.0.0/24 -j ACCEPT  

  10. iptables -t filter -A FORWARD -p tcp   --dport 443 -s 192.168.0.0/24 -j ACCEPT  

更严格的措施,就是找出QQ登录服务器的地址,然后设置:

  1. iptables -t filter -A FORWARD -p tcp --dport 443  -s 192.168.0.0/24 -d 119.147.45.43 -j ACCEPT  

  2. iptables -t filter -A FORWARD -p tcp --sport 443 -s 119.147.45.43 -d 192.168.0.0/24 -j ACCEPT  

  3.  

  4. iptables -t filter -A FORWARD -p tcp --dport 80  -s 192.168.0.0/24 -d 112.95.240.16 -j ACCEPT  

  5. iptables -t filter -A FORWARD -p tcp --sport 80 -s 112.95.240.16 -d 192.168.0.0/24 -j ACCEPT  

 
这种情况会造成比较多的软件无法使用,只有一个一个找出软件的IP地址和端口,才能使用,不建议这么设置
 
方法二、也是把FORWARD链的默认策略设置为DROP,然后手工添加要上网的IP地址(当然也可以用脚本批量添加),这样没有进行设置的客户端就无法上网,这种情况可以使用迅雷下载,还可以限制迅雷的速度,推荐使用这种方法
 
做以上设置是很严格了,但是好多应用不能用,而且迅雷这种软件根本就不知道用什么端口,连接那个IP地址,而且我们有事又需要用迅雷下载,这时我们就可以限制迅雷的下载速度,按照以下命令来:
a.让所有出去都可以出去
 

  1. [root@server1 ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 192.168.18.110  

  2. [root@server1 ~]# iptables -t filter -A FORWARD -i eth1 -s 192.168.0.0/24 -j ACCEPT

b.进来的要进行限速,对单个主机进行限速(要在网关的外网卡限制下载的速度,而在内网卡上限制上传的速度)
 

  1. [root@server1 ~]# iptables -t filter -A FORWARD -i eth0 -d 192.168.0.2 -m limit --limit 10/s --limit-burst 10 -j ACCEPT  

按照这个命令,这个主机最大也就14.6KB/S,根据实际情况对速度进行调整
-m limit --limit 10/s --limit-burst 10 该选项就是对主机进行限速
--limit 10/s:10/s是每秒发个10个包,又因网卡的MTU值为1500B,换算成KB,1500/1024=1.46KB,也就是每个包大小理想情况下是1.46KB,每秒10个包,那就是每秒1.46*10=14.6KB/S
--limit-burst 10 :最大峰值也是10个包
 
c.做端口映射,有时间需要把内网的服务器发布到外网,让外网的用户也能访问,这时就需要端口映射。
访问网关的8080端口,就是相当于访问,内网192.168.0.2的80端口
 

  1. [root@server1 ~]# iptables -t nat -A PREROUTING -p tcp  -d 192.168.18.110  --dport 8080 -j DNAT --to 192.168.0.2:80

访问网关的3389端口,就相当于访问内网192.168.0.2的3389端口,这样就把3389端口映射出去了
 

  1. [root@server1 ~]# iptables -t nat -A PREROUTING -p tcp  -d 192.168.18.110 --dport 3389 -j DNAT --to 192.168.0.2:3389

做端口映射时,POSTROUTING链其实可以不做SNAT,iptables就能把进来的包交给内网机器,而内网机器也将数据回复到外网的机器,原因是:iptables是一种状态型的防火墙,不用我们手动将设置数据包的转发方向,它也能很好的转发我们的数据包。
查看nat表和filter表
 

  1. [root@server1 ~]# iptables -t nat -nL  

  2. Chain PREROUTING (policy ACCEPT)  

  3. target     prot opt source               destination          

  4. DNAT       tcp  --  0.0.0.0/0            192.168.18.110      tcp dpt:8080 to:192.168.0.2:80  

  5. DNAT       tcp  --  0.0.0.0/0            192.168.18.110      tcp dpt:3389 to:192.168.0.2:3389  

  6.  

  7. Chain POSTROUTING (policy ACCEPT)  

  8. target     prot opt source               destination          

  9. SNAT       all  --  192.168.0.0/24       0.0.0.0/0           to:192.168.18.110  

  10.  

  11. Chain OUTPUT (policy ACCEPT)  

  12. target     prot opt source               destination          

  13. [root@server1 ~]# iptables -t filter -nL  

  14. Chain INPUT (policy ACCEPT)  

  15. target     prot opt source               destination          

  16.  

  17. Chain FORWARD (policy DROP)  

  18. target     prot opt source               destination          

  19. ACCEPT     all  --  192.168.0.0/24       0.0.0.0/0            

  20. ACCEPT     all  --  0.0.0.0/0            192.168.0.0/24      

  21.  

  22. Chain OUTPUT (policy ACCEPT)  

  23. target     prot opt source               destination          

  24.  

  25. Chain RH-Firewall-1-INPUT (0 references)  

  26. target     prot opt source               destination  

注意:这时候,就算filter中的INPUT和OUTPUT链默认策略是DROP,那也不会影响端口映射的,因为INPUT链和OUTPUT链只会对进入自己和自己出去的做限制,这时候是转发,所以不会影响。
 
d.发布内网的FTP服务器到外网去
先看FTP的工作模式:主动模式和被动模式
主动模式(Active):客户端以一个大于1024端口的随机端口(假设n端口),向服务器的21端口发出请求,服务器用21端口进行回应,然后服务器会以20端口,来主动去连接客户端的(n+1)端口,然后就开始传输数据.只有这种模式下才会用到20端口。

 

现在通过iptables 来发布FTP,先看主动模式:
 

  1. [root@server1 ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.18.110 --dport 21 -j DNAT --to 192.168.0.2:21  

  2. [root@server1 ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.18.110 --dport 20 -j DNAT --to 192.168.0.2:20  

这时客户端如果设置为被动模式的话,是连接不到服务器
 
被动模式(Passive)
客户端以一个大于1024端口的随机端口(假设n端口),向服务器的21端口发出请求,服务器用21端口进行回应(这里面包含一个随机端口m,用于和客户端进行数据传输),然后客户端以n+1端口,连接服务器的m端口,最后传输数据。

 

以被动模式发布FTP,因为被动模式服务器端口是用随机端口和客户端进行数据传输,所以我们就不知道该发布什么端口出去,这时就需要借助2个模块来实现。ip_nat_ftp和ip_conntrack_ftp这2个模块,加载到内核当中去,就可以实现FTP的被动模式的发布。
 

  1. [root@server1 ~]# modprobe ip_nat_ftp  

  2. [root@server1 ~]# modprobe ip_conntrack_ftp  

  3. [root@server1 ~]# lsmod | grep ftp  

  4. 2:ip_nat_ftp              7361  0  

  5. 3:ip_conntrack_ftp       11569  1 ip_nat_ftp  

  6. 14:ip_nat                 20973  2 ip_nat_ftp,iptable_nat  

  7. 15:ip_conntrack           53281  5 ip_nat_ftp,ip_conntrack_ftp,ip_conntrack_netbios_ns,iptable_nat,ip_nat  

  8. 只需要发布21端口出去就可以了。  

  9. [root@server1 ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.18.110 --dport 21 -j DNAT --to 192.168.0.2:21  

这样客户端就可以以被动模式(FTP客户端可以设置被动模式和主动模式)来连接到服务器,这时如果用主动模式连接服务器,是连接不到的。
 
所以FTP工作于什么模式,完全在于FTP客户端的设置,而不在于服务器端,大多数情况下服务器端是不开放20端口,所以我们只能用被动模式去连接处于内网中的FTP服务器
 
方法三、把FORWARD链默认设置为ACCEPT,然后来限制某些服务的运行,这种情况下,无法限制迅雷的速度,因为一旦FORWARD链设置为ACCEPT的话,其他策略设置都不起作用,不推荐这种方法,还有如果上网行为严格的话,那么要找到那么软件的使用的端口及IP地址很是麻烦。
 
限制QQ登录,首先要找到QQ登录都使用那些地址
tcpdump -i eth1 host 192.168.0.2 -s 0 -w qq.pcap  使用这个命令可以抓包,就可以知道某个软件使用什么端口,IP地址信息,然后把qq.pcap下载下来,用wireshark来分析 (点 Statistics-Conversation-IPv4),就可以看到QQ使用了多个地址,默认使用了UDP 8000 端口,把这些地址记下,使用iptables 来做限制
 

  1. iptables -t filter -A FORWARD -p udp -s 192.168.0.0/24 -d 112.95.240.16 --dport 8000 -j DROP

 

  1. iptables -t filter -A FORWARD -p udp -s 192.168.0.0/24 -d 112.95.240.16 -m multiport  --dport 8000,80,443 -j DROP

多端口要这么设置
然后把这些地址和这些端口,封掉,但是webQQ无法封,因为使用80端口,以此类推找到其他不能使用的软件的端口IP地址,禁止掉。

本文出自 “雷纳科斯的博客” 博客,请务必保留此出处http://linux5588.blog.51cto.com/65280/752084

(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容