Ubuntu ufw防火墙规则顺序问题

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dgd2010.blog.51cto.com/1539422/1697519

本文以Ubuntu 14.04为例,讲讲ufw防火墙规则顺序问题。

--------------------------------此处应该优雅的使用分割线--------------------------------

先说原理再吐槽!

Linux系统及其许多其他软件中都有访问控制(Access Control)功能,比如系统中的防火墙,Cisco ios中的ACL(Access Control Lists),Web服务器中的Access Module。在有些访问控制的实现中,有一些访问控制的功能跟顺序有关,例如禁止所有其他主机访问本机端口但允许某一台主机访问本机端口,或者允许所有主机访问本机端口但禁止某一台主机访问本端口。这样的例子在netfilter iptables和Apache httpd 2.2版本中能很容易得到体现,这里主要讲讲Ubuntu的ufw。

首先要给大多数人纠正一下,ufw并不是一个防火墙,尽管它叫做Ubuntu firewall,但它本身并没有防火墙的功能,它只是一个管理netfilter防火墙的工具,其核心还是netfilter的iptables。这一点在ufw的man中很容易发现,ufw是管理netfilter的一个程序而已,此工具的目的在于帮助用户简化iptables的复杂使用方法。

在说Ubuntu ufw之前还是要说一下CentOS中的iptables,在CentOS中,iptables规则是从一个文件(/etc/sysconfig/iptables)中,从上到下读取配置的,后一条的规则能覆盖(override)前一条规则,例如默认规则下有2条拒绝规则:

-A INPUT -j REJECT --reject-with icmp-host-prohibited    
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

这两条规则的含义是拒绝其他不符合规则的数据包,并且给被拒绝的主机发送一条icmp host prohibited的消息。并且这两条规则可以认为是iptables对默认规则的补充,因为在这些默认规则之前,有:INPUT ACCEPT [0:0]这样的规则,这些规则表示默认全部允许。

那说了这么多,到底要表达什么呢?不知道有没有这样的印象,就是在CentOS中直接使用iptables命令插入一个规则,并没有起作用,原因就是它默认被插入到了REJECT规则的下面?例如执行“iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT”却发现不好用,原因是它插入到“-A INPUT -j REJECT --reject-with icmp-host-prohibited”的下面,要想好用,那必须插入到它的前面,例如执行“iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT”,这样它就会被添加到INPUT链的最前端,也就起到预期的作用了。

现在再说Ubuntu ufw。Ubuntu ufw这个程序有点奇怪,它总是像Ubuntu系统一样,喜欢everything included,尽管ufw也不是简单的included,ufw自己做了一些类似脚本的东西以及有一堆相关的文件,它称之为ufw-framework,可以通过man ufw-framework看到它的介绍信息和相关文件,可以看到它不当作普通服务运行而是当作脚本运行(例如man中提到的a standard SysV style initscript used by the ufw command),如果想深入研究一下的话可以自己慢慢看man page以及查看相关的文件和资料。

在说ufw到底如何用之前,还是要继续强调一下。首先还是要说明,Ubuntu是一个对工程师很不友好的系统,它只亲爱它的开发人员,毕竟是开发人员开发出来的,因此许多像我这样的工程师都不喜欢用Ubuntu,而很多开发者却因为它看起来的简单易用而选择Ubuntu。在此列举一下我之前说过的一段话,“如果你要为你的Linux选择发行版本,无论如何都不要选择Ubuntu,如果你非要坚持选Ubuntu也一定要选12.xx(precise),不要选14.xx(trusty),而且不要升级到trusty。Ubuntu14.xx之前还不错,14.xx后有不少坑,这个与CentOS7有一点像,大都是因为systemd的原因,关于systemd的罪恶可以参考这篇文章,http://www.zdnet.com/article/linus-torvalds-and-others-on-linuxs-systemd/。”

--------------------------------此处应该优雅的使用分割线--------------------------------

终于到了在这里简洁的介绍一下ufw到底如何去用的时候了。本文只讲顺序问题不讲语法问题,语法问题可以自己查询man page或者其他网站的精彩文章。这里只说一些别的文章上不说的地方,从实际生产环境和多次测试得来经验。

那iptables通过-A和-I区分插入还是添加,ufw也是有的,而且ufw的本质还是跟iptables风格一样的配置文件(这个文件是/lib/ufw/user.rules,这个文件就像CentOS下的/etc/sysconfig/iptables文件一样,记录着用户自定义的规则),具体什么内容什么语法自己可以去查看。

此处以ssh默认端口22为例,列举一下允许所有主机访问本机22端口但禁止某一台主机(10.20.0.1)访问22端口的例子。

如果是初次配置ufw防火墙,那么可以这么做:

sudo ufw reset#重置防火墙    
sudo ufw enable#启用防火墙     
sudo ufw default reject#配置默认规则,拒绝     
sudo ufw deny from 10.20.0.1#拒绝某IP访问,或执行sudo ufw deny from 10.20.0.1 to 10.20.0.130 port 22     
sudo ufw allow 22/tcp#允许所有主机访问22端口     
sudo ufw status#查看ufw状态

如果ufw已经被配置过,规则已经有了,那就这么做:

sudo ufw status numbered#按照数字书序查看ufw状态,注意带v6的不用管    
sudo ufw insert 1 deny from 10.20.0.1#或者sudo ufw insert 1 deny from 10.20.0.1 to 10.20.0.130 port 22

sudo ufw allow 22/tcp    
sudo ufw status

经过上述配置以后,如/lib/ufw/user.rules文件会像下面显示:

### tuple ### deny any 22 10.20.0.130 any 10.20.0.1 in    
-A ufw-user-input -p tcp -d 10.20.0.130 --dport 22 -s 10.20.0.1 -j DROP     
-A ufw-user-input -p udp -d 10.20.0.130 --dport 22 -s 10.20.0.1 -j DROP

### tuple ### allow tcp 22 0.0.0.0/0 any 0.0.0.0/0 in    
-A ufw-user-input -p tcp --dport 22 -j ACCEPT

上面的###开始的注释能使ufw正确识别通过ufw命令添加的规则,自己可以手动用iptables命令去改写。因此通过命令也是可以添加这样的规则的。

例如:

iptables -I ufw-user-input -p tcp -d 10.20.0.130 --dport 22 -s 10.20.0.1 -j DROP      
iptables -I ufw-user-input -p udp -d 10.20.0.130 --dport 22 -s 10.20.0.1 -j DROP

iptables -I ufw-user-input -p tcp --dport 22 -j ACCEPT

为何能手动改写?原因可以通过先启用ufw后再用iptables-save命令查看:

-A ufw-user-input -s 10.20.0.1/32 -d 10.20.0.130/32 -p tcp -m tcp --dport 22 -j DROP    
-A ufw-user-input -s 10.20.0.1/32 -d 10.20.0.130/32 -p udp -m udp --dport 22 -j DROP     
-A ufw-user-input -p tcp -m tcp --dport 22 -j ACCEPT     
-A ufw-user-limit -m limit --limit 3/min -j LOG --log-prefix "[UFW LIMIT BLOCK] "     
-A ufw-user-limit -j REJECT --reject-with icmp-port-unreachable     
-A ufw-user-limit-accept -j ACCEPT

通过这一段信息可以发现,其实这跟/etc/sysconfig/iptables文件真的一样。

简单一句话,就是先deny,后allow,deny规则插入到allow规则前面,这样才能起到禁止的作用。

文中讲的不是特别详细,但绝对能有启发作用,希望当你通过ufw设定deny规则不好用时,可以想起这篇文章,哈哈。

--------------------------------此处应该优雅的使用分割线--------------------------------

一些可用的参考或资料:

Cisco Configuring IP Access Lists http://www.cisco.com/c/en/us/support/docs/security/ios-firewall/23602-confaccesslists.html#acl

Apache httpd 2.2 Access Control http://httpd.apache.org/docs/2.2/howto/access.html

Apache httpd 2.4 Access Control http://httpd.apache.org/docs/2.4/howto/access.html

Apache httpd Access Control – Order http://httpd.apache.org/docs/2.4/mod/mod_access_compat.html#order

tag:Ubuntu ufw用法,ufw规则无效,Ubuntu配置防火墙,Ubuntu ufw原理,Ubuntu ufw规则顺序

--end--

本文出自 “通信,我的最爱” 博客,请务必保留此出处http://dgd2010.blog.51cto.com/1539422/1697519

时间: 2024-12-02 08:23:57

Ubuntu ufw防火墙规则顺序问题的相关文章

ufw 防火墙规则的顺序问题

今天晚上感觉机器突然变慢了,查了一下 access.log 发现有个从大陆四川来的 ip (125.66.125.201) 狂戳我的机器存取一个八百年前就删掉的档案. 所以我下了 ufw reject from 125.66.125.201 ,然后重新载入 ufw ,不过 HTTP 的 request 还是一直灌进来- 我只好再下 ufw status 把规则都打开来检查我刚刚下的 rule 有没有新增进去,结果发现 Status: active To                      

Ubuntu中保存iptables防火墙规则的例子

 buntu下保存iptables规则并开机自动加载的方法: Saving iptables 保存设置 机器重启后,iptables中的配置信息会被清空.您可以将这些配置保存下来,让iptables在启动时自动加载,省得每次都得重新输入.iptables-save和iptables-restore 是用来保存和恢复设置的. Configuration onstartup 开机自动加载配置 先将防火墙规则保存到/etc/iptables.up.rules文件中 # iptables-save >

瑞星防火墙V16:可自定义防火墙规则

瑞星个人防火墙V16是一款功能丰富.界面简约.操作便利的防火墙软件,能够最大限度地保护电脑信息安全,免受各类网络攻击.值得一提的是,用户可以在瑞星防火墙里自定义防火墙规则,能够对电脑起到最大的保护作用. 联网程序规则 用户也可以自己编写防火墙规则,进一步提升防护能力.用户可以在"联网程序规则"与"IP规则"中调整防火墙的防护力度与方式. "联网程序规则"主要是约束了本地应用程序的联网权限,如果一些软件总是自动更新,而用户又不想收到骚扰的话,就可以

瑞星防火墙V16:可自定义防火墙规则

  联网程序规则 用户也可以自己编写防火墙规则,进一步提升防护能力.用户可以在"联网程序规则"与"IP规则"中调整防火墙的防护力度与方式. "联网程序规则"主要是约束了本地应用程序的联网权限,如果一些软件总是自动更新,而用户又不想收到骚扰的话,就可以在联网程序规则将这个软件取消掉. "IP规则"主要针对的IP包的传输.我们可以通过远程端口与本地端口的作用来制定IP规则,从而规范电脑网络的连接端口,让自己的网络更安全. IP规则

通过Windows Azure SQL数据库防火墙规则控制数据库访问

今天的文章来自于我们用户体验团队的技术作家Kumar Vivek.这篇文章对Windows http://www.aliyun.com/zixun/aggregation/13357.html">Azure SQL数据库中新推出的数据库级防火墙规则进行了简要概括. Windows Azure SQL数据库防火墙能够阻止他人对你SQL数据库的访问,以助你保护数据.你能够指定防火墙规则,如限定允许访问的IP地址范围,来控制对数据库的访问.然而,这些规则定义在服务器层级,允许被授权的终端访问你的

iptables防火墙规则导致端口不通的案例分析

iptables防火墙规则导致端口不通的案例分析 问题现象: 一台服务器的8080端口访问不通,但其他端口正常,例如ssh的22端口,ping也正常. 从其他机器上进行telnet连接8080端口测试,显示是下边这个结果. [root@iZ25a9b7bpcZ ~]# telnet xx.xx.xx.xx 8080 Trying xx.xx.xx.xx... telnet: connect to address xx.xx.xx.xx: No route to host 从telnet测试的结果

修改iptables防火墙规则解决vsftp登录后不显示文件目录的问题_FTP服务器

iptables里面仅仅开放了80.21等常用端口,这样就导致了vsFTPd在被动模式时无法使用随机端口,从而造成了客户端连接FTP时无法列出目录这样的问题.解决方式很简单,给vsFTPd增加随机端口的范围,然后把这个端口范围添加到iptables.具体做法如下: 1.修改/etc/vsftpd/vsftpd.conf的配置文件,在文件末端添加: 复制代码 代码如下: pasv_max_port=6666pasv_min_port=5555/etc/init.d/vsftpd restart 2

PowerShell小技巧之添加远程防火墙规则_PowerShell

接着昨天的场景,虽然将Windows Server 2012 Core的默认控制台设置成了PowerShell,还启用了远程桌面,但是对于Core版本的服务器来讲,远程桌面形同鸡肋,所以我想启用PowerShell远程访问,在服务器上以管理员权限运行: Enable-PSRemoting -Force 在尝试建立远程连接时,提示访问被拒绝,此时可能是防火墙问题:我需要使用PowerShell添加PowerShell远程防火墙规则: New-NetFirewallRule -Name powers

ubuntu 开启防火墙具体方法(英文)

Here's how to create a firewall on your Linode: Check your Linode's default firewall rules by entering the following command: sudo iptables -L Examine the output. If you haven't implemented any firewall rules yet, you should see an empty ruleset, as