20个Linux防火墙应用技巧
转载
1.显示防火墙的状态
以root权限运行下面的命令:
- # iptables -L -n -v
参数说明:
- -L:列出规则。
- -v:显示详细信息。此选项会显示接口名称、规则选项和TOS掩码,以及封包和字节计数。
- -n:以数字形式显示IP地址和端口,不使用DNS解析。
如果希望输出的结果中显示行号,可以运行:
- # iptables -L -n -v --line-nmubers
这样,就可以按照行号在防火墙中添加、删除规则。
要显示输入或输出链规则,可以运行:
- # iptables -L INPUT -n -v
- # iptables -L OUTPUT -n -v --line-numbers
2.停止、开启和重启防火墙
如果你使用的是RHEL/Fedora/CentOS系统,可以运行:
- # service iptables stop
- # service iptables start
- # service iptables restart
我们也可以使用iptables命令停止防火墙并删除所有规则:
- # iptables -F
- # iptables -X
- # iptables -t nat -F
- # iptables -t nat -X
- # iptables -t mangle -F
- # iptables -t mangle -X
- # iptables -P INPUT ACCEPT
- # iptables -P OUTPUT ACCEPT
- # iptables -P FORWARD ACCEPT
参数说明:
- -F:删除所有的规则
- -X:删除链
- -t table_name:匹配表(称为nat或mangle)
- -P:设置默认策略(如DROP、REJECT或ACCEPT)
3.删除防火墙规则
以带行号的形式显示已有的防火墙规则,请运行:
- # iptables -L INPUT -n --line-numbers
- # iptables -L OUTPUT -n --line-numbers
- # iptables -L OUTPUT -n --line-numbers | less
- # iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1
下面我们使用行号删除规则:
- # iptables -D INPUT 4
将IP地址202.54.1.1从规则中删除:
- # iptables -D INPUT -s 202.54.1.1 -j DROP
参数说明:
- -D:从选择的链中删除一条或多条规则
4.插入防火墙规则
首先运行下面的命令:
- # iptables -L INPUT -n --line-numbers
得到运行结果:
- Chain INPUT (policy DROP)
- num target prot opt source destination
- 1 DROP all -- 202.54.1.1 0.0.0.0/0
- 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
在行1和行2之间插入规则:
- # iptables -I INPUT 2 -s 202.54.1.2 -j DROP
查看更新后的规则,会发现插入成功,下面是示例:
- Chain INPUT (policy DROP)
- Num target prot opt source destination
- 1 DROP all -- 202.54.1.1 0.0.0.0/0
- 2 DROP all -- 202.54.1.2 0.0.0.0/0
- 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
5.保存防火墙规则
在RHEL/Fedora/CentOS Linux下,可以使用下面的命令保存防火墙规则:
- # service iptables save
在其它Linux发行版(如Ubuntu)上,可以使用iptables-save命令保存防火墙规则:
- # iptables-save > /root/my.active.firewall.rules
- # cat /root/my.active.firewall.rules
6.重新加载防火墙规则
我们可以使用iptables-restore命令重新加载使用iptables-save命令保存的防火墙规则:
- # iptables-restore < /root/my.active.firewall.rules
我们还可以利用这种特性来快速部署防火墙规则。
7.设置默认防火墙策略
我们首先来配置一个防火墙策略,它默认丢弃所有的网络数据包:
- # iptables -P INPUT DROP
- # iptables -P OUTPUT DROP
- # iptables -P FORWARD DROP
- # iptables -L -v -n
- #连接失败,因为防火墙丢弃所有的网络数据包
- # ping cyberciti.biz
- # wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2
在此基础上,我们只关闭入站连接:
- # iptables -P INPUT DROP
- # iptables -P FORWARD DROP
- # iptables -P OUTPUT ACCEPT
- # iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
- # iptables -L -v -n
- #ping和wget可以正常工作
- # ping cyberciti.biz
- # wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2
8.在公网网络接口上停用私有网络地址
我们可以从公网网络接口上删除私有IPv4网段,以防止IP欺骗。运行下面的命令,没有源路由地址的数据包会被丢弃:
- # iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
- # 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,可以运行:
- # iptables -A INPUT -s 1.2.3.4 -j DROP
- # iptables -A INPUT -s 192.168.0.0/24 -j DROP
10.屏蔽入栈端口请求
如果我们想80端口上屏蔽所有的服务请求,可以运行:
- # iptables -A INPUT -p tcp --dport 80 -j DROP
- # iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP
只想屏蔽IP地址1.2.3.4对80端口的请求,可以运行:
- # iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP
- # iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP
11.屏蔽出栈IP地址
现在我们来演示如何屏蔽对主机名和IP地址的出栈访问。
首先,我们来获取一个域名的IP地址:
- # host -t a cyberciti.biz
输出示例:
- cyberciti.biz has address 75.126.153.206
要屏蔽访问域名cyberciti.biz的网络数据包,可以运行:
- # iptables -A OUTPUT -d 75.126.153.206 -j DROP
下面是使用子网掩码的示例:
- # iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
- # iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP
下面我们以屏蔽facebook.com为例,进行说明。首先,我们需要facebook的所有IP地址:
- # host -t a www.facebook.com
示例输出:
- www.facebook.com has address 69.171.228.40
找出IP地址69.171.228.40的CIDR:
- # whois 69.171.228.40 | grep CIDR
示例输出:
- CIDR:69.171.224.0/19
现在我们来阻止对facebook.com的访问:
- # iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP
我们也可以直接屏蔽域名:
- # iptables -A OUTPUT -p tcp -d www.facebook.com -j DROP
- # iptables -A OUTPUT -p tcp -d facebook.com -j DROP
12.记录并丢弃数据包
在公网网络接口上记录并丢弃IP地址欺骗数据包:
- # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
- # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
默认情况下日志记录在/var/log/messages文件中:
- # tail -f /var/log/messages
- # grep --color 'IP SPOOF' /var/log/messages
我们还可以用-m参数对日志记录进行限制,以防止日志文件过度膨胀。
- # 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: "
- # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
13.根据MAC地址允许或阻止数据包的传入
我们可以根据MAC地址允许或阻止数据包的传入:
- # iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP
14.屏蔽ICMP ping请求
我们可以通过允许下面的命令屏蔽ping请求:
- # iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
- # iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
也可以按照特定的网段和主机限制ping请求:
- # iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT
以下命令只接受受限制的ping请求:
- #假定默认INPUT策略为丢弃数据包
- # iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
- # iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
- # iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
- #所有的服务器都对ping请求作出应答
- # iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
15.开启端口序列
下面的命令可以允许7000到7010范围内的TCP端口访问:
- # iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT
16.允许一系列IP地址访问
下面的命令可以允许IP地址范围
- #运行IP地址范围192.168.1.100 到192.168.1.200 访问80端口
- # iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT
- #NAT示例
- # 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
- IPTABLES_MODULES_UNLOAD = no
18.使用Crit日志级别
- # iptables -A INPUT -s 1.2.3.4 -p tcp --destination-port 80 -j LOG --log-level crit
19.屏蔽或开启常见端口
屏蔽或开启常用的TCP、UDP端口:
- #可以使用DROP替换ACCEPT,实现端口屏蔽。
- #打开22端口(SSH)
- # iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
- # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
- #打开TCP/UDP631端口(打印服务)
- # iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT
- # iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT
- # 打开123端口,允许局域网用户进行NTP时间同步
- # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT
- #打开25端口(SMTP)
- # iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT
- # 打开DNS端口
- # iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
- # iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
- #打开http/https端口
- # iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
- # iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT
- #打开TCP110端口(POP3)
- # iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT
- #打开TCP143端口
- # iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT
- #为局域网用户开启Samba访问
- # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
- # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
- # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
- # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT
- #为局域网用户开启代理服务器访问
- # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT
- #为局域网用户开启MySQL访问
- # iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
20.限制客户端IP的并发连接数
我们可以使用connlimit模块限制客户端IP的并发连接数。下面的命令允许每个客户端只能并发3个ssh连接:
- # iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
设置HTTP并发连接为20个:
- # 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手册:
- $ man iptables
我们还可以这样查看帮助:
- # iptables -h
我们还可以查看特定命令的帮助:
- # iptables -j DROP -h
测试防火墙
测试端口是否开放:
- # netstat -tulpn
测试TCP 80端口是否开放:
- # netstat -tulpn | grep :80
如果80端口未开放,请确保启动Apache服务器:
- # service httpd start
并确保打开iptables防火墙80端口:
- # iptables -L INPUT -v -n | grep 80
如果80端口没有开放,可以运行下面的命令:
- # iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
- # service iptables save
下面使用telnet命令测试是否可以连接到80端口:
- $ telnet www.cyberciti.biz 80
下面是示例输出:
- Trying 75.126.153.206...
- Connected to www.cyberciti.biz.
- Escape character is '^]'.
- ^]
- telnet> quit
- Connection closed.
最后,我们也推荐使用嗅探工具(如tcpdump、ngrep)对防火墙设置进行测试。
以上只是一些基本的防火墙配置策略,如果你想构造更复杂的防火墙策略,需要对TCP/IP和Linux内核配置文件sysctl.conf进行更深入的学习。(张志平/编译)
原文链接:Linux: 20 Iptables Examples For New SysAdmins
20个Linux防火墙应用技巧的更多相关文章
- 20个Linux防火墙[iptables]应用技巧[转]
1.显示防火墙的状态 以root权限运行下面的命令: # iptables -L -n -v 参数说明: -L:列出规则. -v:显示详细信息.此选项会显示接口名称.规则选项和TOS掩码,以及封包和字 ...
- 20个Linux服务器性能调优技巧
Linux是一种开源操作系统,它支持各种硬件平台,Linux服务器全球知名,它和Windows之间最主要的差异在于,Linux服务器默认情况下一般不提供GUI(图形用户界面),而是命令行界面,它的主要 ...
- 系统管理员需知:25个Linux服务器安全技巧(转)
来源:51CTO 作者:51CTO 大家都认为 Linux 默认是安全的,我大体是认可的 (这是个有争议的话题).Linux默认确实有内置的安全模型.你需要打开它并且对其进行定制,这样才能 ...
- 【shell 大系】Linux Shell常用技巧
在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux ...
- Linux防火墙:iptables禁IP与解封IP常用命令
在Linux服务器被攻击的时候,有的时候会有几个主力IP.如果能拒绝掉这几个IP的攻击的话,会大大减轻服务器的压力,说不定服务器就能恢复正常了. 在Linux下封停IP,有封杀网段和封杀单个IP两种形 ...
- linux 防火墙iptables简明教程
前几天微魔部落再次遭受到个别别有用心的攻击者的攻击,顺便给自己充个电,复习了一下linux下常见的防火墙iptables的一些内容,但是无奈网上的很多教程都较为繁琐,本着简明化学习的目的,微魔为大家剔 ...
- Linux命令行技巧
Linux命令行技巧 命令 描述 • apropos whatis 显示和word相关的命令. 参见线程安全 • man -t man | ps2pdf - > man.pdf 生成一个PDF格 ...
- Linux防火墙iptables简明教程
前几天微魔部落再次遭受到个别别有用心的攻击者的攻击,顺便给自己充个电,复习了一下linux下常见的防火墙iptables的一些内容,但是无奈网上的很多教程都较为繁琐,本着简明化学习的目的,微魔为大家剔 ...
- 给新手的 10 个有用 Linux 命令行技巧
我记得我第一次使用 Linux 的时候,我还习惯于 Windows 的图形界面,我真的很讨厌 Linux 终端.那时候我觉得命令难以记忆,不能正确使用它们.随着时间推移,我意识到了 Linux 终端的 ...
随机推荐
- UVALive 3942 Remember the Word
题意:给出一个由S个不同单词组成的字典和一个长字符串.把这个字符串分解成若干个单词的连接(单词可以重复 使用),有多少种方法? Sample Input abcd 4 a b cd ab Sample ...
- SpringCloud-day09-Feign与Hystrix整合
8.5.Feign 与 Hystrix整合 服务熔断服务降级彻底解耦 前面的代码,用@HystrixCommand fallbackMethod是很不好的,因为和业务代码耦合度太高,不利于维护,所以需 ...
- 既然还看不到未来之光,那就从骄阳开始的地方--IT携行
对于还没真正踏入IT的小白菜来说,哪有资格把刚学到的鸡毛蒜皮儿,三脚猫都不算的东西逮出来献丑,献丑都不算,还不如我们来谈谈人生,练练脸皮...... 我出发的起点肯定不同,多方限制,可能缺乏时光;那正 ...
- mysql-----04 多表查询
本节主要介绍mysql的多表查询(多表连接查询.复合条件查询.子查询) 一.多表连接查询 #重点:外链接语法 select 字段列表 from 表1 inner|left|right join 表2 ...
- layui数据表格监听按钮问题
layui官网文档源码 原始容器 <table id="demo" lay-filter="test"></table> 工具栏模板: ...
- 【转】Webdriver的PageObject改造By 张飞
Webdriver的PageObject改造 PageObject中提供了一个@FindBy注解,也非常好用,但由于其是一次性全部初始化所有的WebElement,对于当前还不存在于页面上的Eleme ...
- mysql 多列索引学习-经典实例
索引优化 ,b-tree假设某个表有一个联合索引(c1,c2,c3,c4) 以下 只能使用该联合索引的c1,c2,c3部分A. where c1 = x and c2 = x and c4>x ...
- 矩阵游戏(game)
矩阵游戏(game) --九校联考24OI__D1T1 问题描述 LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵.第一行的数字是1,2,-M,第二行的数字是M+1,M+2-2*M,以此 ...
- 201621123002《java程序设计》第十三周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网 ...
- 查看Chrome密码只需一段代码
在Chrome浏览器的地址栏里输入“ chrome://chrome/settings/passwords ”,然后Chrome自动帮你保存的密码就会瞬间被曝露出来. 强调一下,只要不是在本机上输入以 ...