经常听人说装完Fedora之后的第一件事就是把SELinux和iptables关掉,甚至搜索一下这两个东西,多数博客都是教用户如何关闭它们而不是如何正确的使用它们。
正好这段时间对这两者有了一些肤浅的认识,在这里说一下。
首先我们要摆正态度,要知道现在大行其道的OpenStack的nova-network所用的IP地址内外网映射(NAT)就是用iptables实现的,而且表现非常优异。而SELinux则是NSA(美国国家安全局)斥巨资开发的。它们如果真的像多数人所说的,应该上来就关掉,那么就不会有那多年的发展了。
言归正传,下面来对它们二者做一个简单的介绍。
iptables
先来弄清楚iptables和netfilter的关系。iptables防火墙由Netfilter项目(http://www.netfilter.org)开发,自2001年1月在Linux2.4内核发布以来就是Linux的一部分了。
Netfilter是由Linux提供的所有包过滤和包修改设施的官方项目名称,但这个术语同时也指Linux内核中的一个框架,它可以用于在不同的阶段将函数挂接(hook)进网络栈。另一方面,iptables使用Netfilter框架旨在将对数据包进行操作(如过滤)的函数挂接进网络栈。
所以,你可以认为Netfilter提供了一个框架,而iptables在它之上建立了防火墙功能。
同时iptables还指同名的用户层工具,它解析命令行并将防火墙策略传递给内核。术语表(table)、链(chain)、匹配(match)、目标(target)只有在iptables的上下文中才有意义。
使用iptables进行包过滤
表
iptables一共有四张表,称为filter, nat, mangle, raw。filter用于过滤,nat用于网络地址转换,mangle用于给数据包做标记以修改分组数据的特定规则,raw表则独立于Netfilter连接跟踪子系统。
因此,如果你的目标是保护主机安全,那么着重考虑的是filter表,而如果像OpenStack那样,目的是做网络地址转换,就用NAT表,而mangle则用于QoS(服务质量控制),如对打上某个标记的分组数据分配较多带宽等等。
链
每个表都有自己的一组内置链,用于还可以对链进行自定义。
对filter表来说,最重要的是内置链INPUT/OUTPUT/FORWARD。顾名思义,INPUT应用于外部网络进入到本地主机的数据包,OUPTU则应用于从本地主机发送到外部网络的数据包。FORWARD则可以理解为将本地主机作为路由器,数据包从本地主机经过,但目标位于本地主机的下游。
<!-- 先去吃个饭,回来再写,或说现在正发高烧38.5度,还坐在宿舍写博客 -->
对于NAT来说,最重要的就是搞清楚PREROUTING和POSTROUTING链了。这个可以这么简单的理解,数据包从外部流入,在进入主机前给它PREROUTING,也就是“预路由”,即改变分组数据的目标地址或端口号。通常所说的端口转发就是在这里了。
举个简单的例子,在OpenStack的网络管理中,通常一个虚拟机会有一个外网IP和一个内网IP,那么节点的iptables规则里面就会有类似这样的语句
1 2 | iptables -t nat -A PREROUTING -d 115.12.XX.XX -j DNAT --to-destination 192.168.1.111 iptables -t nat -A POSTROUTING -s 192.168.1.111 -j SNAT --to-source 115.12.XX.XX |
这条语句的意思就是目标地址为虚拟机外部地址115.12.XX.XX的数据包会被iptables重定向(修改数据包的目的地址)到192.168.1.111,同时,从192.168.1.111发出的数据包,iptables会将其源地址修改为115.12.XX.XX。从内部这里没有涉及端口,如果有端口,再加上--dport和--sport即可。
详细的流程可以参考http://www.opsers.org/security/iptables-related-concepts-and-processes-the-packet-figure.html
下面就说一下基本的命令吧,要说复杂iptables还真复杂,不过正常使用的话下面这些也差不多够了。
1 -t 指定表名 2 -A 新增规则(ADD) 3 -I 插入规则,需要指定插入的位置 4 -D 删除规则,只需要指定位置,不需要再重新写一遍当前规则 5 -L 列出当前所有规则 6 -V 显示当前iptables版本号
注意一点,如果不指定表名,则默认是filter表。
另外指出发行版的一点不同,在RHEL系(CentOS/Fedora)上,可以使用
service iptables restart
或
systemctl restart iptables.service
来重启iptables服务以加载默认的规则,而在Debian系(Ubuntu一众)则没有iptables这个服务,如果需要清空所有iptables规则,则需要
1 iptables -t filter -F 2 iptables -t filter -X 3 iptables -t nat -F 4 iptables -t nat -X 5 iptables -P INPUT ACCPET 6 iptables -P OUTPUT ACCEPT 7 iptables -P FORWARD ACCEPT
这样等同于所有规则都没有生效,也即关闭了iptables。另外Debian系提供了ufw作为简单的防火墙控制工具。
SELinux
这个恐怕是让更多人头疼的东西。我更是听说红帽有些工程师在解决问题时也是 先关掉这东西。
首先明白一点,SELinux是干什么用的,同样是为了计算机的安全,那么它和iptables的功能有重叠吗?
答案是没有。
它们的定位是不同的。iptables是防火墙,防范来自网络的入侵和实现网络地址转发、QoS等功能,而SELinux则可以理解为是作为Linux文件权限控制(即我们知道的rwx)的补充存在的。
我们知道,Linux的文件权限主要是rwx三类,即读、写、执行。撇开那些特殊的如s/u/t位不提,这三个权限控制真的能保证系统的绝对安全吗?
以Apache Http服务器为例(好像在说SELinux的时候那些前辈总是喜欢拿这个来举例子)。当一台服务器上跑着HTTP服务,我们访问这台服务器时是以apache用户来访问系统上的文件的,在HTTP的DocumentRoot目录下的文件对我们来说是可读的,而同样,单纯看rwx的权限,/etc/passwd这个敏感文件对apache用户也是可读的,因为它的权限位是-rw-r--r--,也就是对o(thers)是可读的,因此可以这样认为,网络攻击者如果可以以apache用户登录系统,它就可以查看/etc/passwd文件,知道系统中有哪些用户等等信息。但如果开启了SELinux就不会出现这种情况。为什么呢?
你可以用ls -Zl来查看SELinux有关的信息(前提是开启了SELinux服务)
可以看到,在默认的HTTPDocumentRoot目录下的文件有
1 | system_u:object_r:httpd_sys_content_t:s0 |
这样的安全上下文,其中的类型字段httpd_sys_content_t即表明这是http的内容文件,可以被http程序访问。显然其他目录下的文件没有同样的类型字段。这也就是为什么当你手动修改了DocumentRoot目录之后虽然在iptables里已经开放了网络访问,但仍然无法打开网页的原因了——因为apache用户对你新指定的目录下的文件没有读取的权限,因此SELinux是建立在Linux标准的权限控制基础上的增强型Linux。
还需要注意一点,当你复制一个文件到另一个目录时,新复制的文件会继承目标目录的SELinux上下文,而如果是移动文件则会保留源文件的SELinux上下文(context)。
例如需要让新目录可以被apache访问,需要对新目录执行
chcon -R -t httpd_sys_content_t /srv/www
其中-R是recursive即递归执行,-t是指定类型,这个类型可以用
1 | semanage fcontext -l | grep '/var/www' |
来获得。
要给一个目录下的所有文件设置安全上下文,可以用
semanage -a -t public_content_t '/srv/ww(/.*)'
注意,这里用的是正则表达式而不是用"*"作为通配符。
写这篇文章的目的不是具体介绍这两个工具具体怎么用,因为那是参考手册的工作,而我想说的是其实它们远没有你想像的那么难,不要听别人说它们有多复杂,只把它们当成普通的命令来学习来用也就好了。我身边的一位很厉害的网络工程师对iptables玩的炉火纯青,却对SELinux一无所知。我是不太理解,如果按照一般的学习的心态来看待两种技术(或者说工具)其复杂度也差不多,只要理解了它们的用途或者说目的,就可以很得心应手的使用它们了。
参考:
[1]. Linux防火墙(Linux Firewalls Attack Detection and Response with iptables, psad, and fwsnot)
[2]. 鸟哥的Linux私房菜(服务篇)http://vbird.dic.ksu.edu.tw/linux_server/0210network-secure_4.php#selinux
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析