iptables,即linux上的防火墙,实现了linux上的访问控制功能。
它的实现原理是在TCP/IP协议栈上放置了5个钩子函数(hook function),通过在每个函数设定相应的规则来实现访问控制的目的。
这5个钩子函数分别定义了规则生效的地方,他们分别是
prerouting:路由决策前生效
input:由内核空间转至用户空间服务进程生效
output:由用户空间进程转至内核空间生效
forward:内核空间转发生效
postrouting:路由决策后生效
每个点都可以有多条规则,叫做规则链
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
规则使用:
规则:匹配标准,处理动作
iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法
匹配标准:
通用匹配
-s, --src: 指定源地址
-d, --dst:指定目标地址
-p {tcp|udp|icmp}:指定协议
-i INTERFACE: 指定数据报文流入的接口
可用于定义标准的链:PREROUTING,INPUT,FORWARD
-o INTERFACE: 指定数据报文流出的接口
可用于标准定义的链:OUTPUT,POSTROUTING,FORWARD
扩展匹配
隐含扩展:不用特别指明由哪个模块进行的扩展,因为此时使用-p {tcp|udp|icmp}
-p tcp
--sport PORT[-PORT]: 源端口
--dport PORT[-PORT]: 目标端口
--tcp-flags mask comp: 只检查mask指定的标志位,是逗号分隔的标志位列表;comp:此列表中出现的标记位必须为1,comp中没出现,而mask中出现的,必须为0;
--tcp-flags SYN,FIN,ACK,RST SYN = --syn
--syn
-p icmp
--icmp-type
0: echo-reply icmp响应报文
8: echo-request icmp请求报文
例如:
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -j DROP
丢弃从172.16.0.0/16网络的主机访问主机172.16.100.7的数据包
显式扩展:必须指明由哪个模块进行的扩展,在iptables中使用-m选项可完成此功能
-m EXTESTION --spe-opt
state: 状态扩展
结合ip_conntrack追踪会话的状态
NEW: 新连接请求
ESTABLISHED:已建立的连接
INVALID:非法连接
RELATED:相关联的
例: -m state --state NEW,ESTABLISHED -j ACCEPT 放行新建连接和已连接的数据包
ftp的规则使用
首先要装载ip_conntrack_ftp和ip_nat_ftp模块
在/etc/sysyconfig/iptables-config中加载指定模块
multiport: 离散的多端口匹配扩展
--source-ports
--destination-ports
--ports
-m multiport --destination-ports 21,22,80 -j ACCEPT
条件取反:!,-s ! 172.16.100.6
例如:
iptables -A INPUT -d 172.16.100.7 -p tcp -m state --state ESTABLISHED,RELATED -j
ACCEPT
放行到172.16.100.7的ESTABLISED的状态的数据包
iptables -A INPUT -d 172.16.100.7 -p tcp -m state --state NEW -m multiport --destination-ports 21,22,80 -j ACCEPT
放行到172.16.100.7的21,22,80端口的NEW状态的数据包
命令:
管理规则
-A:附加一条规则,添加在链的尾部
-I CHAIN [num]: 插入一条规则,插入为对应CHAIN上的第num条;
-D CHAIN [num]: 删除指定链中的第num条规则;
-R CHAIN [num]: 替换指定的规则;
管理链:
-F [CHAIN]:flush,清空指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链
-P CHAIN: 设定指定链的默认策略;
-N:自定义一个新的空链
-X: 删除一个自定义的空链
-Z:置零指定链中所有规则的计数器;
-E: 重命名自定义的链;
查看类:
-L: 显示指定表中的规则;
-n: 以数字格式显示主机地址和端口号;
-v: 显示链及规则的详细信息
-vv:
-x: 显示计数器的精确值
--line-numbers: 显示规则号码
动作(target):
ACCEPT:放行
DROP:丢弃
REJECT:拒绝
DNAT:目标地址转换
SNAT:源地址转换
REDIRECT:端口重定向
MASQUERADE:地址伪装
LOG:日志
MARK:打标记
例:
172.16.100.7,sshd:22/tcp
放行到172.16.100.7的ssh报文
iptables -t filter -A INPUT -d 172.16.100.7 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 172.16.100.7 -p tcp --sport 22 -j ACCEPT
保存规则:
# service iptables save
/etc/sysconfig/iptables 保存的文件