前言
iptables:包过滤型防火墙
防火墙最重要的四表五链:
<center>四表</center>
表名 | 功能 |
---|---|
filter | 过滤,防火墙 |
nat | 网络地址转换 |
mangle | 拆解、修改、封装 |
raw | 关闭nat表上启用的连接追踪 |
<center>五链(钩子函数)</center>
链名 | 特性(位置) |
---|---|
PREROUTING | 在路由发生之前,进入网卡,但未到路由 |
INPUT | 到本机的 |
FORWARD | 由本机转发 |
OUTPUT | 本机内部发出 |
POSTROUTING | 路由发生以后,数据离开网卡之前 |
数据流向
流入:PREROUTINNG --> INPUT
流出:OUPUT --> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTIN
<center>各功能的实现</center>
功能 | 实现链 |
---|---|
filter | INPUT,FORWARD,OUTPUT |
nat | PREROUTING(DNAT目标地址转换),OUTPUT,POSTROUTING(SNAI源地址改变) |
mangle | PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING |
raw | PREROUTING,OUTPUT |
功能的优先级: raw > mangle > nat > filter
bytes:由规则和链匹配到的所有报文大小之和;
一:iptables命令
iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET
SUBCOMMAND 子命令
CHAIN 链
CRETERIA 规则
TARGET 匹配后的操作
-t table
filter, nat, mangle, raw
省略时为filter
1.链管理
子命令 | 功能 |
---|---|
-F CHAIN | 清空规则链;省略链表示清除全部规则 |
-N CHAIN_NAME | 创建新的自定义规则链 |
-X CHAIN_NAME | 删除用户自定义的链,不带参数删除全部自定义链,不能删除被引用链 |
-Z | 清零,置零规则计数器 |
-P | 设置指定链的默认处理规则 |
-E | 重命名自定义链,引用计数不为零的自定义链,无法改名,也无法删除 |
2.规则管理
子命令 | 功能 |
---|---|
-A | 将新规则追加于指定链的尾部 |
-I | 将规则插入至指定链的指定位置 |
-D | 删除指定链上的指定规则(1.指定匹配条件2.指定规则编号) |
-R | 替换指定链上的指定规则 |
-L :查看指定链上的所有规则
子命令:
-n: 以数字格式显示地址和端口号
-v: 显示详细信息
-vv,-vvv
--line-number:显示规则编号
-x: 显示计数器计数结果的精确值
3.目标
- j TARGET
TARFET | Features |
---|---|
ACCEPT | 接受 |
DROP | 丢弃 |
REJECT | 拒绝 |
RETRUN | 返回调用链 |
REDIRECT | 端口重定向 |
LOG | 记录日志 |
MARK | 做防火墙标记 |
DNAT | 目标地址转换 |
SNAT | 源地址转换 |
MASQUERRADE | 地址伪装 |
... | ... |
4.匹配条件
(1).基本匹配:
[!] -s, --src, --source IP|Netaddr: 检查报文中源IP地址是否符合此处指定的地址范围;
[!] -d, --dst, --destination IP|Netaddr: 检查报文中目标IP是否符合此处指定的地址范围;
-p, --protocol {tcp|udp|icmp}:检查报文中的协议;
-i, --in-interface IFACE:数据报文的流入接口(物理);
-o, --out-interface IFACE:数据报文的流出接口(物理);仅能用于FORWARD,OUTPUT,POSTROUTING链上
(2).扩展匹配
-m macth_name --spec_options
例如: -m tcp --dport 22
隐式扩展
-p protocol
指明的协议进行扩展,可省略-m
选项
-p tcp
--dport PORT[-PORT]:目标端口,可以是单个端口或连续端口
--sport PORT[-PORT]:源端口,可以是单个端口或连续端口
--tcp-flags LIST1 LIST2:tcp的标志位,检查LIST1所指明的所有标记位必须为1,且余下(LIST2)的必须为0,没有LIST1中指明的,不做检查
示例: --tcp-flags SYN,ACK,FIN,RST SYN 表示检查是否为第一次建立tcp请求
--syn 和上面的示例同理
-p udp
--dport PORT[-PORT]:目标端口,可以是单个端口或连续端口
--sport PORT[-PORT]:源端口,可以是单个端口或连续端口
-p icmp
--icmp-type
可用数字表示其类型:
0: echo-reply 回送应答,一般做在OUTPUT
8: echo-request 接受应答,INPUT
显式扩展
rpm -ql iptables "*.so"
1.multiport扩展
以离散方式定义多端口匹配;最多指定15各端口;
[!]--source, --sports port[,port|,port|,port:port]...
指明多个源端口
[!]--destination-ports, --dports port[,port|,port|,port:port]...
指明多个目标地址
[!] --ports port[,port|,port|,port:port]... 源和目标端口都匹配
示例:放行源地址为192.168.123.203,协议为tcp的 21,22,80端口入站
~]# iptables -A INPUT -p tcp -d 192.168.123.203 -m multiport --dports 21:22,80 -j ACCEPT
2.iprange扩展(ip范围)
指定连续的(但一般不能扩展为整个网络)IP地址范围时使用
[!] --src-range from[-to]: 指明连续的源ip地址范围
[2] --dst-range from[-to]: 指明连续的目标ip地址范围
示例:允许源地址为192.168.123.203,为ip范围(192.168.123.1-192.168.123.100)目标地址,端口22,21,80出站
~]# iptables -A OUTPUT -p tcp -s 192.168.123.203 -m multiport --sports 21:22,80 -m iprange --dst-range 192.168.123.1-192.168.123.100 -j ACCEPT
3.string扩展
基于字符串匹配协议传输单元的内容
检查报文中出现的字符串
--algo {bm|kmp} 指明字符对比算法,任选一个即可(必须指定选项)
[!] --string pattern :指明匹配字符
示例:报文中含有movie
不允许出站,注意单引号,要放在打开80端口规则之前(同类资源),不然匹配不到当前规则
~]# iptables -I OUTPUT -m string --algo kmp --string 'movie' -j REJECT
OUTPUT
链放行了80端口,这里拒绝匹配字符出站要在放行80端口之前,否则无效.
4.time扩展
--datestart YYYY[-MM[-DD]] 起始日期
--datestop YYYY[-MM[-DD]] 结束日期
--timestart 只匹配时间
--timestop
--monthdays :1-31 天(月)
--weekdays : 1-7 周
示例:再INPUT上做限制,0-23点来自80端口的访问,全部丢弃。
~]# iptables -I INPUT -d 192.168.123.203 -p tcp --dport 80 -m time --timestart 0:00 --timestop 23:59 -j DROP
5.connlimit
设置每当个客户端IP(也可以是地址块)做并发数量匹配
--connlimit-above n : 连接数量大于n
--connlimit-upto n :连接数量小于n
--connlimit-mask
示例:只允许一个客户端ip连接三个SSH服务
~]# iptables -I INPUT -p tcp -d 192.168.123.203 --dport 22 -m --connlimit-above 3 -j REJECT
6.limit 扩展
基于报文的速率做检查;令牌桶过滤器
--limit rate[/second|/minute|/hour|/day] 发包速率,多少时间以恶搞
--limit-burst number 并发数量,当前数量就限制速率
100
个人,但是一共来了200人,饭店只能暂时不接客,过段时间继续接客
示例:
icmp
包一次允许5个,到达五个峰值后,两秒再放行(ping)
iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
7.state扩展(<font color="red">*</font>)
根据连追踪机制检查连接的状态;
调整最大限制
/proc/sys/net/nf_conntrack_max
默认:65536,对于繁忙的服务器是不够用的
~]# systcl -w net.nf_conntrack_max=number
查看:
已经追踪并记录下的连接
/proc/sys/net/nf_conntrack
不同协议或连接类型追踪的时长:
/proc/sys/net/netfilter/
可追踪的连接状态
状态 | 意义 |
---|---|
NEW | 新发出的连接请求;连接追踪模板中不存在此连接相关条目,因此,将其识别为新发起的请求 |
ESTABLISHED | NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态 |
RELATED | 相关的连接;如ftp协议的命令连接与数据之间的关系 |
INVALIED | 无法识别的连接 |
--state STATE,STATE2 ...
示例:入站只允许80端口,NEW和ESTABLISH入站,出站只允许ESLTABLISHED,不允许新连接出站
~]# iptables -I INPUT -p tcp --dport 80 -d 192.168.123.203 -m state --state NEW,ESTABLISHED -j ACCEPT
~]# iptables -I OUTPUT -p tcp --sport 80 -s 192.168.123.203 -m state --state ESTABLISHED -j ACCEPT
三:iptables保存/载入规则
保存规则
~]# iptables-save > /etc/sysconfig/iptables
#保存到这个文件,iptables服务启动(重启)会自动载入规则
载入规则
~]# iptables-restore < /etc/sysconfig/iptables
#载入指定规则
四:配置文件
/etc/sysconfig/iptables-conf
其中可以定义iptables需要的内核模块
IPTABLES_MODULES="MODLUE1,MODULE2,..."
例如:支持ftp的模块
IPTABLES_MODULES="nf_conntrack_ftp"
#启动iptables时会自动加载该模块
modprobe 模块名 #手动装载模块
<center>End</center>