iptables: 包过滤型的防火墙
firewall:防火墙,隔离工具:工作于主机和网络边缘,对于进出本主机或者网络的报文根据事先定义的检查规则匹配检测,对于能够被规则匹配的报文作出相应的处理组件
netfilter:kernel
iptables:rules until
hook function 钩子函数
input
output
forward
prerouting
postrouting
链:(内置)
PRETOUTING
INPUT
FORWORD
OUTPUT
POSTROUTING
功能:
filter:过滤
nat:network address translation 用于修改源ip或目标ip也可以改端口
mangle:拆解报文,作出修改,并重新封装,如修改ttl值
raw:关闭nat表上启用的连接追踪的功能
功能<--链
raw:prerouting output
mangle:prerouting input forward output postrouting
nat:prerouting {input coent7}output postrouting
filter:input forward output
报文流向:
流入本机 prerouting——》input
由本机流出:output——》postrouting
转发:prerouting——》 forward——》postrouting
路由功能发生的时候
报文进入本机后:
判断目标主机是?
报文离开本机之前
判断经由那个接口送往下一站?
rpm -ql iptables 安装iptables有哪些文件有处理条件 有处理动作
iptables/netfilter
规则:
组成部分:
匹配条件:根据规则的匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理
基本匹配条件
扩展匹配条件
处理动作
基本处理动作
扩展处理动作
自定义处理机制
iptables的链:内置链和自定义链
内置链:对应于hook function
自定义链:用于内置链的扩展和补充;实现更灵活的规则管理机制
添加规则时的考量点:
(1)要实现那种功能:判断添加到那个表上;
(2)报文流经的路径:判断添加到那个链上;越早越优先
链:链上的规则次序,既为检查的次序;因此,隐含一定的应用法则
(1)同类规则访问同一应用,匹配小的范围放上面
(2)不同类的规则,访问不同的应用,匹配到报文频率大的放在上面
(3)将那些可由一条规则描述的多个规则合并起来
(4)设置默认策略
iptables 命令
iptables [-t table] {-A|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
规则格式: iptables【-t table】 COMMAND chain -m matchname [per-match-options] -j targetname [per-target-options]
-t table: raw mangle nat filter
COMMAND:
链管理:
-N:new自定义新的规则链
-X:delete删除自定义的规则链
-P:policy 设置模式策略的
accept:接受
drop:丢弃
reject:拒绝
-E:重命名自定义链;引用计数不为0的自定义链不能重命名也不能被删除
规则管理:
-A:append 追加
- I:insert 插入 要指明位置,省略表示第一条
-D:delete删除,(1)指明规则号(2)指明规则本身
-R:replace 替换 指定链上的指定规则(1)指明规则号(2)指明规则本身
-F :flush 清空指定的规则链
-Z : zero 置零 iptables每一条规则都有两个计数器,1:匹配本规则的报文个数;2匹配到的所有报文大小之和
查看:
-L : list 列出指定链上的所有规则
-n:numberic 以数字格式显示地址和端口号
-v:verbose 详细信息 -v -vv
-x : exactiy 显示计数器结果的精确值;
--line-numbers 显示行号
chain:prerouting input forward output postrouting
匹配条件:
基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供
[!]-s, --source address [/mask] 检查报文中的源ip地址是否符合此指定的的地址范围;
[!]-d, --destination address [/mask] 检查报文目的ip地址是否符合此指定的的地址范围;
[!]-p , --protocol protocol 指定的协议 man iptables
[!]-i , --in-interface name 数据报文流入的接口用于 PREROUTING INPUT FORWARD
[!]-o , --out-interface name 数据报文流出的接口 FORWARD OUTPUT POSTROUTING
扩展匹配条件:需要加载扩展模块,方可生效 -m
隐试扩展:不需要手动加载扩展模块,因为他们是对协议的扩展,所以但凡使用-p指明了协议,就表示已经指明了要扩展的模块
tcp:
[!] --source-port, --sport port[:port] 匹配报文的源端口,可以是端口范围
[!] --destination-port, --dport port [:port] 匹配报文的目标端口,可以是端口范围
iptables -t filter -A INPUT -s 172.16.123.1 -d 192.12.123.22 -p tcp --dport 22 -j DROP tcp22端口禁止
[!] --tcp-flag mask comp tcp的标志位
mask is the flags which we should examine ,written as a comma-separated list 例如:SYN ACK FIN RST
comp is a comma-separated list of flags which must be set 例如:syn
例如:--tcp-flage SYN,ACK,FIN,RST SYN == --syn 表示要检查的标志位是syn,ack fin ret 其中syn必须为1 其余的必须为0
udp:
[!] --source-port, --sport port[:port] 匹配报文的源端口,可以是端口范围
[!] --destination-port, --dport port [:port] 匹配报文的目标端口,可以是端口范围
icmp:
[!] --icmp-type{type[/code]|typename}
echo-request :8
echo-reply:0
例如:iptables -A INPUT -d 192.168.2.1 -p icmp --icmp-type 8 -j DROP
显示扩展:
处理动作:
-j targetname 【per-target-options】
accept
drop
reject
return :返回调用链
redirect:端口重定向
log:记录日志
mark:做防火墙标记
dnat:目标地址转换
snat:源地址转换
masquerade:地址伪装
。。。自定义链
防火墙(服务):在CentOS 6 service iptables {start|stop|restart|status}
start:读取事先保存的规则,并应用到netfilter上
stop:清空netfilter上的规则,以及还原默认策略
status:显示生效规则
restart :清空netfilter上的规则,在读取事先保存的规则,并应用到netfilter上;
默认的规则文件:/etc/sysconfig/iptables
iptables -t nat -F PREROUTING
iptables -N mychain
iptables -X mychain
CentOS 7
systemctl start|stop|restart|status firewalld.service
systemctl disable filrewalld.service
systemctl stop firewalld.service
iptables -t filter -A INPUT -s 172.15.100.1 -d 172.15.100.22 -j DROP
iptabels -t filter -L -n --line-numbers
动态查看 watch -n1 'iptables -L -nv'
回顾: iptables/netfilter
netfilter :kernel framework
iptables :编写的规则的CLI
四个表:raw mangle nat filter
5个链:PRETOUTING INPUT FORWARD OUTPUT POSTROUTING
iptables 【-t table 】 subcommand 【chain】【匹配条件】【-就 target】
subcommand:
链:-N -X -E -P
规则:-A -I -D -R -F -Z
查看:-L
-n -v -x --line-numbers
匹配条件:
基本:-s -d -p -i -o
扩展:
隐式:【-m】
tcp:--dport --sport --tcp-flage --syn
udp:--dport --sport
icmp:--icmp-type
echo request 8
echo reply 0
显示:使用帮助文档在Centos 6 man iptables 在Centos 7 man iptables-extensions
1:multiport扩展
以离散方式定义多个端口匹配,最多15个
【!】 --source-ports,--sports【port:port】源
【!】 --destination-ports,--dports【port:port】目标
【!】 --ports【port:port】 源和目标
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j accept
2: iprange 扩展
指明连续的(但一般不值整个网络)ip范围地址
【!】--src-range from 【-to】 源ip地址;
【!】--dst-range from 【-to】目标ip地址
iptables -A INPUT -d 172.16.100.3 -p tcp --dport 80 -m iprange --src-range 172.16.100.100-172.16.100.105 -j DROP
3:string扩展
对报文的应用层数据做字符串匹配检测
--algo{bm|kmp}: 字符串匹配检测算法
bm:boyer-Moore
kmp:knuth-partt-Moore
【!】 --string pattern :要检测的字符串的模式;
/var/www/html/index.html
iptables -A OUPUT -s 172.16.100.11 -d 172.16.0.0/24 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT
4 :time 扩展
根据报文到达的时间与指定的时间范围进行匹配;
iptables -A INPUT -s 172.16.0.0/24 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 16:30 --weekdays Sat,Sun {--kerneltz }-j DROP
--kerneltz 使用内核上的时间,Cent os 7
5:connlimit 扩展
根据每一个客户端并发连接数量做匹配
--connlimit-upto N :连接的数量小于等于N时候匹配
--connlimit-above N:连接的数量大于N时匹配
iptables -A INPUT -d 172.12.12.12 -p tcp --dport 22 -m connlimit --limit-above 3 -j REJECT
ftp screen
6: limit 扩展
基于收发报文的速率做匹配
令牌桶过滤器,摩天轮
--limit rate 【/second|/minute/hour/day】
--limit-burst number
iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
iptables -I INPUT 2 -p icmp -j reject
7:state 扩展(重点)
根据"连接追踪机制conntrack"去检测连接状态和tcp一点关系都没有;是netfilter的内核一种状态,在内核中的一种记录有生存时间
记录conntrack的作用是什么! 追踪本机上的请求响应之间的关系,
NEW:第一次
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间所进行的通讯状态
RELATED:相关联的连接;如ftp中的命令连接和数据连接之间的关系。
INVALID:无效的连接
UNTRACKED;未进行追踪的连接 /var/ftp/ anonymous
【!】--state state
web服务:iptables -A INPUT -d 173.123.123.123 -p tcp -m multiport --dport 22,80 -m state --state NEW -j ACCTPT established
iptables -A OUTPUT -s 173.123.123.123 -p tcp -m multport --sport 22,80 -m state --state ESTABLISHED -j ACCEPT
iptables -P {INPUT|OUTPUT|FORWARD} DROP
对于并发连接超大的,有损害,负载均衡器在/proc/sys/net/nf_conntrack_max修改连接追踪的最大连接数,当模板满载时,后续连接可以超时 内核带宽10GHZ 查看已经追中到的连接/proc/net/nf_conntrack
不同协议的连接追踪的时间不同 在/proc/sys/net/netfilter/ 都有不同协议的时间
使用iptables 开启ftp被动模式 查看这个模块modinfo nf_conntrack_ftp 加载这个模块 modprobe nf_conntarck_ftp lsmod 查看
iptables -A INPUT -d 172.16.123.12 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.123.12 -p tcp --dport 21 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -d 172.16.123.12 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.123.12 -p tcp-m state --state ESTABLISHED -j ACCEPT
主动模式
iptables -Z OUTPUT 1 清空OUTPUT第一条规则的计数器
新建自定义链 iptables -N icmp -E进行重命名,引用是0的时候可以修改
iptables -A icmp -d 172.156.100.1 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT 自定义链的规则
iptables -A INPUT -j icmp 引用自定义链 自定义链中没有规则匹配到,在自定义链中添加一条iptables -A icmp -j return
自定义链需要被调用的时候才可以生效,自定义链中最后需要定义返回规则 赶回规则是使用target 叫做return
规则的使用期限:
使用iptables 命令定义的规则,手动删除之前,生效期限为kernel存货期限;
保存规则:
保存规则至指定的文件:
Cent OS 6: service iptables save 将规则保存至/etc/sysconfig/iptables;
iptables-save > /path/to/some_rules_file将规则保定到指定文件
iptables-restore < /path/from/some_rules_file
Cent OS 7 :
iptables-save > /path/to/some_rules_file
iptables-restore < /path/from/some_rules_file
自动生效规则文件中的规则:
(1)用脚本保存各iptables命令,让此脚本开机后自动运行;
/etc/rc.d/rc.local 文件中添加脚本路径
(2)用规则文件保存各规则,开机时自动载入此规则文件中的规则
/ect/rc.d/rc.local 文件添加
iptables-restore < /path/from/iptables_rulus_file
cent 7: 引入了新的iptables前段工具Firewalld 其管理工具有,firewalld-cmd。firewalld-config
layer 7 --l7
应用:xunlei qq
-m layer --l7proto xunlei -j DROP
1,给内核打补丁,重新编译安装内核 2.6.28版本
:下载内核linux-2.6.28.10.tar.gz
tar xf linux-2.6.28.10.tar.gz -C /usr/src
cd /usr/src
ln -sv linux-2.6.28.10 linux
tar xf netfilter-layer7-v2.22.tar.gz -C /usr/src
cd linux
patch -p1 ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
cp /boot/config-2.618-308.e15.config
yum grouplist
make menuconfig
make
2,给iptables源码打补丁,并重新编译安装iptables
: 下载netfilter-layer7-v2.22.tar.gz l7-protocols-2009-05-28.tar.gz iptables-1.4.6.tar.gz
service iptables stop
cp /etc/rc.d/init.d/iptables &&iptables-config
rpm -qa | grep ipt
rmp -e iptables iptables-ipv6 iptstate --nodeps
tar xf iptables-1.4.6.tar.gz -C /ust/src
3,安装l7proto
1. 匹配TTL值
- 匹配TTL 大于 n(如 2) 的报文
iptables -t mangle -A POSTROUTING -m ttl --ttl-gt 2 -j DROP
- 1
- 1
- 匹配TTL 小于 n 的报文
iptables -t mangle -A POSTROUTING -m ttl --ttl-lt 2 -j DROP
- 1
- 1
- 匹配TTL 等于 n 的报文
iptables -t mangle -A POSTROUTING -m ttl --ttl-eq 2 -j DROP
- 1
- 1
2. 修改TTL值
- 将TTL值 设定 为 n (如 2)
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 2
- 1
- 1
- 将TTL值 减小 n
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-dec 2
- 1
- 将TTL值 增大 n(一般情况下不要去增大TTL值)
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-inc 2