理解使用IPTABLES

理解概念

iptables可以为Linux创建快速且强大的防火墙IP表,提供与包过滤框架配合使用的接口,它是管理进出系统的网络数据包的强大工具。

必须理解三个概念:表tables,链chains,规则 rules

首先是表tables:

filter表:这是默认表也是主表,如果不指定,就是使用这个表。顾名思义就是过滤数据包,允许或拒绝数据包到达目的地。这也是iptables使用最多的表。

NAT表:该表提供网络地址转换规则,确定是否进行转换,以及如何修改数据包源或目标地址,以便在无法直接访问时NAT路由数据包。

Mangle表:用于更改IP的标头,比如可以调整数据包的生存时间TTL,延长或缩短数据包的有效网络跳点数,以及其他IP标头参数。

RAW表:连接跟踪,提供一种标记数据包的机制,以将数据包视为正在进行的连接或会话的一部分;

Security表:用于在数据包上设置内部SELinux安全上下文标记,这将影响SELinux或其他可以解释SELinux安全上下文的系统如何处理这些数据包。

链chains:

链就像数据数据包路径中的点,我们可以在那里应用规则。一共有5个链:

PRE-ROUTING、INPUT、FORWARD、OUTPUT、POST-ROUTING。

链的顺序如图:

不同的表可以调用哪些链如下图:

如图,比如filter表可用于 input、forward、output链中。

链遍历顺序,实际就是数据包的路径:

再说说规则rules:

规则就是用户定义的命令来操纵网络流量。

数据包按顺序检查链中的每条规则。

如果不匹配,就检查下一条规则;

如果匹配,则由动作组件的值指定。

每个规则都由两个组件组成:匹配组件和动作组件。

比如:

iptables -A INPUT -s 15.15.15.51 -j DROP

匹配组件:示例用红色标注部分。可以用协议、源和目的地址、源和目的端口、接口、标头Header等来匹配,也可以组合匹配规则。

动作组件:示例用蓝色标注部分。表示匹配规则时触发的操作,目前有两种:终止动作和非终止动作。终止目标是动作后,结束该链中进一步遍历,具体的动作有接受、拒绝、队列返回或移动到用户自定义的链。非终止动作是指执行一个动作,然后继续在链中评估下一条。

值得注意的是:并非所有动作都适用于每一个表和链,表和链的类型决定了可用的动作。


语法及实例演示

sudo iptables -L -n -v

查询iptables,-L 表示列出,-n 表示数字显示,-v 表示详细

我们省略了表,表示默认用filter表,如果需要指定表的话,加上 -t参数

sudo iptables -t mangle -L -n -v

iptables的语法是:

iptables -t 表名 -选项 链 匹配组件 动作组件 

表名和链前面已讲过,其他的分别如下:

选项:包括APPEND、DELETE、INSERT、REPLACE、Zero Counters、List、Policy、Rename、Flush、New User defined Chain、Delete Chain,选项可以用开头大写字母简写,Delete Chain有重复,用X代替。

匹配组件:主要有三种:通用的、隐式的和显式的用法。

详细可以查看:

https://www.frozentux.net/iptables-tutorial/chunkyhtml/c2264.html

动作组件:

匹配之后的动作。

跳转:

-j  ,for jump ,跳转到特定规则或同一表中的链。有两个基本的规则 ACCEPT和DROP。还有REJECT,它类似于DROP,但它用于ICMP等返给源一个REJECT响应。最后还有RETURN,它将子链中的数据包返回到上级链。

我们已了解足够多的基础知识了,来实践一下:

假设要阻止用户访问www.360.cn网站:

sudo iptables -A INPUT -s www.360.cn -j DROP

可以查看一下生效的规则:

sudo iptables -L -n -v 

我们能看到域名已解释成具体的IP了,并在INPUT链中添加了相应的规则。

实际测试确实打不开www.360.cn网站了。

删除:

sudo iptables -D  INPUT 1

删除用D选项,1是这条规则的编号。

前面方法对付小型服务器是可以的,但要针对google,qq等网站,这种方法就不合适了,因为google和qq对应的IP地址很多,我们不可能列出全部IP地址,可以修改成丢弃策略,然后将允许访问的网址逐个添加上去,也就是白名单方式。

sudo iptables -P INPUT DROP

INPUT链的策略已改为DROP。这样所有的网站都不能访问了。然后添加具体允许的网站就可以了。

策略改回ACCEPT:

sudo iptables -P INPUT ACCEPT

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注