iptables基础笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables基础笔记相关的知识,希望对你有一定的参考价值。
1.iptables是什么
iptables是Linux上的一支防火墙服务程序,且由内核直接提供
2.iptables的基本工作方式
iptables通过"表"的形式管理进出主机网卡的数据流
默认的"表"有3张,分别为Filter(默认使用),Nat,Manager。我们的需求使用Filter表的情况居多,通过对比数据包头部信息与每张表中的规则,来决定处理数据流是放行还是丢弃。
3.1Filter"表"介绍
Filter是过滤器表,主要与想要进出本机的数据包有关,也是iptables默认的表
每张表里有几种基本概念:
1) "链",每张表里有数种不同的"链","链"的作用是给数据流分类,比如,是进入的数据还是出去的数据或者是需要转发到后端的数据
2) 默认策略,当数据包头部信息与"链"中的每条规则对比都不符合时,就执行"链"默认的策略,是放行还是丢弃或是拒绝等
举例说明:如图
图中黄色标记的就是Filter表中的3个链,分别为INPUT链,FORWARD链,OUTPUT链;用来管理进入的数据,转发的数据及发送出去的数据,每张链的默认处理策略是DROP,ACCEPT,ACCEPT.
当一个数据包想要进入主机时,就需要与Filter表中INPUT链中的规则进行对比,如果符合规则就执行相应的动作,如上图中,标题头target代表规则对比成功要执行的动作,
prot代表数据包的协议(icmp,tcp,udp),source来源IP/网络,目标IP/网络等
4,基本iptables语法
1)列出表的内容
iptables [-t 表名字] [-L] [-n]
-t: 后面接表名字,例如filter,如果省略不写,就使用默认filter表
-L: 列出当前表的规则
-n: 不进行IP地址与主机名的互查(提高显示速度,但是现实的都是ip地址,而不是对人友好的主机名)
2)清除表中默认的规则
iptables [-t 表名字] [-F | X | Z]
-F: 清除表中各个链的的规则,如果想特表指定清除某条链的规则,可以使用--flush选项(例如,--flush INPUT)
-X: 清除用户自定义的链的规则
-Z: 所有链中的计数与流量归零
3)定义链的默认策略
所谓默认策略,是指当数据包不在我们的设计规则之内时,该数据包的处理方式,是通过还是丢弃(类似swith语句中的case和default的意思)
iptables [-t 表名字] -P [INPUT | OUTPUT | FORWARD] [ACCEPT | DROP | REJECT | LOG]
-P: 定义链的默认策略
4)数据包的基础对比语法规则
iptables [-t 表名字] [-A | I] [-io 网络接口设备] [-p 协议] [-s 来源IP/网段] [-d 目标IP/网段] -j [ACCEPT | DROP | REJECT | LOG]
-A | I : 添加规则到链的方式,是"追加"或者"插入"
-i: 数据包进入的设备,例如网卡eth0,lo等,需要配合INPUT链
-o: 数据包发出的设置,列入网卡eth0,lo等,需要配合OUTPUT链
-p: 指明数据包的协议格式,支持的有icmp,udp,tcp等
-s: 来源IP/网段,例如,
IP: 192.168.90.9
网段: 192.168.90.0/24 或者192.168.90.0/255.255.255.0
当在IP/网段前加上!符号时,排除此IP/网段(就是取反的意思)
-d: 目标IP/网段,类似-s选项
-j: 代表本条规则所进行的动作,有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)和记录(LOG),例如,
iptables -A INPUT -i lo -j ACCEPT , 本条规则表示不论数据包来自何处去往哪里,只要是进入lo这个网络设备接口,就给予放行,并且本条规则置于INPUT链所有规则的最后
5)针对-p选项中的TCP和UDP协议的端口语法说明
TCP和UDP协议中有个端口的概念,当我们针对这两种协议的数据包进行规则设计时,如果需要使用到端口,就需特别指明.
iptables [-AI 链名] [-io 接口] [-p tcp,udp] [-s 来源IP/网段] [--sport来源端口范围] [-d 目标IP/网段] [--dport 目标端口范围] -j 动作
--sport: 来源端口范围,端口号可以仅仅指定一个例如21 , 或者也可以指定一个范围例如1024:2048
--dport: 目标端口范围,同上.
例如,想要过滤掉除了来自IP:192.168.90.9的局域网内的主机进行ssh的连接,可以使用:
iptables -A INPUT -i eth0 -p tcp ! -s 192.168.90.9 --dport 22 -j DROP
5,基本iptables语法扩展
数据包状态相关和硬件地址
iptables [-AI INPUT,OUTPUT,FORWARD] [-m state] [--state 状态说明]
iptables [-AI INPUT,OUTPUT,FORWARD] [-m mac] [--mac-source 网卡硬件地址]
想象一种情况,当我们主动通过防火墙送出一个数据包后而又想不加过滤的接受此数据包的响应数据包,那我们该怎么做.例如我有台主机,不允许其他主机主动联络,但当我们主动
连接一台远程主机的80端口的服务,然后又需要接收远程主机80端口服务的数据响应,此时该怎么做. 在这种情况下iptables的扩展模块state就能很好的解决这种问题
-m: iptables的外挂模块
state: 状态模块
mac: 网卡硬件地址模块
--state: 针对state模块数据包的状态,可选的值有:
INVALID: 无效的数据包
ESTABLISHED: 已经成功建立的连接状态标志
NEW: 想要新建立一个连接的数据包状态
RELATED: 表示这个数据包与本机主动发送出去的数据包相关(常用)
例如,如果只允许通过已经建立的连接或者是和已经发出的数据包的的相关响应数据包,而其它的情况下数据包给予丢弃,可以使用:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
--mac-source: 针对mac模块数据包,表示来源主机的网卡地址(MAC)
如果在局域网中,我们想要针对某台机器的外发数据做限制,而我们又知道这台机器的网卡硬件地址,可以使用:
iptables -A INPUT -m mac --mac-source 74:23:44:88:E4:98 -j DROP (当然我们的主机这时候是用作路由器)
参考:<<鸟哥的LINUX私房菜>>
以上是关于iptables基础笔记的主要内容,如果未能解决你的问题,请参考以下文章
《Kubernetes网络权威指南》读书笔记 | iptables