ip_conntrack [rhel5.8]
在rhel6.5
上面是nf_conntrack
,这个是内存中的一个模块,主要是用来追踪TCP UDP ICMP
各个报文之间的状态,防止反弹式木马利用已经打开的端口或者已经建立的连接来发送数据- 查看
nf_conntrack
里面的内容
- 里面的内容保存了会话访问的地址和端口等信息,同时也可以通过命令
iptstate
进行查看,需要安装软件包iptstate-2.2.2-4.el6.x86_64
- 这里看到一条红色的关于
icmp
的信息
nf_conntrack
这个模块仅仅是用来追踪,并且保留这些数据报文的信息,如果需要进行分析,需要结合iptables
的其它模块来实现;- 对于
nf_conntrack
里面保存条目的定义
- 如果超过这里面的数值定义的请求就会因为超时被丢弃,服务器性能下降会十分明显,必要时,调大这个值,甚至在某些服务器上面移除
nf_conntrack
,设置需要避免激活nf_conntrack
这个模块,比如使用iptables -t nat -L -n
,这个命令,仅仅使用查看nat
表的规则的,但是首先会激活iptable_nat
,由于模块间的依赖关系,接下来就会导致nf_conntrack
模块被激活,一旦模块激活,就会立即开始记录数据报文之间的状态关系;
这个模块的依赖关系显示
nf_conntrack
被众多的模块依赖,一旦这些模块被启动nf_conntrack
模块就会被启动;在
/proc/sys/net/ipv4/netfilter/
这个目录里面定义了一批关于追踪模块的参数的定义,不同的系统定义的位置可能不一致;
iptables
的配置文件- 在重启服务之前,使用
service iptales save
就可以用于保存文件;
[root@server2 ~]# /etc/init.d/iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
下面这两项结合使用:
[root@server2 ~]# iptables-save > 自定义的保存位置;
[root@server2 ~]# iptables-restore < /自定义的保存位置
否则在重新启动
iptables
时,netfilter
上面的规则就会被清空;显示扩展
- 利用
state
并且结合nf_conntrack
的状态来管理iptables
服务
NEW
:新连接请求;ESTABLISHED
:表示已经建立的连接;INVALID
: 表示非法的请求,SYN=1,FIN=1
;RELATED
:表示相互关联的连接;
- 首先根据状态来放行
sshd
的NEW ESTABLISHED
服务
[root@server23 ~]# iptables -A INPUT -d 172.25.23.23 -p tcp --dport 22 -m \
state --state NEW,ESTABLISHED -j ACCEPT
[root@server23 ~]# iptables -A OUTPUT -s 172.25.23.23 -p tcp --sport 22 -m \
state --state ESTABLISHED -j ACCEPT
- 接下来修改默认的策略
[root@server23 ~]# iptables -P INPUT DROP
[root@server23 ~]# iptables -P OUTPUT DROP
- 放行httpd服务
- 还是需要结合状态来进行放行
[root@server23 ~]# iptables -A OUTPUT -s 172.25.23.23 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
[root@server23 ~]# iptables -A INPUT -d 172.25.23.23 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
- 因为本机的
Yum
源使用的时httpd
服务,如果只进行上面的设定,那么Yum
服务不能够使用的,Yum
服务器是172.25.23.250
,接下来放行对于这个的Web
访问
[root@server23 ~]# iptables -A OUTPUT -d 172.25.23.250 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@server23 ~]# iptables -A INPUT -s 172.25.23.250 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
- 如果需要修改上面的值
[root@server23 ~]# sysctl -w net.nf_conntrack_max=65536
net.nf_conntrack_max = 65536
[root@server23 ~]# !cat
cat /proc/sys/net/nf_conntrack_max
65536
- 如果需要永久有效的尽进行更改,需要下载
/etc/sysctl.conf
这个文件里面 修改
nf_conntrack
的其他指令的值,参数都在/proc/sys/net/netfilter/nf_
目录里面;多端口匹配
multiport
:用于实现离散的多端口匹配功能
--sports port[,port|,port:port]
:支持离散和连续的源端口匹配;--dports port[,port|,port:port]
:用于支持离散和连续的目的端口匹配;--ports port[,port|,port:port]...
:表示不限定端口的来源进行匹配,并且支持[!]
进行范围的取反操作;
- 修改上面的端口匹配规则为,将状态为
ESTABLISHED
的规则进行整合,并且使用离散的端口匹配,匹配80 21 22
端口
[root@server23 ~]# iptables -I INPUT -d 172.25.23.23 -p tcp -m state --state ESTABLISHED,REALYTED -j ACCEPT
- 然后使用离散的多端口进行匹配
[root@server23 ~]# iptables -I INPUT 2 -d 172.25.23.23 -p tcp -m state --state NEW -m multiport --destination-ports 21,22,80 -j ACCEPT
查看
iptables
的规则
IP Range
使用实现
IP
地址的扩展,主要用于实现某个网段内部的IP
地址扩展,模块为iprange
,但是只能够用于IPV4
的地址范围;--src-range
:表示源地址范围;--dst-range
:表示目的地址范围
放行
8080
端口对于172.25.23.1/24-->172.25.23.100/24
具有访问权限
[root@server23 ~]# iptables -A INPUT -p tcp -m iprange --src-range 172.25.23.1-172.25.23.100 --dport 8080 -m state --state NEW,ESTABLISHED -j ACCEPT
- 查看添加的规则
- 连接限制扩展
connlimit
:用于限制连接的次数,主要是用来限制同时在线的请求;
! --connlimit-above n
:Match if the number of existing connections is (not) above n.
,用来指定最多可以使用多少个连接;
connlimit
提供一个Example
[root@server23 ~]# iptables -A INPUT -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT
- 首先查看添加的规则
在尝试登陆
telnet-server
服务两次以后,再次进行登陆,就会出现一直等待的情况
limit
:用于限制流量上限,单位的访问速率,以及突然而至的流量上限--limit rate[/second|/minute|/hour|/day]
:用于限制速率,单位时间的访问速率;--limit-burst number
:用于放行突然间一批的访问速率;这个来限定一下
ping
的请求,将这条规则,插入到第一条
[root@server23 ~]# iptables -I INPUT -d 172.25.23.23 -p icmp --icmp-type 8 -m limit --limit 5/minute -j ACCEPT
- 添加上述规则,并且在删除多于的关于关于
icmp
的规则之后
- 上面的
ping
命令在执行的过程中,会发生等待,大约按照5/minutes
的速度来进行放行 watch
命令监控的命令执行过程
字符串限定
string
:his modules matches a given string by using some pattern matching strategy. It requires a linux kernel >= 2.6.14.
--algo {bm|kmp}
:表示字符串匹配算法,支持两种算法bm kmp
[!] --string pattern
:表示需要匹配字符串;
- 这条规则其实应该加在
OUTPUT
上面,相应内容应该在OUTPUT
上面出去
[root@server23 ~]# iptables -I OUTPUT -s 172.25.23.23 -m string --algo kmp --string "h7n9" -j REJECT
由于浏览器的缓存原因,建议使用
Ctrl+F5
进行刷新,页面就会一致得不到相应内容
查看是否匹配到报文
自定义链
- 首先来添加一条自定义链
[root@server23 ~]# iptables -N NewChain
- 查看添加的自定义规则链
- 在自定义链上添加规则
[root@server23 ~]# iptables -A NewChain -d 172.25.255.255 -p icmp -j DROP
[root@server23 ~]# iptables -A NewChain -p tcp ! --syn -m state --state NEW -j DROP
[root@server23 ~]# iptables -A NewChain -p tcp --tcp-flags ALL ALL -j DROP
[root@server23 ~]# iptables -A NewChain -p tcp --tcp-flags ALL NONE -j DROP
- 自定义链首先需要返回
[root@server23 ~]# iptables -A NewChain -d 172.25.23.23 -j RETURN
- 自定义的链,需要被主链进行调用
[root@server23 ~]# iptables -I INPUT -j NewChain
- 查看调用的规则
- 如果需要删除自定义链,首先删除调用
[root@server23 ~]# iptables -D INPUT 1
- 然后清除自定义链中的规则
[root@server23 ~]# iptables -F NewChain
- 接下来可以直接删除自定义链
[root@server23 ~]# iptables -X NewChain
- recent模块
- 利用
recent
来防止恶意的telnet
连接
[root@server23 ~]# iptables -I INPUT 1 -d 172.25.23.23 -p tcp --dport 23 -m connlimit --connlimit-above 3 -j DROP
[root@server23 ~]# iptables -I INPUT 2 -d 172.25.23.23 -p tcp --dport 23 -m state --state NEW -m recent --set --name TELNET
[root@server23 ~]# iptables -I INPUT 3 -d 172.25.23.23 -p tcp --dport 23 -m state --state NEW -m recent --update --second 300 --hitcount 3 --name TELNET -j DROP
- 还需要添加一条关于
23
端口放行的规则
[root@server23 ~]# iptables -A INPUT -p tcp -d 172.25.23.23 --dport 23 -m state --state NEW,ESTABLISHED -j ACCEPT
- 尝试多次
telnet
之后,就会被拒绝,在300s
之后,就可以恢复正常
- 查看连接追踪信息
* 通过指定的模板,用来记录用户的连接信息;
* update
:表示每次建立连接都更新列表;
* --second
:必须和--rcheck
和--update
同时使用;
* --hitcount
:必须与--rcheck
或者--update
同时使用;
* 记录的位置通常在/proc/net/ipt_recent/NAME
里面进行记录;