版权声明:本文为木偶人shaon原创文章,转载请注明原文地址,非常感谢。 https://cloud.tencent.com/developer/article/1434979
1:Iptables - Layer7
iptables默认是OSI三层和四层以及二层源MAC地址过滤 针对于某一个应用:xunlei,kugou,qq,msn,flv,p2p,httpd,smtp等等过滤,直接针对协议来过滤 Netfilter默认是没有这些功能的,如果我们需要使用到7层的,应用协议过滤,那么我们就必须对netfilter打补丁 Netfilter默认只是一个框架,真正的过滤的规则是iptables,但是这些语法是否生效,就需要netfilter提供框架,同时iptables还必须能支持iptables支持7层的语法 所以我们需要对netfilter和iptables都需要打补丁 layer7的官方网站:http://l7-filter.sourceforge.net/
- 1:回顾Iptables
代码语言:javascript复制iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。
[root@linux-node1 ~]# vim /boot/config-2.6.32-573.el6.x86_64
# Core Netfilter Configuration
#
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m
CONFIG_NF_CONNTRACK=m
CONFIG_NF_CONNTRACK_MARK=y
- 2:iptables 四表五链
4个表:filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。 表的处理优先级:raw>mangle>nat>filter。 filter:一般的过滤功能 nat:用于nat功能(端口映射,地址映射等) mangle:用于对特定数据包的修改 raw:优限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能 5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。 INPUT:通过路由表后目的地为本机 OUTPUT:由本机产生,向外转发 POSTROUTIONG:发送到网卡接口之前。
- 3:iptables 关系图
--> PREROUTING --> [ROUTE] --> FOREWARD --> POSTROUTING -->
MANGLE | MANGLE ^ MANGLE
NAT | NAT | NAT
∨ |
INPUT OUTPUT
| | MANGLE
| | NAT
∨ --> LOCAL --> ^ FILTER
- 4:常见参数
-t 指定表
-A 指定链
-I 最上面插入一条规则
-D 删除某条规则
-F 清空所有规则
-L 查看所有规则
-N 自定义链(可以用在-j的后面)
-P 设定默认策略
-Z 包字节数清0
-s 匹配某一个源地址IP
-d 匹配某一个目的地址IP
-p 指定协议,tcp,udp,icmp
-i 指定进入网卡,如-e eth0
-o 指定出去接口
-j 动作,DROP,REJECT,ACCEPT,LOG
-n 不解析,显示数值
-v 详细信息输出
--line-numbers 为每一条规则编号
- 5:SSH加强配置
[root@linux-node1 ~]# iptables -t filter -A INPUT -i lo -j ACCEPT
[root@linux-node1 ~]# iptables -t filter -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
[root@linux-node1 ~]# iptables -t filter -P INPUT DROP
[root@linux-node1 ~]# iptables -L INPUT -nv
----------------------------------------------------------------------------------------------------
| Chain INPUT (policy DROP 15 packets, 1321 bytes) |
| pkts bytes target prot opt in out source destination |
| 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 |
| 123 9128 ACCEPT tcp -- * * 192.168.1.0/24 0.0.0.0/0 tcp dpt:22 |
----------------------------------------------------------------------------------------------------
[root@linux-node1 ~]# iptables -L INPUT -nv --line-number
--------------------------------------------------------------------------------------------------------
| Chain INPUT (policy DROP 25 packets, 2720 bytes) |
| num pkts bytes target prot opt in out source destination |
| 1 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 |
| 2 155 11432 ACCEPT tcp -- * * 192.168.1.0/24 0.0.0.0/0 tcp dpt:22|
--------------------------------------------------------------------------------------------------------
- 6:拓展匹配-m
[root@linux-node1 ~]# iptables -t filter -P INPUT ACCEPT
- 6.1:拒绝别人ping自己
但是自己可以ping别人,这里有两种方法
- 6.1.1 修改内核参数
[root@linux-node1 ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
--
| 0|
--
[root@linux-node1 ~]# echo 1 > !$
测试: windows的cmd中
C:UsersThinkpad>ping 192.168.1.11
----------------------------------------------------------
| |
|正在 Ping 192.168.1.11 具有 32 字节的数据: |
|请求超时。 |
|请求超时。 |
|请求超时。 |
|请求超时。 |
| |
|192.168.1.11 的 Ping 统计信息: |
| 数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),|
----------------------------------------------------------
提示:如果你的host配置了此项,无论你怎么静止,都是可以ping通的,这个时候并没有ping服务器
- 6.1.2 iptables控制
[root@linux-node1 ~]# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
--icmp-type echo-request 表示请求 ,出去的
echo-reply 表示回显,回来的
[root@linux-node1 ~]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p icmp -m icmp --icmp-type echo-reply -j DROP
这种情况,回来的拒绝,那么实际是ping到外面,但是无法得到回显,自己ping不通外面
[root@linux-node1 ~]# ping 192.168.1.13
----------------------------------------------------------------
|PING 192.168.1.13 (192.168.1.13) 56(84) bytes of data. |
|^C |
|--- 192.168.1.13 ping statistics --- |
|3 packets transmitted, 0 received, 100% packet loss, time 2243ms|
----------------------------------------------------------------
[root@linux-node1 ~]# iptables -t filter -D INPUT -s 192.168.1.0/24 -p icmp -m icmp --icmp-type echo-reply -j DROP
[root@linux-node1 ~]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p icmp -m icmp --icmp-type echo-request -j DROP
能ping通别人的,但是别人不能ping自己
- 6.2:限制连接数
-m connlimit --connlimit-above 2 每个客户端最大的连接数不超过两个
[root@linux-node1 ~]# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -m connlimit -h
帮助获取
[root@linux-node1 ~]# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
- 6.3:限制FTP下载速度
[root@linux-node1 ~]# iptables -D INPUT -s 192.168.1.0/24 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
-m limit --limit 匹配速度 [--burst 缓冲数量]
[root@linux-node1 ~]# iptables -A INPUT -d 192.168.1.11 -m limit --limit 1/s -j ACCEPT
[root@linux-node1 ~]# iptables -A INPUT -d 192.168.1.11 -j DROP
[root@linux-node1 ~]# rpm -ivh /media/Packages/vsftpd-2.2.2-14.el6.x86_64.rpm && /etc/init.d/vsftpd restart
[root@linux-node1 ~]# dd if=/dev/zero of=/var/ftp/a.txt bs=100M count=1
测试:
[root@linux-node2 ~]# yum install -y lftp
[root@linux-node2 ~]# lftp 192.168.1.11
lftp 192.168.1.11:~> ls
--------------------------------------------------------------
|-rw-r--r-- 1 0 0 104857600 Jul 09 10:32 a.txt|
|drwxr-xr-x 2 0 0 4096 Mar 06 2015 pub |
--------------------------------------------------------------
lftp 192.168.1.11:/> get a.txt
--------------------------------------------------------
|`a.txt' at 158088 (0%) 3.8K/s eta:7h8m [Receiving data] |
--------------------------------------------------------
- 6.3:ICMP 洪水攻击
通过很多主机的 ping 包占满被攻击主机的带宽。
ping -i 指定间隔
例:0.001 秒,发一个 ping 包
[root@linux-node1 ~]# iptables -F
[root@linux-node2 ~]# ping -i 0.001 192.168.1.11
解决:
[root@linux-node1 ~]# iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -m limit --limit 2/s -j ACCEPT
[root@linux-node1 ~]# iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -j DROP
测试:
[root@linux-node2 ~]# ping -i 0.001 192.168.1.11
速度明显变慢
间歇性ping
[root@linux-node1 ~]# iptables -F
[root@linux-node1 ~]# iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -m limit --limit 6/min --limit-burst 2 -j ACCEPT
[root@linux-node1 ~]# iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -j DROP
测试:
C:UsersThinkpad>ping 192.168.1.111 -t
--------------------------------------------------
|正在 Ping 192.168.1.111 具有 32 字节的数据: |
|来自 192.168.1.111 的回复: 字节=32 时间<1ms TTL=64|
|来自 192.168.1.111 的回复: 字节=32 时间<1ms TTL=64|
|请求超时。 |
|请求超时。 |
|来自 192.168.1.111 的回复: 字节=32 时间=2ms TTL=64|
|请求超时。 |
|请求超时。 |
|来自 192.168.1.111 的回复: 字节=32 时间=3ms TTL=64|
|请求超时。 |
|请求超时。 |
|来自 192.168.1.111 的回复: 字节=32 时间<1ms TTL=64|
--------------------------------------------------
- 6.4:多端口使用
举例而已,如果生产,自己斟酌
[root@linux-node1 ~]# iptables -F
[root@linux-node1 ~]# iptables -A FORWARD -s 192.168.1.111 -p tcp -m multiport --sport 80,23,22 -j ACCEPT
[root@linux-node1 ~]# iptables -A FORWARD -s 192.168.1.111 -j DROP
[root@linux-node1 ~]# iptables -A FORWARD -s 192.168.1.111 -p tcp -d 192.168.1.111 -m multiport --dport 80,22,23 -j ACCEPT
[root@linux-node1 ~]# iptables -A FORWARD -s 192.168.1.111 -p tcp -d 192.168.1.111 -j DROP
[root@linux-node1 ~]# iptables -F
- 6.5:状态规则
-m stat 基于状态的防火墙规则:
tcp : 三握手, 只有第一次发包 SYN,状态为:NEW。 其它为: ESTABLISED
ftp : RELATED
FTP 主动模式: 图主动模式
在第 1 步中,客户端的命令端口与 FTP 服务器的命令端口建立连接,并发送命令“PORT 1027”。
第 2 步中,FTP 服务器给客户端的命令端口返回一个"ACK"。
在第 3 步中,FTP 服务器发起一个从它自己的数据端口(20)到客户端先前指定的数据端口(1027)的连接
第 4 步中给服务器端返回一个"ACK"。
主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接,它只是简单的告诉服务器自己监听的端口号,服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的。
被动模式: FTP pasv 图被动模式i
在第 1 步中,客户端的命令端口与服务器的命令端口建立连接,并发送命令“PASV”。
在第 2 步中,服务器返回命令"PORT 2024",告诉客户端(服务器)用哪个端口侦听数据连接。
在第 3 步中,客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。
最后服务器在第 4 步中给客户端的数据端口返回一个"ACK"响应。
配置被动模式 FTP 服务器:
[root@linux-node1 ~]# vim /etc/vsftpd/vsftpd.conf
listen_port=21
pasv_enable=YES
pasv_min_port=9900
pasv_max_port=9999
注:pasv_min_port 和 pasv_max_port 指定了开放的端口号
[root@linux-node1 ~]# /etc/init.d/vsftpd restart
[root@linux-node1 ~]# netstat -antup | grep 99*
发现并没有端口,被动模式,需要有数据传送,才有端口的产生
[root@linux-node2 ~]# lftp 192.168.1.11
lftp 192.168.1.11:~> ls
[root@linux-node1 ~]# netstat -antup | grep 99*
------------------------------------------------------------------------------------------
|tcp 0 0 192.168.1.111:9925 192.168.1.13:46841 TIME_WAIT - |
------------------------------------------------------------------------------------------
被动模式 FTP 的防火墙规则配置:
FTP 与多数其他 TCP应用不同,它在客户进程和服务器进程之间使用两个TCP连接.
第一个是控制连接,它一直持续到客户进程与服务器进程之间的会话完成为止。
另一个是数据连接,按需可以随时创建和撤消。每当一个文件传输时,就创建一个数据连接。 其中,控制连接被称为主连接。而数据连接被称为子连接。
数据连接是子连接,它的连接状态在连接初期被识别为 RELATED,而不是 New
[root@linux-node1 ~]# iptables -t filter -A INPUT -i lo -j ACCEPT
[root@linux-node1 ~]# iptables -t filter -A INPUT -s 0.0.0.0 -p tcp --dport 21 -j ACCEPT
[root@linux-node1 ~]# iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@linux-node1 ~]# iptables -P INPUT DROP
[root@linux-node1 ~]# lsmod | grep nat_ftp
[root@linux-node1 ~]# modprobe ip_nat_ftp
[root@linux-node1 ~]# lsmod | grep nat_ftp
------------------------------------------------------------------------------------
|nf_nat_ftp 3443 0 |
|nf_nat 22676 1 nf_nat_ftp |
|nf_conntrack_ftp 11953 1 nf_nat_ftp |
|nf_conntrack 79206 4 nf_nat_ftp,nf_nat,nf_conntrack_ipv4,nf_conntrack_ftp|
------------------------------------------------------------------------------------
[root@linux-node1 ~]# iptables -L INPUT -nv
------------------------------------------------------------------------------------------------------------------
|Chain INPUT (policy DROP 8 packets, 624 bytes) |
| pkts bytes target prot opt in out source destination |
| 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 |
| 0 0 ACCEPT tcp -- * * 0.0.0.0 0.0.0.0/0 tcp dpt:21 |
| 112 8288 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED |
------------------------------------------------------------------------------------------------------------------
- 6.6:mark功能
代码语言:javascript复制使用 iptables mangle 打标记,然后使用 mark 匹配
[root@linux-node1 ~]# iptables -t mangle -A PREROUTING -m ttl --ttl-eq 64 -j MARK --set-mark 1
[root@linux-node1 ~]# iptables -t mangle -A PREROUTING -m ttl --ttl-eq 128 -j MARK --set-mark 2
[root@linux-node1 ~]# iptables -t filter -A FORWARD -m mark --mark 1 -j ACCEPT
[root@linux-node1 ~]# iptables -t filter -A FORWARD -m mark --mark 2 -j DROP
[root@linux-node1 ~]# iptables -t mangle -L -n
------------------------------------------------------------------------------------------------
|Chain PREROUTING (policy ACCEPT) |
|target prot opt source destination |
|MARK all -- 0.0.0.0/0 0.0.0.0/0 TTL match TTL == 64 MARK set 0x1 |
|MARK all -- 0.0.0.0/0 0.0.0.0/0 TTL match TTL == 128 MARK set 0x2 |
------------------------------------------------------------------------------------------------
[root@linux-node1 ~]# iptables -t filter -L -nv
--------------------------------------------------------------------------------------------------------
|Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) |
| pkts bytes target prot opt in out source destination |
| 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x1 |
| 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x2 |
--------------------------------------------------------------------------------------------------------
- 7:服务器Iptables操作
[root@mail netfilter]# iptables -t filter -F
[root@mail netfilter]# iptables -t nat -F
[root@mail netfilter]# iptables -t mangle -F
[root@mail netfilter]#iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
[root@mail netfilter]# iptables -t filter -A INPUT -i lo -j ACCEPT
[root@mail netfilter]# iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -m limit --limit 2/second -j ACCEPT
[root@mail netfilter]# iptabels -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@mail netfilter]# iptables -t filter -A INPUT -m state --state INVALID -j DROP
[root@mail netfilter]# iptables -t filter -P INPUT DROP
FTP:
有主被动模式的区别(一下为被动模式):
[root@stu12 ~]# modprobe ip_nat_ftp
[root@stu12 ~]# iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
[root@stu12 ~]# iptabels -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
DNS:
[root@stu12 ~]# iptables -t filter -A INPUT -p tcp -d 1.1.1.1 --dport 53 -j ACCEPT
[root@stu12 ~]# iptables -t filter -A INPUT -p udp -d 1.1.1.1 --dport 53 -j ACCEPT
NFS:
nfs 服务端口是固定的分别是 111 2049。
但是: rquotad nlockmgr mountd 服务端口是随机的。由于端口是随机的,这导致防火墙无法设置。 这时需要配置/etc/sysconfig/nfs 使 rquotad nlockmgr mountd 的端口固定。
[root@stu12 ~]#vim /etc/sysconfig/nfs #修改对应行内容
13:RQUOTAD_PORT=10003
20:LOCKD_TCPPORT=10000
22:LOCKD_UDPPORT=10000
57:MOUNTD_PORT=10001
[root@stu12 ~]# service nfs restart
[root@stu12 ~]# iptables -t filter -A INPUT -p tcp --dport 111 -j ACCEPT
[root@stu12 ~]# iptables -t filter -A INPUT -p udp --dport 111 -j ACCEPT
[root@stu12 ~]# iptables -t filter -A INPUT -p tcp --dport 2049 -j ACCEPT
[root@stu12 ~]# iptables -t filter -A INPUT -p udp --dport 2049 -j ACCEPT
[root@stu12 ~]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p udp -m multiport --dports 111,2049,10000,10001,10003 -j ACCEPT
[root@stu12 ~]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp -m multiport --dports 111,2049,10000,10001,10003 -j ACCEPT
总结: 1、samba tcp 139/445 udp 137/138 2、ftp ip_nat_ftp 模块 + RELATED 状态 3、HTTP 80/443 4、SMTP 25 POP3 110 IMAP 143 POP3S 995 IMAPS 993 5、tftp 69
- 8:日志管理
1、rsyslog 服务记录日志 。 2、应用程序自己产生的日志(apache,mysql) 3、ELK rsyslog 的优点: 1、可以通过/etc/rsyslog.conf 指定日志存放位置(可以本地,也可以远程)undefined 2、可以结合 logrorate 截断日志 日志存放路径: /var/log
- 8.1:last相关日志
last #用于显示用户登录情况。
[root@linux-node1 ~]# ls /var/log/wtmp #last 读取的是这个日志文件
[root@linux-node1 ~]# last #大量信息输出
[root@linux-node1 ~]# > /var/log/wtmp
[root@linux-node1 ~]# last #清空后没有信息输出了
- 8.2:lastb相关日志
代码语言:javascript复制lastb用于查看ssh登陆失败的账号 命令:lastb,对应日志/var/log/btmp,一般来说,如果这个文件很大,考虑是否有暴力破解 一个运维人员习惯性动作: 登陆后:w命令 grep bash /etc/passwd #看看有没有多出来的用户 /tmp #有没有极其默认的文件,系统默认是定时清空的 拓展:tmpwatch,删除tmp目录下很久没有用过的文件
[root@linux-node1 ~]# rpm -ivh /media/Packages/tmpwatch-2.9.16-4.el6.x86_64.rpm
[root@linux-node1 ~]# tmpwatch -h
-a|-all 删除任何类型的文件
-m|-mtime 根据文件更改时间
-c|-ctime 根据文件更改状态时间
-f|-force 强制删除文件或目录,类似rm -f
-U|-exclude-user=USER|UID 排除某用户的文件
-x|-exclude=PATH 排除某路径
-v|-verbose 输出详细过程
-u|-atime 根据访问时间
代码语言:javascript复制Linux时间戳:ctime,mtime,atime ctime:文件改变时间(主要指文件属性) mtime:修改时间(主要指文件内容) atime:访问时间 改变和修改最区别的内容就是改变某个组件的标签,mtime是改变的内容 删除/tmp下5天前的文件 root@linux-node1 ~#tmpwatch -afv 5d /tmp/ tmpwatch定时清除任务:
[root@linux-node1 ~]# vim /etc/cron.daily/tmpwatch
#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix
-x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix
-X '/tmp/hsperfdata_*' 10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
if [ -d "$d" ]; then
/usr/sbin/tmpwatch "$flags" -f 30d "$d"
fi
done
这是一个每个30天清除的/tmp目录的计划任务
Kill非法登陆的链接,先查看当前登录在那个终端
[root@linux-node1 ~]# ps -aux | grep pts
------------------------------------------------------------------------------------
|Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ |
|root 2776 0.0 0.9 98384 4472 ? Ss 18:37 0:02 sshd: root@pts/2 |
|root 2778 0.0 0.3 108304 1940 pts/2 Ss 18:38 0:00 -bash |
|root 3360 0.0 0.2 110232 1176 pts/2 R 21:11 0:00 ps -aux |
|root 3361 0.0 0.1 103308 896 pts/2 S 21:11 0:00 grep pts |
------------------------------------------------------------------------------------
[root@linux-node1 ~]#kill -9 2776 #如果发现有非法的,直接kill掉
- 8.3:日志备份
代码语言:javascript复制日志备份: 情况 1: 对 rsyslog 来管理日志,可以进行远程日志备份。 情景 2: 对应用程序自己管理的日志,需要定期 scp 或 rsync 实现日志备份远程主机上。 日志截断: 思路,先备份,再清空,不用删除
[root@linux-node1 ~]# cp /var/log/secure data.sec
[root@linux-node1 ~]# > /var/log/secure