iptables详解

iptables: 包过滤型的防火墙

firewall:防火墙,隔离工具:工作于主机和网络边缘,对于进出本主机或者网络的报文根据事先定义的检查规则匹配检测,对于能够被规则匹配的报文作出相应的处理组件


iptables原理图
iptables详解_第1张图片
 

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

www.baidu.com

kan log /var/log/httpd/access.log

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

 

你可能感兴趣的:(linux)