zoukankan      html  css  js  c++  java
  • 20个Linux防火墙[iptables]应用技巧[转]

    1.显示防火墙的状态

    以root权限运行下面的命令:

    1. # iptables -L -n -v 

    参数说明:

    • -L:列出规则。
    • -v:显示详细信息。此选项会显示接口名称、规则选项和TOS掩码,以及封包和字节计数。
    • -n:以数字形式显示IP地址和端口,不使用DNS解析。

    如果希望输出的结果中显示行号,可以运行:

    1. # iptables -L -n -v --line-nmubers 

    这样,就可以按照行号在防火墙中添加、删除规则。

    要显示输入或输出链规则,可以运行:

    1. # iptables -L INPUT -n -v  
    2. # iptables -L OUTPUT -n -v --line-numbers 

    2.停止、开启和重启防火墙

    如果你使用的是RHEL/Fedora/CentOS系统,可以运行:

    1. # service iptables stop  
    2. # service iptables start  
    3. # service iptables restart 

    我们也可以使用iptables命令停止防火墙并删除所有规则:

    1. # iptables -F  
    2. # iptables -X  
    3. # iptables -t nat -F  
    4. # iptables -t nat -X  
    5. # iptables -t mangle -F  
    6. # iptables -t mangle -X  
    7. # iptables -P INPUT ACCEPT  
    8. # iptables -P OUTPUT ACCEPT  
    9. # iptables -P FORWARD ACCEPT 

    参数说明:

    • -F:删除所有的规则
    • -X:删除链
    • -t table_name:匹配表(称为nat或mangle)
    • -P:设置默认策略(如DROP、REJECT或ACCEPT)

    3.删除防火墙规则

    以带行号的形式显示已有的防火墙规则,请运行:

    1. # iptables -L INPUT -n --line-numbers  
    2. # iptables -L OUTPUT -n --line-numbers  
    3. # iptables -L OUTPUT -n --line-numbers | less  
    4. # iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1 

    下面我们使用行号删除规则:

    1. # iptables -D INPUT 4 

    将IP地址202.54.1.1从规则中删除:

    1. # iptables -D INPUT -s 202.54.1.1 -j DROP 

    参数说明:

    • -D:从选择的链中删除一条或多条规则

    4.插入防火墙规则

    首先运行下面的命令:

    1. # iptables -L INPUT -n --line-numbers 

    得到运行结果:

    1. Chain INPUT (policy DROP)  
    2. num  target    prot opt source     destination  
    3. 1   DROP      all  --  202.54.1.1  0.0.0.0/0  
    4. 2   ACCEPT    all  --  0.0.0.0/0    0.0.0.0/0 

    在行1和行2之间插入规则:

    1. # iptables -I INPUT 2 -s 202.54.1.2 -j DROP 

    查看更新后的规则,会发现插入成功,下面是示例:

    1. Chain INPUT (policy DROP)  
    2. Num  target    prot opt source    destination     
    3. 1     DROP    all  --  202.54.1.1  0.0.0.0/0  
    4. 2     DROP    all  --  202.54.1.2  0.0.0.0/0  
    5. 3     ACCEPT  all  --  0.0.0.0/0    0.0.0.0/0 

    5.保存防火墙规则

    在RHEL/Fedora/CentOS Linux下,可以使用下面的命令保存防火墙规则:

    1. # service iptables save 

    在其它Linux发行版(如Ubuntu)上,可以使用iptables-save命令保存防火墙规则:

    1. # iptables-save > /root/my.active.firewall.rules  
    2. # cat /root/my.active.firewall.rules 

    6.重新加载防火墙规则

    我们可以使用iptables-restore命令重新加载使用iptables-save命令保存的防火墙规则:

    1. # iptables-restore < /root/my.active.firewall.rules 

    我们还可以利用这种特性来快速部署防火墙规则。

    7.设置默认防火墙策略

    我们首先来配置一个防火墙策略,它默认丢弃所有的网络数据包:

    1. # iptables -P INPUT DROP  
    2. # iptables -P OUTPUT DROP  
    3. # iptables -P FORWARD DROP  
    4. # iptables -L -v -n
    5. #连接失败,因为防火墙丢弃所有的网络数据包  
    6. # ping cyberciti.biz  
    7. # wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2 

    在此基础上,我们只关闭入站连接:

    1. # iptables -P INPUT DROP  
    2. # iptables -P FORWARD DROP  
    3. # iptables -P OUTPUT ACCEPT  
    4. # iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT  
    5. # iptables -L -v -n  
    6. #ping和wget可以正常工作  
    7. # ping cyberciti.biz  
    8. # wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2 

    8.在公网网络接口上停用私有网络地址

    我们可以从公网网络接口上删除私有IPv4网段,以防止IP欺骗。运行下面的命令,没有源路由地址的数据包会被丢弃:

    1. # iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP  
    2. # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP 

    下面是私有网络IPv4地址范围,请确认在公网接口予以屏蔽:

    • 10.0.0.0/8 -j (A)
    • 172.16.0.0/12 (B)
    • 192.168.0.0/16 (C)
    • 224.0.0.0/4 (多播 D)
    • 240.0.0.0/5 (E)
    • 127.0.0.0/8 (回环)

    9.屏蔽IP地址访问

    如果我们想屏蔽一个IP地址,比如1.2.3.4,可以运行:

    1. # iptables -A INPUT -s 1.2.3.4 -j DROP  
    2. # iptables -A INPUT -s 192.168.0.0/24 -j DROP 

    10.屏蔽入栈端口请求

    如果我们想80端口上屏蔽所有的服务请求,可以运行:

    1. # iptables -A INPUT -p tcp --dport 80 -j DROP  
    2. # iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP 

    只想屏蔽IP地址1.2.3.4对80端口的请求,可以运行:

    1. # iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP  
    2. # iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP 

    11.屏蔽出栈IP地址

    现在我们来演示如何屏蔽对主机名和IP地址的出栈访问。

    首先,我们来获取一个域名的IP地址:

    1. # host -t a cyberciti.biz 

    输出示例:

    1. cyberciti.biz has address 75.126.153.206 

    要屏蔽访问域名cyberciti.biz的网络数据包,可以运行:

    1. # iptables -A OUTPUT -d 75.126.153.206 -j DROP 

    下面是使用子网掩码的示例:

    1. # iptables -A OUTPUT -d 192.168.1.0/24 -j DROP  
    2. # iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP 

    下面我们以屏蔽facebook.com为例,进行说明。首先,我们需要facebook的所有IP地址:

    1. # host -t a www.facebook.com 

    示例输出:

    1. www.facebook.com has address 69.171.228.40 

    找出IP地址69.171.228.40的CIDR:

    1. # whois 69.171.228.40 | grep CIDR 

    示例输出:

    1. CIDR:69.171.224.0/19 

    现在我们来阻止对facebook.com的访问:

    1. # iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP 

    我们也可以直接屏蔽域名:

    1. # iptables -A OUTPUT -p tcp -d www.facebook.com -j DROP  
    2. # iptables -A OUTPUT -p tcp -d facebook.com -j DROP 

    12.记录并丢弃数据包

    在公网网络接口上记录并丢弃IP地址欺骗数据包:

    1. # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "  
    2. # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP 

    默认情况下日志记录在/var/log/messages文件中:

    1. # tail -f /var/log/messages  
    2. # grep --color 'IP SPOOF' /var/log/messages 

    我们还可以用-m参数对日志记录进行限制,以防止日志文件过度膨胀。

    1. # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "  
    2. # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP 

    13.根据MAC地址允许或阻止数据包的传入

    我们可以根据MAC地址允许或阻止数据包的传入:

    1. # iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP 

    14.屏蔽ICMP ping请求

    我们可以通过允许下面的命令屏蔽ping请求:

    1. # iptables -A INPUT -p icmp --icmp-type echo-request -j DROP  
    2. # iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP 

    也可以按照特定的网段和主机限制ping请求:

    1. # iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT 

    以下命令只接受受限制的ping请求:

    1. #假定默认INPUT策略为丢弃数据包  
    2. # iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT  
    3. # iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT  
    4. # iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT  
    5. #所有的服务器都对ping请求作出应答  
    6. # iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT 

    15.开启端口序列

    下面的命令可以允许7000到7010范围内的TCP端口访问:

    1. # iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT 

    16.允许一系列IP地址访问

    下面的命令可以允许IP地址范围

    1. #运行IP地址范围192.168.1.100 到192.168.1.200 访问80端口  
    2. # iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT  
    3. #NAT示例  
    4. # iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25 

    17.建立连接并重启防火墙

    当重启iptables服务时,它会断开所有已建立的连接。这是因为在重启防火墙时,会卸载IPTABLES_MODULES_UNLOAD模块。

    要解决这个问题,可以编辑/etc/sysconfig/iptables-config

    1. IPTABLES_MODULES_UNLOAD = no 

    18.使用Crit日志级别

    1. # iptables -A INPUT -s 1.2.3.4 -p tcp --destination-port 80 -j LOG --log-level crit 

    19.屏蔽或开启常见端口

    屏蔽或开启常用的TCP、UDP端口:

    1. #可以使用DROP替换ACCEPT,实现端口屏蔽。  
    2. #打开22端口(SSH)  
    3. # iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT  
    4. # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT  
    5. #打开TCP/UDP631端口(打印服务)  
    6. # iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT  
    7. # iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT  
    8. # 打开123端口,允许局域网用户进行NTP时间同步  
    9. # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT  
    10. #打开25端口(SMTP)  
    11. # iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT  
    12. # 打开DNS端口  
    13. # iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT  
    14. # iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT  
    15. #打开http/https端口  
    16. # iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT  
    17. # iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT  
    18. #打开TCP110端口(POP3)  
    19. # iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT  
    20. #打开TCP143端口  
    21. # iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT  
    22. #为局域网用户开启Samba访问  
    23. # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT  
    24. # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT  
    25. # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT  
    26. # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT  
    27. #为局域网用户开启代理服务器访问  
    28. # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT  
    29. #为局域网用户开启MySQL访问  
    30. # iptables -I INPUT -p tcp --dport 3306 -j ACCEPT 

    20.限制客户端IP的并发连接数

    我们可以使用connlimit模块限制客户端IP的并发连接数。下面的命令允许每个客户端只能并发3个ssh连接:

    1. # iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT 

    设置HTTP并发连接为20个:

    1. # iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP 

    参数说明:

    • --connlimit-above 3:连接数超过3个自动匹配
    • --connlimit-mask 24:子网掩码匹配

    更好的使用iptables

    首先,我们要学会查看man手册:

    1. $ man iptables 

     我们还可以这样查看帮助:

    1. # iptables -h 

    我们还可以查看特定命令的帮助:

    1. # iptables -j DROP -h 

    测试防火墙

    测试端口是否开放:

    1. # netstat -tulpn 

    测试TCP 80端口是否开放:

    1. # netstat -tulpn | grep :80 

    如果80端口未开放,请确保启动Apache服务器:

    1. # service httpd start 

    并确保打开iptables防火墙80端口:

    1. # iptables -L INPUT -v -n | grep 80 

    如果80端口没有开放,可以运行下面的命令:

    1. # iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT  
    2. # service iptables save 

    下面使用telnet命令测试是否可以连接到80端口:

    1. $ telnet www.cyberciti.biz 80 

    下面是示例输出:

    1. Trying 75.126.153.206...  
    2. Connected to www.cyberciti.biz.  
    3. Escape character is '^]'.  
    4. ^]  
    5. telnet> quit  
    6. Connection closed. 

    最后,我们也推荐使用嗅探工具(如tcpdump、ngrep)对防火墙设置进行测试。

    以上只是一些基本的防火墙配置策略,如果你想构造更复杂的防火墙策略,需要对TCP/IP和Linux内核配置文件sysctl.conf进行更深入的学习。

  • 相关阅读:
    给定一个十进制数M,以及需要转换的进制数N。 将十进制数M转化为N进制数
    java计算两条线段交点
    输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m 转载
    全排列 (递归求解+字典序) java 转载
    四大线程池详解(转载)
    生产者消费者简单实现(转载)
    进程 线程通信方式(转载)
    匿名对象和类名为数据类型(java)
    星星(java)
    杨辉三角(java)
  • 原文地址:https://www.cnblogs.com/fx2008/p/5069688.html
Copyright © 2011-2022 走看看