关于iptables配置的心得

其实iptables并不是一个很神秘的东西,只是掌握其配置起来比较困难,因为他的语法规则比较繁琐,配置起来比较麻烦,但是如果能掌握其基本用法,配置和使用起来慢慢就会得心应手。本文将从iptables的基本规则和用法详细讲起,然后附加一下案例来对iptables详细的理解,希望本文对你学习iptables有一点帮助下面我们一块来揭开iptables的神秘面纱。

说的iptables,稍微对iptables有一点了解的人都知道,其实iptables就是linux自带的一种防火墙策略,所以我们先来了解一下防火墙分类。

防火墙分类:

 

防火墙有硬件防火墙 --》华为,思科,天融信,神州数码等。

软件防火墙,--》微软的RSA等

主机防火墙,网络防火墙等等

包过滤型防火墙: 安全性较好,但是效率不高

 根据tcp首部或者ip首部数据进行判断

  1.  简单的包过滤    仅检查tcp或者ip的包头信息
  2.  带状态检测的包过滤型

   几种状态:NEW(第一次请求连接 syn=1,ack=0)   ESTABLISHED (已建立的连    接syn=0,ack=1) INVALID (非法的连接) RELATED (相关连的连接)

应用层网关防火墙: 效率好了 但是安全性不佳 是根据数据包传输的实际数据内容进行过滤判断的。

iptables的基本规则

iptables 工作在第三层,即网络层 但是iptables的规则却在kernel中

iptables的功能:
过滤功能 Netfilter: 网络过滤器, Framework
地址转换功能
 NAT: Network Address Translation
 SNAT:源地址转换(POSTROUTING)
 DNAT:目的地址转换(PREROUTING)
iptables包含的表格
  • filter: 策略过滤 iptables 默认的表格  包含三个链 INPUT, OUTPUT, FORWARD 应该在此三道门中做过滤
  • nat: 地址转换啦  PREROUTING, POSTROUTING, OUTPUT
  • mangle: 作用是改变服务类型而使用的表  PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
  • 其中nat  和filter 是配置和使用iptables中最常用的两个,务必要熟悉。
其表格优先级为 raw-->mangle-->nat-->filter,通过下面的图片可以很清楚的明白iptables表格的匹配流程

 

iptables的命令与配置详解

iptables 命令使用规则有种好记的法则就是

iptables –t 表名  指令  链表名   描述 –j  动作

即iptables  [-t TABLE]  COMMAND  CHAIN  [creteria]  -j  ACTION

  • -t  表格,总共有四个,常用的有nat ,filter
  • -A  --append 追加
  • -I   --insert   添加,插入
  • -D  --delete   删除
  • -R –replace   替换

链接管理类:

  • -F, flush, 清空链
  • -N, new,   新建链
  • -X, delete, 删除自定义的空链
  • -E, rename 重命名一个链

默认策略:

  • -P,   --policy 改变策略

清空计数器:

  • -Z, zero
  • 每条规则(包括默认策略)都有两个计数器:
  • 被此规则匹配到的所有数据包的个数;
  • 被此规则匹配到的所有数据包的大小之和;
描述:
  • -s  源地址 【网络号】 【子网】
  • -i  INTERFACE 进口 【eth0】
  • -d  目的地址  【网络号】 【子网】
  • -o  INTERFACE 出口
  • -p {tcp|udp|icmp} 协议
   
   
   
   
  1. [root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j ACCEPT 
  2. [root@localhost ~]# iptables -t nat -L -v  
  3. Chain PREROUTING (policy ACCEPT 3 packets, 905 bytes) 
  4.  pkts bytes target     prot opt in     out     source               destination          
  5.  
  6. Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) 
  7.  pkts bytes target     prot opt in     out     source               destination          
  8.     1   108 ACCEPT     all  --  any    eth0    192.168.0.0/24       anywhere    #新添加的规则          
  9.  
  10. Chain OUTPUT (policy ACCEPT 1 packets, 108 bytes) 
  11.  pkts bytes target     prot opt in     out     source               destination        
扩展匹配:(调用iptables的模块,以便扩展iptables的匹配功能, -m)
隐含扩展 省略了-m 
-p tcp
  • --sport PORT
  • --dport PORT
  • --tcp-flags ACK,SYN,RST,FIN SYN = --syn
  • --tcp-flags ACK,SYN,RST,FIN SYN,ACK,RST,FIN
  • --sport 22:23
  • -p UDP
  • --sport PORT
  • --dport PORT
  • -p icmp
  • --icmp-type
  • 8: echo-request
  • 0: echo-reply
显式扩展: 必须要使用-m指明的扩展,此处列举几个常用的模块,
-m state --state 
iptables 配置实例:
  
  
  
  
  1. #########ssh远程连接 #########
  2. [root@localhost ~]# iptables -A INPUT  -d 192.168.0.100/32 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT 
  3. [root@localhost ~]# iptables -L -n 
  4. Chain INPUT (policy ACCEPT) 
  5. target     prot opt source               destination          
  6. ACCEPT     tcp  --  0.0.0.0/0            192.168.0.100       tcp dpt:22 state NEW,ESTABLISHED  
  7.  
  8. Chain FORWARD (policy ACCEPT) 
  9. target     prot opt source               destination          
  10.  
  11. Chain OUTPUT (policy ACCEPT) 
  12. target     prot opt source               destination          
  13. [root@localhost ~]# iptables -A OUTPUT -s 192.168.0.100 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT 
  14. [root@localhost ~]# iptables -L -n 
  15. Chain INPUT (policy ACCEPT) 
  16. target     prot opt source               destination          
  17. ACCEPT     tcp  --  0.0.0.0/0            192.168.0.100       tcp dpt:22 state NEW,ESTABLISHED  
  18.  
  19. Chain FORWARD (policy ACCEPT) 
  20. target     prot opt source               destination          
  21.  
  22. Chain OUTPUT (policy ACCEPT) 
  23. target     prot opt source               destination          
  24. ACCEPT     tcp  --  192.168.0.100        0.0.0.0/0           tcp spt:22 state ESTABLISHED  
  25. [root@localhost ~]# iptables -P INPUT DROP 
  26. [root@localhost ~]# iptables -P OUTPUT DROP 
  27. [root@localhost ~]# iptables -L -n 
  28. Chain INPUT (policy DROP) 
  29. target     prot opt source               destination          
  30. ACCEPT     tcp  --  0.0.0.0/0            192.168.0.100       tcp dpt:22 state NEW,ESTABLISHED  
  31.  
  32. Chain FORWARD (policy ACCEPT) 
  33. target     prot opt source               destination          
  34.  
  35. Chain OUTPUT (policy DROP) 
  36. target     prot opt source               destination          
  37. ACCEPT     tcp  --  192.168.0.100        0.0.0.0/0           tcp spt:22 state ESTABLISHED 
以上代码的作用是就是把INPUT 和OUTPUT 都设置为DROP,但是不影响远程终端的使用,此时使用ping来ping本主机都不可以。
  
  
  
  
  1. [root@localhost ~]# ping 127.0.0.1 
  2. PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 
  3. ping: sendmsg: Operation not permitted 
  4. ping: sendmsg: Operation not permitted 
  5. ping: sendmsg: Operation not permitted 
  6. ping: sendmsg: Operation not permitted 
  7. ping: sendmsg: Operation not permitted 
  8. ping: sendmsg: Operation not permitted 
  9.  
  10. --- 127.0.0.1 ping statistics --- 
  11. 6 packets transmitted, 0 received, 100% packet loss, time 5005ms 
解决方法为,添加两条规则,从本主机来的到本主机去的统统放行。
  
  
  
  
  1. [root@localhost ~]# iptables -I INPUT 1 -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT  
  2. [root@localhost ~]# iptables -I OUTPUT 1 -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT  
  3. [root@localhost ~]# ping 127.0.0.1 
  4. PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 
  5. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=1.94 ms 
  6. 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.161 ms 
  7. 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.089 ms 
  8. 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.105 ms 
  9.  
  10. --- 127.0.0.1 ping statistics --- 
  11. 4 packets transmitted, 4 received, 0% packet loss, time 3003ms 
  12. rtt min/avg/max/mdev = 0.089/0.574/1.942/0.790 ms 
如果在内部网络中还有web服务器,就可以打开80端口,让外部和内部数据从80端口放行
  
  
  
  
  1. #web服务器访问
  2. [root@localhost ~]# iptables -A INPUT  -d 192.168.0.100/32 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT 
  3. [root@localhost ~]# iptables -A OUTPUT -s 192.168.0.100 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT 
  4. #此时就可以访问内部网络中的web服务器。 
-m multiports 实现多端口融合
       --source-ports [!]  
       --destination—ports [!] 
       --ports [!] 
       [!]:叹号可以对端口取反 
  
  
  
  
  1. [root@localhost ~]# iptables -L -n -v
  2. Chain INPUT (policy DROP 1784 packets, 162K bytes) 
  3.  pkts bytes target     prot opt in     out     source               destination    
  4.     8   672 ACCEPT     all  --  *      *       127.0.0.1            127.0.0.1      
  5.  1107 80788 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.100 e NEW,ESTABLISHED  
  6.     0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.100 e NEW,ESTABLISHED  
  7.  
  8. Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) 
  9.  pkts bytes target     prot opt in     out     source               destination    
  10.  
  11. Chain OUTPUT (policy DROP 65 packets, 4044 bytes) 
  12.  pkts bytes target     prot opt in     out     source               destination    
  13.     8   672 ACCEPT     all  --  *      *       127.0.0.1            127.0.0.1      
  14.   582 62676 ACCEPT     tcp  --  *      *       192.168.0.100        0.0.0.0/0     e ESTABLISHED  
  15. 0     0 ACCEPT     tcp  --  *      *       192.168.0.100        0.0.0.0/0     e ESTABLISHED 
  16.  
  17. [root@localhost ~]# iptables -I INPUT 2 -d 192.168.0.100 -p tcp -m state --state NEW,ESTABLISHED-m multiport --destination-ports 22,80 -j ACCEPT 
  18. #这条规则把2,3 整合在一起,起到规则优化的作用

  
  
  
  
  1. #万能规则 
  2. [root@localhost ~]# iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT 
  3. [root@localhost ~]# iptables -L -n -v 

此时就可以把OUTPUT链中的规则3,4 删除了,这样就减少了对规则条数的匹配,从而也对iptables起到了优化作用。

-m iprange 指定ip地址范围,

  • --src-range 源地址范围
  • --dst-range 目的地址范围
  •    
       
       
       
    1. [root@localhost ~]# iptables -A INPUT -m iprange --src-range 192.168.0.100-192.168.0.200 -p tcp --dport 23 -m state --state NEW -j ACCEPT 
    2. [root@localhost ~]# iptables -L -n -v 
    3. Chain INPUT (policy DROP 3745 packets, 340K bytes) 
    4.  pkts bytes target     prot opt in     out     source               destination          
    5.     8   672 ACCEPT     all  --  *      *       127.0.0.1            127.0.0.1            
    6.  1335 87098 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.100       state NEW,ESTABLISHED multiport dports 22,80  
    7.  1481  108K ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.100       tcp dpt:22 state NEW,ESTABLISHED  
    8.     0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.100       tcp dpt:80 state NEW,ESTABLISHED  
    9.     0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           source IP range 192.168.0.100-192.168.0.200 tcp dpt:23 state NEW 
-m limit 限制连接次数,保证了主机的安全性。
  • --limit rate 平均最大速率限定匹配到的数据包的个数
  • --limit-burst  number 平均最大数率的峰值 默认为5
  •     
        
        
        
    1. [root@localhost ~]# iptables -A INPUT -s 192.168.0.100 -p tcp --dport 80 -m state --state NEW -m limit --limit 3/minute --limit-burst 5 -j ACCAPT 
    2. [root@localhost ~]# iptables -L -n -v 
    3. Chain INPUT (policy DROP 3745 packets, 340K bytes) 
    4.  pkts bytes target     prot opt in     out     source               destination          
    5.     8   672 ACCEPT     all  --  *      *       127.0.0.1            127.0.0.1            
    6.  1651  109K ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.100       state NEW,ESTABLISHED multiport dports 22,80  
    7.  1481  108K ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.100       tcp dpt:22 state NEW,ESTABLISHED  
    8.     0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.100       tcp dpt:80 state NEW,ESTABLISHED  
    9.     0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           source IP range 192.168.0.100-192.168.0.200 tcp dpt:23 state NEW  
    10.     0     0 ACCAPT     tcp  --  *      *       192.168.0.100        0.0.0.0/0           tcp dpt:80 state NEW limit: avg 3/min burst 5  
    11.   # 平均没分钟三次连接,最大达到五次,超过则不予响应
    12. Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) 
    13.  pkts bytes target     prot opt in     out     source               destination          
    14.  
    15. Chain OUTPUT (policy DROP 452 packets, 27288 bytes) 
    16.  pkts bytes target     prot opt in     out     source               destination          
    17.     0     0 ACCEPT     all  --  *      *       127.0.0.1            127.0.0.1            
    18.  1521  147K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state ESTABLISHED  
 
-m string  string模块可以限制使用模式匹配出来的字符串,明确要求内核在2.6.14以上
--algo bm|kmp  (字符串编码的算法) 选项是必须的
--string "STRING" 这个选项也是必须的
小案例  用户访问的web页面中不能包含magedu,如果包含这样的字符串,则该网页不能被访问
   
   
   
   
  1. [root@localhost ~]# iptables -I OUTPUT 1 -m string --algo kmp --string "magedu" -j REJECT 
  2. [root@localhost ~]# iptables -L -n 
  3. Chain INPUT (policy DROP) 
  4. target     prot opt source               destination          
  5. ACCEPT     all  --  127.0.0.1            127.0.0.1            
  6. ACCEPT     tcp  --  0.0.0.0/0            192.168.0.100       state NEW,ESTABLISHED multiport dports 22,80  
  7. ACCEPT     tcp  --  0.0.0.0/0            192.168.0.100       tcp dpt:22 state NEW,ESTABLISHED  
  8. ACCEPT     tcp  --  0.0.0.0/0            192.168.0.100       tcp dpt:80 state NEW,ESTABLISHED  
  9. ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           source IP range 192.168.0.100-192.168.0.200 tcp dpt:23 state NEW  
  10. DROP       tcp  --  192.168.0.100        0.0.0.0/0           tcp dpt:80 state NEW limit: avg 3/min burst 5  
  11.  
  12. Chain FORWARD (policy ACCEPT) 
  13. target     prot opt source               destination          
  14.  
  15. Chain OUTPUT (policy DROP) 
  16. target     prot opt source               destination          
  17. REJECT     all  --  0.0.0.0/0            0.0.0.0/0           STRING match "magedu" ALGO name kmp TO 65535reject-with icmp-port-unreachable  
  18. ACCEPT     all  --  127.0.0.1            127.0.0.1            
  19. ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state ESTABLISHED  
 
-m time 定义时间模块 
--timestart 8:00 --timestop 18:00 -j DROP
--days
 
iptables保存规则
我们刚刚配置的iptables规则在开机启动的时候是会消失的,所以在配置完iptables规则之后我们要保存,避免下次开机时消失,
  
  
  
  
  1. /etc/rc.d/init.d/iptables 
  2. service iptables start: 启用保存的规则 
  3. service iptables stop: 
  4.  
  5. /etc/sysconfig/iptables: 保存规则的文件 
  6. /etc/sysconfig/iptables-config:向iptables脚本提供配置文件的文件 
  7.  
  8.  
  9. service iptables save 
  10. iptables-save > /etc/sysconfig/iptables.test #使用数据流重定向到到该文件
  11. iptables-restore < /etc/sysconfig/iptables.test #读取规则

利用iptablesrecent模块来抵御DOS攻击

 
  
  
  
  
  1. #ssh: 远程连接 
  2.  
  3. iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP 
  4. iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH 
  5. iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP 
1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;
2.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制一分钟后即可恢复访问
 
1.第一句是记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
 
2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
 --update 是指每次建立连接都更新列表;
 --seconds必须与--rcheck或者--update同时使用
 --hitcount必须与--rcheck或者--update同时使用
 
综合案例
通过这个简单的案例来深入了解iptables的工作原理和相关配置
案例1 
某家公司有三个部门,工程部,软件部和经理部,上班时间假设为每天8:00-20:00 。
工程部ip地址范围 192.168.0.10 -----192.168.0.20
软件部ip地址范围 192.168.0.21 -----192.168.0.30
经理部ip地址范围 192.168.0.31 -----192.168.0.40
对三个部门在不同的时间有不同的上网要求:
工程部。上班只能访问ftp://192.168.0.100 。其他什么都不允许访问,下班时间没有任何限制,可以随便访问internet
软件部 :上班时间可以使用http访问www.abc.com ,但是不允许访问站内内容包含sina的站点 ,下班时间没有任何限制
经理部门没有限制
具体实现如下
   
   
   
   
  1. [root@localhost ~]# iptables -t -nat -A POSTROUTING -s 192.168.0.0/24 -oeth0 -j MASQUERADE
  2. #使用地址伪装来为内部网络snat,是内部网络能访问互联网 
  3. [root@localhost ~]# iptables -P FORWARD DROP 
  4. #关闭forward链,因为过滤策略将在此链上做
  5. [root@localhost ~]# iptables -A FORWARD -m iprange --src-range 192.168.0.10-192.168.0.20 
  6. -m time --timestart 08:00 --timestop 20:00 -p tcp --dport 21 -j ACCEPT 
  7. #工程部在上班时间只能访问ftp服务器,但是现在还不能访问到,需要对端口关联才可以
  8. [root@localhost ~]# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
  9.  #实现端口相关联
  10. [root@localhost ~]# modprobe ip_nat_ftp 
  11.  
  12. [root@localhost ~]# iptables -A FORWARD -s 192.168.0.0/24 -m time --timestart 20:01 
  13. --timestop 07:59 -j ACCEPT 
  14. #下班时间对各个部门无限制
从上边的命令来看,对软件部还没有做限制,因为对软件部的限制要结合squid代理服务器实现,此处只讲到iptables,所以在后期的基于squid透明代理的学习中在给大家详细阐述,完善笨案例。
 
总结:学习iptables可以在掌握其基本语法规则的情况下,通过实现一个一个的小的案例来深刻体会iptables她那神奇的用法,到实现一个大案例的时候就会得心应手。
 
iptables就为大家详解到这里,本人水平有限,错误之处请谅解,指正。不懂之处请留言。继续更新,给力内容继续呈现。。。。。。
 
 
 
 

 

你可能感兴趣的:(iptables规则)