1、linux网络防火墙及netfilter基础原理
2、netfilter基础原理及iptable入门
3、iptable 基础框架及扩展匹配
4、iptable扩展匹配
一、linux防火墙及netfilter基础原理
防火墙(Firewall)有主机防火墙和网络防火墙之分、有硬件防火墙和软件防火墙之分。
防火墙是工作与主机或网络边缘对进出的报文根据定义的规则作检查,进而对被匹配规则的报文做出相应处理的套件;
IDS:(Intrusion Detect System ***检查系统),HIDS(Host IDS),NIDS(Network IDS)
IPS:(Intrusion Protect System ***防御系统),
iptable :网络层防火墙 iptable/netfilter
ipfw--ipchains--iptables:让用户编写规则,再把规则应用到netfilter(卡哨)
netfilter:framework
hook function(钩子函数--链)
PREROUTING:路由前
INPUT:到达本机内部的报文的必经之路
FORWARD:由本机转发的报文的必经之路
OUTPUT:由本机发出的报文的必经之路
POSTROUTING:路由后
规则的功能:(这4个功能叫做表)优先级:raw--mangle--net--filter
raw,主要目标是关闭nat表上启用的连接追踪功能,提供效率
mangle,转换tcp/ip报文首部的某些特性
net,地址转换,启用connection_track,SNAT(源地址转换)、DNAT、PNAT
filter,过滤,定义是否允许通过防火墙
表和链的对应关系:
filter :INPUT ,FORWARD ,OUPUT
net : PREOUTING(SNAT),POSTROUTING(DNAT),OUTPUT(很少用)
mangle:PREROUTING,INPUT,FORWORD,OUTPUT,POSTROUTING
raw:PREROUTING,OUTPUT
数据报文流程:
跟本机内部进程通信:
进入:PREROUTING,INPUT
出去:OUTPUT,POSTROUTING
由本机转发:PREROUTING,FORWORD,POSTROUTING
数据报文的流向:源IP和目标IP由流向决定
注 :iptables传输数据包的过程,图解
二、netfilter基础原理及iptables入门
iptables:用户空间的工具,写规则,并自动发往netfilter,立即生效。
netfilter:接收并生效规则
规则基本语法:
iptables [-t TABLE] [COMMAND] CHAIN CRETIRIA -j TARGET
-t TABLE: nat ,mangle,raw ,filter(默认)
COMMAND:通常使用范围小的规则放在前面,
链:-F :flush,清空规则链
-N :new,自建一条链
-X :delete,删除一条自定义的空链
-Z :zero,计数器归零
-P :policy,设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP
-E :重命名自定义链
链中的规则:-A 在链的尾部附加一条规则
-I 在链中插入一条新规则
-D 删除规则
-R 修改或替换规则
查询:-L
-n:数字格式显示主机地址和端口
-v:详细格式,-vv
--line-numbers:显示规则编号
查询:iptables -L -n -v
#pkts bytes target prot opt in out source destination
包数 字节数 目标 协议 选项 流入接口 流出接口 源地址 目标地址
-x:exactly ,不要对计数器的计数结果做单位换算,而显示其精确值
iptables [-t TABLE] -A 链名 匹配条件 -j 处理目标
匹配条件:
通用匹配:
-s 地址:指定报文源IP地址匹配的范围,IP或网络地址,可以!取反
--src, --source
-d 地址:指定报文目标地址的匹配范围,IP或网络地址,可以!取反
--dst,--destination
-p 协议:指定匹配报文协议类型,
-i INTERFACE:数据报文流入的接口,pretouting ,input,forward
-o INTERFACE:数据报文流出的接口,output,forward,postrouting
扩展匹配:
隐式扩展:当使用-p {tcp|udp|icmp}
-p tcp:
--sport PORT:指定源端口
--dport PORT:指定目标端口
--tcp-flags
-p udp:
--sport PORT:指定源端口
--dport PORT:指定目标端口
--tcp-flags
显式扩展:必须明确说明使用哪个模块扩展
处理目标:
内置目标:DROP ,REJECT,ACCEPT
自定义的链:
例,拒绝172.16.0.0 网段ping 172.16.100.7 主机
#iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p icmp -j DROP
#iptables -L -n 查看规则 或 #watch -n 1 'iptables -L -n -v'
例,拒绝172.16.0.0 网段访问172.16.100.7 http 的80 端口
#iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 80 -j DROP
三、iptables基础框架及扩展匹配
netfilter:5 hook functions
功能:filter, nat, mangle, raw
filter: INPUT, FORWARD, OUTPUT
nat: PREROUTING(DNAT), POSTROUTING(SNAT), OUTPUT(SNAT)
mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw: POSTROUTING, OUTPUT
写规则:先确定功能(表),确定报文流向,确定要实现的目标,确定匹配条件
流向:
与本机进程通信:
流入: -->PREROUTING-->INPUT
流出: -->OUTPUT-->POSTROUTING
经由本机转发:
请求:-->PREROUTING-->FORWARD-->POSTROUTING
响应:-->PREROUTING-->FORWARD-->POSTROUIING
规则中如果限定原地址、目标地址、源端口、目标端口等与流向相关的设定
写规则时要注意:
服务端:先进后出
客户端:先出后进
客户端端口是随机的,因此大多数场景下无须限定
iptables --> 语法检查 --> netfilter
规则立即生效
切记:先添加放行自己会话
规则文件:/etc/sysconfig/iptables
保存启用中的规则于规则文件中:
1、# iptables-save > /etc/sysconfig/iptables
2、# service iptables save
生效规则文件中的规则:
1、# iptables-restore < /etc/sysconfig/iptables
2、# service iptables restart
执行的操作:清空现有规则,读取并生效规则文件中的规则
iptables [-t TABLE] COMMAND CHAIN CRETIERIA -j TARGET
链:
-F:flush
-N:new
-X: Delete
-Z: zero
-P: Policy
-E: rEname
规则:
-A:Append
-I: Insert
-D:Delete
-R:Replace
查看:
-L: List
-n: numeric
-v, -vv, -vvv
-x: eXactly
--line-numbers
匹配条件:
通用匹配:
-s, --src, --source:
-d, --dst, --destination:
-p {tcp|udp|icmp}:
-i IN_IF:
-o OUT_IF:
扩展匹配:调用netfilter额外模块实现特殊检查机制,(使用到相关功能,要使用iptables命令的-m选项来指定调用哪个模块)
隐式扩展:
-p tcp [-m tcp]
--sport PORT[-PORT]
--dport
--tcp-flag 要检查标志位列表(用逗号分隔) 必须为1的标志位列表(逗号分隔)
例如:--tcp-flags syn,ack,rst,fin syn
all none
--syn
-p udp [-m udp]
--sport
--dport
-p icmp [-m icmp]
--icmp-type
0: echo-reply, ping响应
8: echo-request, ping请求
显式扩展:
-m 扩展模块名称
模块:iptables,netfilter各拥有一部分代码
multiport: 多端口匹配
可用于匹配非连续或连续端口;最多指定15个端口;
专用选项:
--source-ports, --sports port[,port,port:port]
--destination-ports, --dports
--ports
例子:
# iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
# iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT
iprange: 匹配指定范围内的地址;
匹配一段连续的地址而非整个网络时有用;
专用选项:
[!] --src-ragne IP[-IP]
[!] --dst-range
# iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
# iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
string: 字符串匹配,能够检测报文应用层中的字符串
字符匹配检查高效算法
kmp, bm
专用选项:
--algo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串;
# iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP
time: 基于时间做访问控制
专用选项:
--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day]
Mon, Tue,
# iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit: 连接数限制,对每IP所能够发起并发连接数做限制;
专用选项:
[!] --connlimit-above [n]
例子:iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
limit: 速率限制
专用选项:
--limit n[/second|/minute|/hour|/day]
--limit-burst n
例子:
# iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
state: 状态检查
专用选项:
--state
连接追踪中的状态:
NEW: 新建立一个会话
ESTABLISHED:已建立的连接
RELATED: 有关联关系的连接
INVALID: 无法识别的连接
调整连接追踪功能所能容纳的连接的最大数目:
/proc/sys/net/nf_conntrack_max
当前追踪的所有连接
/proc/net/nf_conntrack
不同协议或连接类型追踪时的属性:
/proc/sys/net/netfilter目录:
放行被动模式下的FTP服务:
1、装载模块/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
模块:nf_conntrack_ftp
2、放行请求报文:
(1)放行NEW状态对21端口请求的报文;
(2) 放行ESTABLISHED以及RELATED状态的报文
3、旅行响应报文:
(1) 放行ESTABLISHED以及RELATED状态的报文
网上的一篇 iptables 全攻略 相当不错:http://www.linuxso.com/linuxpeixun/10332.html