iptables命令是Linux上最常用的防火墙代理,可以很好得控制进出流量以及限速等。
iptables不是真正意义上得防火墙,我们应该把它理解为一个代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"里面,【netfilter】,这个框架才是真正的防火墙。
netfilter位于内核空间。
iptables是一个命令行工具,位于用户空间。
首先,我们介绍几个基本概念。
netfilter:
Linux操作系统核心层的内部的一个数据包处理模块,它有如下几个功能:
- 网络地址转换(NAT)
- 数据包内容修改
- 数据包过滤【防火墙功能】
rules:
规则是网络管理员预定义的条件,一般形式为"如果符合XXX的条件,就XXX这样处理"。
规则存储在内核空间的信息包过滤表中,这些规则分别指定了源/目的地址,传输协议,服务类型等。
当数据包与规则匹配时,就按照定义的方法进行处理【放行,拒绝,丢弃】。
配置防火墙主要就是配置这些规则。
链:
内核要想实现报文的【放行,拒绝,丢弃】,就要在内核设置关卡,符合条件放行,不符合阻止,这些所谓的关卡就叫链,主要包括【input,output】。
而报文并不是每次的目标主机都是本机,当主机支持 IP_FROWARD时,我们可以把报文转发给其他服务器,也就是其他链,"路由前","转发","路由后"。
如图:
链为什么叫链呢?
我们前文已经说过,防火墙的作用就是对经过关卡的报文匹配规则,然后执行相对应的动作。但是关卡上的规则可能不止一条,有可能有很多条,每个经过此关卡的报文,都要将这些所有的规则都匹配一遍,所以,我们将这些关卡称之为链。
链名 |
功能 |
INPUT |
处理输入数据包 |
OUTPUT |
处理输出数据包 |
PORWARD |
处理转发数据包 |
PREROUTING |
用于目标地址转换(DNAT) |
POSTOUTING |
用于源地址转换(SNAT) |
表:
我们把具有相同功能的规则的集合叫做表。
表名 |
功能 |
内核模块 |
主要用于 |
filter |
负责过滤功能 |
iptables_filter |
防火墙 |
nat |
网络地址转换 |
iptable_nat |
网关路由器 |
mangle |
拆解报文,修改,重新封装 |
iptable_mangle |
服务质量(QOS) |
raw |
关闭nat表上启用的连接追踪机制 |
iptable_raw |
高级功能,如:网址过滤 |
所有的规则都保存在这四张表中。
表的优先级为: raw -> mangle -> nat -> filter
动作:
accept |
接收数据包 |
DROP |
丢弃数据包 |
REDIRECT |
重定向、映射、透明代理 |
SNAT |
源地址转换 |
DNAT |
目标地址转换 |
MASQUERADE |
IP伪装(NAT),用于ADSL |
LOG |
日志记录 |
接下来,我们介绍一下iptables的使用:
-
基本命令
-
清除已有的规则
iptables -F
iptables -X
iptables -Z
-
查看已有的规则
iptables -vnL
iptables -L -n --line-numbers(删除前查看序号)
-
删除已有的规则
iptables -D INPUT 8
-
-
开放指定端口
- iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
- iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
- iptables -A INPUT -j reject #禁止其他未允许的规则访问
-
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
-
屏蔽指定端口
- iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
-
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令
-
相对复杂的命令
iptables -A INPUT -i br-ext -p tcp --dport 5355 -j DROP -m comment --comment 'huwangxingdong'
链 接口 协议 目的端口 丢弃 备注
- 选项
-t<表> |
指定要操纵的表; |
-A |
向规则链中添加条目; |
-D |
从规则链中删除条目; |
-i |
向规则链中插入条目; |
-R |
替换规则链中的条目; |
-L |
显示规则链中已有的条目; |
-F |
清除规则链中已有的条目; |
-Z |
清空规则链中的数据包计算器和字节计数器; |
-N |
创建新的用户自定义规则链; |
-P |
定义规则链中的默认目标; |
-h |
显示帮助信息; |
-p |
指定要匹配的数据包协议类型; |
-s |
指定要匹配的数据包源ip地址; |
-j<目标> |
指定要跳转的目标; |
-i<网络接口> |
指定数据包进入本机的网络接口; |
-o<网络接口> |
指定数据包要离开本机所使用的网络接口。 |