- 先来弄清楚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一共有四张表,称为filter, nat, mangle, raw。filter用于过滤,nat用于网络地址转换,mangle用于给数据包做标记以修改分组数据的特定规则,raw表则独立于Netfilter连接跟踪子系统。
因此,如果你的目标是保护主机安全,那么着重考虑的是filter表,而如果像OpenStack那样,目的是做网络地址转换,就用NAT表,而mangle则用于QoS(服务质量控制),如对打上某个标记的分组数据分配较多带宽等等。
每个表都有自己的一组内置链,用于还可以对链进行自定义。
对filter表来说,最重要的是内置链INPUT/OUTPUT/FORWARD。顾名思义,INPUT应用于外部网络进入到本地主机的数据包,OUPTU则应用于从本地主机发送到外部网络的数据包。FORWARD则可以理解为将本地主机作为路由器,数据包从本地主机经过,但目标位于本地主机的下游。
对于NAT来说,最重要的就是搞清楚PREROUTING和POSTROUTING链了。这个可以这么简单的理解,数据包从外部流入,在进入主机前给它PREROUTING,也就是“预路由”,即改变分组数据的目标地址或端口号。通常所说的端口转发就是在这里了。
举个简单的例子,在OpenStack的网络管理中,通常一个虚拟机会有一个外网IP和一个内网IP,那么节点的iptables规则里面就会有类似这样的语句
- 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即可。
注意一点,如果不指定表名,则默认是filter表。
service iptables restart
或
systemctl restart iptables.service
来重启iptables服务以加载默认的规则,而在Debian系(Ubuntu一众)则没有iptables这个服务,如果需要清空所有iptables规则,则需要
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -P INPUT ACCPET
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
首先明白一点,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目录下的文件有
- 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访问,需要对新目录执行
查看filter表的iptables规则,包括所有的链。filter表包含INPUT、OUTPUT、FORWARD三个规则链。
说明:-L是–list的简写,作用是列出规则。
只查看某个表的中的规则。
说明:表名一共有三个:filter,nat,mangle,如果没有指定表名,则默认查看filter表的规则列表(就相当于第一条命令)。
举例:iptables -L -t filter
这里多了个链名,就是规则链的名称。
说明:iptables一共有INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING五个规则链。
举例:iptables -L INPUT
注意:链名必须大写。在Linux系统上,命令的大小写很敏感。
说明:以数字形式显示规则。如果没有-n,规则中可能会出现anywhere,有了-n,它会变成0.0.0.0/0
包含chain INPUT,chain OUTPUT等链
说明:你也可以使用“iptables -L -nv”来查看,这个列表看起来更详细,对技术人员更友好
iptables -I INPUT -s IP地址 -j DROP
iptables -I INPUT -s 192.168.1.0/24 -j DROP
iptables -D INPUT -s IP地址 -j REJECT
如:
$iptables -t filter -I INPUT -s 10.108.0.0/16 -j ACCEPT
$ iptables -t filter -I OUTPUT -s 10.108.0.0/16 -j ACCEPT
命令的语法格式 匹配即停止
iptabless [-t 表名] 选项 [链名] [条件] [-j 目标操作] ##不打 [-t 表名] 默认为filter
iptables -t filter -I INPUT -s 192.168.4.100 -p tcp --dport 22 -j REJECT ##拒绝192.168.4.100主机用tcp协议访问我的端口22(即不能用ssh访问为)
选项:
-A追加规则
-I插入规则 ##插入第一个行
-L查看规则
-D删除规则:REJECT,DROP,ACCEPT
条件:
源 协议 目标
-s -p --dport
###########################################################
iptables -I INPUT -s 192.168.4.100 -p tcp --dport 80 -j REJECT ##拒绝192.168.4.100主机用tcp协议访问我的端口80(即不能用80端口访问我的web网页)
iptables -I INPUT -s 192.168.4.100 -p icmp -j REJECT ##拒绝192.168.4.100主机用icmp协议访问我(即不能ping我)
注意事项/整体规律
-可以不指定表,默认为filter表
-有规则先匹配规则,没有规则匹配默认规则
-选项/链名/目标操作用大写字母,其余都小写
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + Shift + B
斜体:Ctrl/Command + Shift + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
链接: link.
图片:
带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' |
‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" |
“Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash |
– is en-dash, — is em-dash |
一个具有注脚的文本。2
Markdown将文本转换为 HTML。
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::
这将产生一个流程图。:
我们依旧会支持flowchart的流程图:
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
mermaid语法说明 ↩︎
注脚的解释 ↩︎