1.iptables规则详解

  • 格式:pdf
  • 大小:794.64 KB
  • 文档页数:5

1.iptables规则详解

1.什么是防⽕墙,防⽕墙的种类有哪些

防⽕墙: 古⼈⽤来隔绝失⽕后的⾼墙,阻挡外来的⽕势,起到了隔离的⼿段。

在互联⽹上,我们会采⽤类似于防⽕墙的⽅法,来保护我们的⽹络不受外来攻击,为此我们需要设定⼀些防⽕墙的规则,确定哪些数据允许通过,哪些不能通过,具有这种功能的设备或软件,我们将其称为防⽕墙

防⽕墙的种类: 逻辑层⾯:

主机防⽕墙:针对单个主机进⾏防护,例如Windows防⽕墙 ⼀般是软件

⽹络防⽕墙:处于⽹路⼊⼝的边缘,针对⽹络⼊⼝进⾏防护 ⼀般是硬件,也可以⽤软件

物理层⾯:

硬件防⽕墙:⼀个实体的硬件,嵌⼊软件,实现防⽕墙的功能,性能⾼,成本⾼

软件防⽕墙:通过软件的⽅式,模拟防⽕墙的功能,运⾏在操作系统上⾯,性能低,成本低

2.iptables介绍

1.什么是iptables?

iptables可以理解为是⼀个代理程序,⽤户通过代理程序,将安全规则添加到安全框架中 net filter(内核空间)

netfilter/iptables 是Linux中的包过滤型防⽕墙,是免费的,可以代替昂贵的商业防⽕墙解决⽅案,可以实现数据包的过滤,实现数据包的转换。

2.什么是包过滤防⽕墙?

包过滤型防⽕墙在我们⽹络层拦截⽹络数据包的包头(header),可以针对数据包的包头,与我们事先准备好的防⽕墙规则进⾏⽐对,与规则相匹配的包放⾏,不匹配的包丢弃或者执⾏⼀些复杂的动作,包过滤型防⽕墙⼀般作⽤在我们的⽹络层,故

通常header中带有 客户端来源IP,源端⼝,⽬标IP,⽬标端⼝,协议类型:tcp udp icmp,根据这些状态信息来判断,是否符合我们的IP tables的过滤规则,符合通过,不然拒绝。

3.包过滤型防⽕墙是怎么实现的?

是基于net filter安全框架实现的,是内核的⼀部分,如果我们想要让防⽕墙达到防⽕的⽬的,需要我们在内核中,设定⼀些关卡,所有进出的报⽂,根据设定的这些关卡进⾏检查,将符合条件的放⾏,不符合的阻⽌,

在net filter中,这些关卡就是链

3.iptables链的概念

1.什么是链?

防⽕墙的作⽤就是在于将经过的报⽂与设定的规则进⾏⽐对,然后执⾏响应的动作,报⽂经过链时,必须匹配链的规则,在链上不⽌⼀条规则,存在着很多规则,当我们将这些规则穿在⼀起的时候就形成了链

链的匹配规则,如下图所⽰,当有报⽂经过时,会以此往下匹配规则,如果匹配成功,则执⾏相对于的动作,如果匹配不成功,就以此往下匹配,直到最后⼀条规则还是没有匹配成功,会执⾏链的默认规则。

2. iptables 有哪些链?

我们从A点到达B点时,途中会经过很多的⾼速路,不同的⾼速路有不通的关卡设定,⽐如说,过路费,查酒驾,查超载,查超速等等,这些都可以理解为⼀些关卡

在iptables中,数据流⼊本机,经过防⽕墙,会经过五个关卡,也就是五个链

PREROUTING:

input:

output:

forward:

postrouting:

数据流⼊本机:当数据经过prerouting,会判断是否是请求本机,请求本机,送往input链,经过input 发送到我们⽤户空间的process进程

数据流出本机:process进程发送给output,由我们的output发送给postrouting,由postrouting选择最优路线,回传给⽤户

数据经过本机:当⽤户请求防⽕墙时,数据报⽂要传给后端的服务器,这时数据报⽂是经过本机,⽽不是到达本机,⾸先会经过prerouting链,由于不是请求本机,所以不会送往input,会送往forward,通过postrouting选择接⼝,转给后端主机。

4.什么是表?

对每个链上⾯会放很多规则⽐如:

A:IP地址或端⼝过滤

B:修改数据报⽂

我们把具有相同功能规则的集合叫做表,不通功能的规则,可以放置在不同的表中进⾏管理

iptables中的表:

filter: 负责做过滤功能 input、output、forward

nat: ⽹络地址转换 PREROUTING、input、output、postrouting

mangle: 负责修改数据包的内容 PREROUTING: input、output、forward、postrouting

raw: 关闭nat表中的追踪机制(⽤的较少)

操作不同表中的不同的链实现的功能不⼀样,

4.1.数据包的优先级

1.当⽤户A请求的是我本机的⽤户进程,⾸先数据包进来会经过prerouting链,由于raw,mangle,nat表都可以管理prerouting链,他会依次看raw,mangle,nat 表中的链有什么规则,依次执⾏,执⾏完之后在进⾏路由选择,

2.由于是访问我们本机的应⽤进程,会送往input链,会先执⾏mangle表中的数据规则,看有没有需要改写的,在进⼊filter表中的数据规则,看有没有需要过滤的,在送往我们的⽤户空间进程

数据包的优先级 raw--->mangle--->nat--->filter

问题1:来⾃于10.0.0.1的地址,访问本机的web服务请求都不允许,应该在那个表的那个链上设定规则? 在filter表中的input链

prerouting链是由raw,mangle,nat表管理的,他们没有数据包过滤的功能

input 是由 filter nat mangle 管理的,filter ⽀持过滤,所以是由filter表中的input链

问题2:所有本机发往10.0.0.0/24⽹段的tcp服务都不允许 在filter表中的output链

output属于filter表,有数据改写的功能,postrouting属于nat,mangle没有数据包过滤的功能

问题3:所有来⾃本机内部⽹络的主机,像互联⽹发送web请求,都不允许 防⽕墙在内部主机之前,内部主机要上⽹的化需要经过防⽕墙,当内部主机需要经过防⽕墙时,第⼀个经过的时prerouting,不是请求本机,只是从本机经过,所有不会转给input,会转给forward,forward转给postrouting选择接⼝,转给web服务器。

prerouting ---> froward ---> postrouting

prerouting 和postrouting都不属于 filter表,所以没有过滤功能,要在forward的上⾯做

PS: 要明确的了解需要做的是 过滤、地址转换、数据包的改写,这样我们才知道是操作的那个表,然后我们需要知道数据包流经的路径,这样我们才知道应该添加到那个链上

实现的功能是什么: 操作那个表

报⽂经过的路径: 判断规则添加到那个链上

5.iptables 的规则

1.什么是规则?规则是如何组成的

我们的数据包的过滤,就是基于规则,⽽规则,是基于条件+动作完成的,想实现防⽕墙达到防⽕的⽬的,⽆外乎是为其添加相应的规则,即,我们匹配的条件和执⾏的动作

2.规则的增删查改

iptables -t 表名 选项(增删查改)链名称 条件 动作

-t 指定操作的表名

-A, --append 追加⼀条规则到链中

-D, --delete 删除链中的规则

-I, --insert 插⼊⼀条规则,插⼊到顶部

-R, --replace 替换,修改

-L, --list 列出当前的规则

-S, --list-rules 列出所有的规则

-F, --flush 清空

-Z, --zero 清空计数器(每条规则都有匹配的包数量、包⼤⼩)

-N, --new-chain 创建⼀个⾃定义链

-X, --delete-chain 删除⼀个⾃定义链

-P, --policy 指定链的默认规则

iptables -t 表名 选项(增删查改)链名称 条件 动作

hdss7-11 bin]# iptables -t filter -L -n -v #查看规则

hdss7-11 bin]# iptables -t filter -I INPUT -p icmp -j REJECT #添加⼀条禁⽌icmp的规则(禁ping)

hdss7-11 bin]# iptables -t filter -R INPUT 1 -p icmp -j DROP #修改第⼀条规则,改为DROP(丢弃)

[root@hdss7-11 bin]# iptables -t filter -Z #清除计数器

hdss7-11 bin]# iptables -t filter -D INPUT 1 #删除指定编号规则

6.iptables 基本的条件匹配

1. -p #指定协议

2. -s -d #源地址,⽬标地址

3. --sport --dport #源端⼝ ⽬标端⼝

4. -i -o #进来的接⼝,出去的接⼝

5. -m -j #

实例1:仅允许10.0.0.1访问10.0.0.5的80端⼝,其他拒绝

先允许: 1.过滤,添加到filter 表,10.0.0.1请求本机的报⽂,会经过prerouting,会到达input,到达⽤户进程,prerouting不⽀持过滤,所以要在input链中做

2.指定来源的ip地址 10.0.0.1

3.指定⽬标的IP地址 10.0.0.5

4.指定具体的协议 tcp

5.指定具体的端⼝ 80

6.指定匹配后的动作 accept

后拒绝: 1.添加到filter表

2.明确指定拒绝所有

具体的配置: iptables -t filter -I INPUT -s 10.0.0.1 -d 10.0.0.5 -p tcp --dport 80 -j ACCEPT #允许来源IP为10.0.0.1⽬的IP为10.0.0.5 协议为tcp 端⼝为80 的进⾏访问

iptables -t filter -A INPUT -p tcp -j DROP #拒绝所有的tcp链接,注意ssh属于tcp连接,-A 追加

iptables -t filter -F #清空所有的配置

实例2:凡是由本机发出的TCP协议报⽂,都允许出去,其他的协议不允许

先允许: 1.过滤,filter表,要从本机出去,所以是output链

再拒绝: 拒绝所有的

具体配置: iptables -t filter -I OUTPUT -p tcp -j ACCEPT #在顶部添加⼀条允许tcp出去的条件

iptables -t filter -A OUTPUT -j DROP #追加⼀条条件为任何协议都不允许出去

iptables -t filter -F OUTPUT #清空OUTPUT 链上的所有规则

实例3:禁⽌其他主机 从eth0 发来的ping请求 1.过滤,filter表,请求的是本机,在input链上

2.指定从哪个⽹络接⼝过来的数据包 ech0 -i 指定接⼝

3.指定具体的协议 icmp

4.指定具体的动作 DROP

iptables -t filter -I INPUT -p icmp -i eth0 -j DROP

[!] -i, --in-interface name

Name of an interface via which a packet was received (only for packets entering the INPUT, FORWARD and PREROUT‐