centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课
上半节课
tcpdump
tshark
selinux
strings命令
下半节课
iptables
crontab
Linux抓包工具
tcpdump
没有的话需要安装: yum install -y tcpdump
tcpdump 抓包工具 只有root用户才能使用, 一般只看数据流向 而不会实际保存包内容
否定操作 (`!' 或 `not')
与操作(`&&' 或 `and')
或操作(`||' 或 `or')
-nn :来源ip和目标ip都用数字显示 ,有时候排查问题需要用tcpdump: tcpdump -nn
-i :指定网卡 默认是第一个网卡
tcp/udp/icmp:指定协议
host:可以写源ip 也可以写目标ip
net: 指定一个网段 202.0.0.0
-X 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制和ASCII码形式打印出每个包的数据(但不包括连接层的头部).这对于分析一些新协议的数据包很方便: tcpdump -X -n -i eth1 'host 192.168.27.143'
-XX 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制和ASCII码形式打印出每个包的数据, 其中包括数据链路层的头部.这对于分析一些新协议的数据包很方便
抓多少个包后结束 -c 一般用在shell脚本 抓10个包: tcpdump -nn -i eth1 tcp and port and host 10.133.193.117 -c
and ,or 不加and表示or : tcpdump -nn -i eth1 tcp and port ; tcpdump -nn -i eth1 tcp port
port取反: tcpdump -nn -i eth0 tcp and host 192.168.0.1 and not port
保存包内容-w,直接ctrl+c停止: tcpdump -nn tcp and not port -c -w /tmp/l.txt
-s0 抓全部的包 -sv0 可视化: tcpdump -nn -i eth0 -s0 tcp and port
-v 详细输出: tcp -v udp port
-r 回放cap文件的内容,可以回放当时抓包时的情况,不用把cap文件放到windows下分析
截取本机(192.168.31.147)和主机114.114.114.114之间的数据: tcpdump -nn -i eth0 host 192.168.31.147 and 114.114.114.114
服务器有多个IP 可以使用参数: tcpdump -n -i eth0 dst 192.168.31.147 or 192.168.31.157
tcpdump tcp -i eth1 -t -s -c and dst port ! and src net 192.168.1.0/ -w ./target.cap
(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
(2)-i eth1 : 只抓经过接口eth1的包
(3)-t : 不显示时间戳
(4)-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
(5)-c 100 : 只抓取100个数据包
(6)dst port ! 22 : 不抓取目标端口是22的数据包
(7)src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
(8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析
只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到/tmp/1.cap文件中
tcpdump tcp and host 192.168.0.111 and port -s -c -w /tmp/.cap
回放target.cap文件里的内容
tcpdump -r ./target.cap
查ASCII码表得"GET+空"的十六进制是0x47455420,因此表达式应为tcp[20:4]=0x47455420,加上-A参数以ASCII码方式显示数据包。
tcpdump -i eth1 -n -A src host 192.168.1.0 and dst port and tcp[:]=0x47455420
Tcpdump,从入门到不放弃
https://cloud.tencent.com/developer/article/1005346
最好把数据包保存再拷出来,然后在Windows下用wireshark进行图形查看更好理解
查看http流量内容
tcpdump -Ann -i ens160 -s 'tcp port 8080 and dst host 192.168.1.50 and src host 192.168.10.18 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
tshark
tshark命令 wireshark Linux版 只有root用户才能执行 因为需要在内核里面执行一些操作
在linux下也可以安装 yum install -y wireshark
tshark -nn
抓包分析http请求,可以显示服务器的80端口的请求信息,类似访问日志:
tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"
有时间
有来源ip
有行为:get ,post
有请求域名
请求网址是什麽
# tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
Oct , ::06.576482113 10.xx receiver.barad.tencentyun.com POST /ca_report.cgi
Oct , ::07.576225904 10.1xx receiver.barad.tencentyun.com POST /ca_report.cgi
Oct , ::08.569742625 10.x receiver.barad.tencentyun.com POST /ca_report.cgi
查看指定端口的tcp流量内容
tshark -ni ens160 -R "tcp.dstport eq 8080"
selinux
selinux防火墙工具
getenforce:查状态
cat /etc/selinux/config
安装getenforce命令
rpm -qf `which getenforce`
yum install -y libselinux-utils
或
yum install -y *selinux*
setenforce 1/0
下半节课
iptables
4表5链
iptables设置完之后马上生效,不需要/etc/init.d/iptables restart
例如
#iptables -I OUTPUT -p icmp -d 14.215.177.38 -j DROP //马上生效
# ping 14.215.177.38
PING 14.215.177.38 (14.215.177.38) 56(84) bytes of data.
ping: sendmsg: 不允许的操作
ping: sendmsg: 不允许的操作
ping: sendmsg: 不允许的操作
^C
--- 14.215.177.38 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2693ms
但是设置完之后,一般要保存规则
/etc/init.d/iptables save
/etc/init.d/iptables restart
PING 14.215.177.38 (14.215.177.38) 56(84) bytes of data.
ping: sendmsg: 不允许的操作
ping: sendmsg: 不允许的操作
http://www.cnblogs.com/argb/p/3535179.html
iptables 具体实现防火墙的一个工具,iptables命令只有root用户才能执行
netfilter 模块-- iptables实现
查看规则,可以加-t 默认filter表,--line-numbers 规则前加上ID号: iptables -nvL -t filter --line-numbers
清除当前的规则,加-t 清空特定表规则 默认清除filter表: iptables -F
计数器清零: iptables -Z
-p 协议 如果指定了dport或sport一定要加上tcp协议或udp协议
--dport 目标端口 --dport 56788:56799
--sport 源端口 --sport 56788:56799
-t 规则表 不加t 默认加在filter表
-A 插入到最后
-I 插入到第一位 插队 先匹配
-D 删除规则
-R num:Replays替换/修改第几条规则 格式:iptables -R 3 …………
-i 入站网卡 一般PREROUTING,INPUT链只能用-i选项 FORWARD链既可以用-i选项 也可以同时用-o选项
-o 出站网卡 一般POSTROUTING ,OUTPUT链只能用-o选项
-s 来源ip
-d 目标ip
-j 动作 DROP/ACCEPT/REJECT/REDIRECT
! 非 iptables -A INPUT -p tcp --dport ! -j DROP 或 iptables -A INPUT -p ! tcp --dport -j DROP
forward链限制包使用的网卡: iptables -t filter -A FORWARD -p tcp -i eth2 -o eth1 --dport -j ACCEPT
80端口进来,9000端口出去: iptables -t nat -I PREROUTING -p tcp --dport -j REDIRECT --to-ports
增加/删除规则 -A: iptables -A/-D INPUT -s 10.72.11.12 -p tcp --sport -d 10.72.137.159 --dport -j DROP
插入规则 -I: iptables -I INPUT -s 1.1.1.1 -j DROP
添加一条ICMP规则: iptables -A INPUT -p icmp -j ACCEPT
根据规则的id号删除对应规则,需要加链表名: iptables -nvL --line-numbers ; iptables -D INPUT
设定默认规则,默认是ACCEPT ,一旦设定为DROP/DENY后,只能使用 iptables -P ACCEPT 才能恢复成原始状态,而不能使用-F参数 要加链表名: iptables -P INPUT DROP
在默认规则为DROP的时候,-F只是清空规则但是不能清空默认规则,除非停掉规则,加在crontab里面: service iptables stop
#清除用户自定义的chain/table: #iptables -X
#清除所有规则: #iptables -F
可以将 /etc/sysconfig/iptables-config 里面的IPTABLES_SAVE_ON_STOP="no" 改为IPTABLES_SAVE_ON_STOP="yes"
就可以在每次服务停前自动将保存现有规则
# Save current firewall rules on stop.
# Value: yes|no, default: no
# Saves all firewall rules to /etc/sysconfig/iptables if firewall gets stopped
# (e.g. on system shutdown).
IPTABLES_SAVE_ON_STOP="no"
iptables限制流量
iptables不能精确控制网速,只能控制包的个数,具体数据可以用mtu乘以包的个数计算,因为网络协议是双向的,即使配置是单向的,实际对流出和流入都有影响
流入和流出只是一个-s 和一个-d 不同
#限制流入方向
# 限定每秒只转发30个到达192.168.0.2的数据包(约每秒45KB 如果一个数据包是1.5KB)
iptables -A FORWARD -d 192.168.0.2 -m limit --limit 30/sec --limit-burst 30 -j ACCEPT
iptables -A FORWARD -d 192.168.0.2 -j DROP #这句作用是超过限制的到达192.168.0.2的数据包不通过)
#限制流出方向
# 限定每秒只转发30个离开192.168.0.2的数据包(约每秒45KB 如果一个数据包是1.5KB)
iptables -A FORWARD -s 192.168.0.2 -m limit --limit 30/sec --limit-burst 30 -j ACCEPT
iptables -A FORWARD -s 192.168.0.2 -j DROP #这句作用是超过限制的离开192.168.0.2的数据包不通过)
-m :加载模块,例如加载tcp模块,加载 state模块
state
此模块,当与连接跟踪结合使用时,允许访问包的连接跟踪状态。
--state state
这里state是一个逗号分割的匹配连接状态列表。可能的状态是:INVALID表示包是未知连接,ESTABLISHED表示是双向传送的连接,NEW表示包为新的连接,否则是非双向传送的,而RELATED表示包由新连接开始,但是和一个已存在的连接在一起,如FTP数据传送,或者一个ICMP错误
-m limit
处理IP碎片数量,防止攻击,允许每秒100个
limit
这个模块匹配标志用一个标记桶过滤器一一定速度进行匹配,它和LOG目标结合使用来给出有限的登陆数.当达到这个极限值时,使用这个扩展包的规则将进行匹配.(除非使用了"!"标记)
--limit rate
最大平均匹配速率:可赋的值有'/second','/minute','/hour',or '/day'这样的单位,默认是3/hour。
-m state: 启用状态匹配模块(state matching module)
–-state: 状态匹配模块的参数。当SSH客户端第一个数据包到达服务器时,状态字段为NEW;建立连接后数据包的状态字段都是ESTABLISHED
匹配扩展包-m 、--match
MATCH EXTENSIONS
iptables can use extended packet matching modules. These are loaded in
two ways: implicitly, when -p or --protocol is specified, or with the
-m or --match options, followed by the matching module name; after
these, various extra command line options become available, depending
on the specific module. You can specify multiple extended match mod-
ules in one line, and you can use the -h or --help options after the
module has been specified to receive help specific to that module.
The following are included in the base package, and most of these can
be preceded by a "!" to invert the sense of the match.
state的解析
[!] --state state
Where state is a comma separated list of the connection states
to match. Possible states are INVALID meaning that the packet
could not be identified for some reason which includes running
out of memory and ICMP errors which don’t correspond to any
known connection, ESTABLISHED meaning that the packet is associ-
ated with a connection which has seen packets in both direc-
tions, NEW meaning that the packet has started a new connection,
or otherwise associated with a connection which has not seen
packets in both directions, and RELATED meaning that the packet
is starting a new connection, but is associated with an existing
connection, such as an FTP data transfer, or an ICMP error.
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
如果这么写,前面应该会有一条iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
这样的话,第一个连接会比配NEW那个链,后续的包会匹配Related那个
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4189343&page=1#pid24461009
实例:
针对filter表,预设策略INPUT链DROP,其他两个链ACCEPT,然后针对192.168.0.0/24开通22端口,对所有网段开放80端口,对所有网段开放21端口。 脚本如下:
#! /bin/bash
ipt="/sbin/iptables"
$ipt -F; $ipt -P INPUT DROP; //INPUT链DROP
$ipt -P OUTPUT ACCEPT; $ipt -P FORWARD ACCEPT; //OUTPUT链和FORWARD ACCEPT
$ipt -A INPUT -s 192.168.0.0/ -p tcp --dport -j ACCEPT //对192.168.0.0/24 网段开通22端口
$ipt -A INPUT -p tcp --dport -j ACCEPT //对所有网段开放80端口
$ipt -A INPUT -p tcp --dport -j ACCEPT //对所有网段开放21端口
icmp的包有常见的应用,本机ping通外网,外网ping不通本机: iptables -I INPUT -p icmp --icmp-type -j DROP
nat表应用:
路由器就是使用iptables的nat原理实现
假设您的机器上有两块网卡eth0和eth1,其中eth0的IP为192.168.10.11,eth1的IP为172.16.10.11 。eth0连接了intnet 但eth1没有连接,现在有另一台机器(172.16.10.12)和eth1是互通的,那么如何设置也能够让连接eth1的这台机器能够连接intnet?
开启内核数据包转发
方法一
vi /etc/sysctl.conf
net.ipv4.ip_forward= sysctl -p sysctl -a |grep ip_forward
net.ipv4.ip_forward = 方法二
echo "" > /proc/sys/net/ipv4/ip_forward iptables -A POSTROUTING -t nat -s 172.16.10.0/ -o eth0 -j MASQUERADE
规则链的备份与恢复
备份
第一种
service iptables save 将内存中的规则刷入到 配置文件 /etc/sysconfig/iptables (写完规则记得马上保存一下规则表,没保存白干,
重启机器或重启iptables服务都会重新读取配置文件)
# cat /etc/sysconfig/iptables-config
#cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak
#service iptables save
#service iptables restart iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
第二种
将内存中的规则刷入到指定的文件: iptables-save > myipt.rule
恢复
恢复规则链 将备份的文件刷入回去 /etc/sysconfig/iptables 文件
第一种
恢复指定的规则: iptables-restore < myipt.rule
第二种
iptables-restore </etc/sysconfig/iptables.bak
filter 表:这个表主要用于过滤包的,是系统预设的表,内建三个链INPUT、OUTPUT以及FORWARD。INPUT作用于进入本机的包;OUTPUT作用于本机送出的包;FORWARD作用于那些跟本机无关的包。
nat 表:主要用处是网络地址转换、端口映射,也有三个链。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地址。POSTROUTING链在包就要离开防火墙之前改变其源地址。
INPUT链:针对入站规则,目标ip就是你自己,目标就是你自己,s:远程 d 本地
OUTPUT链:针对出站规则,如果发现自己机器变成肉鸡不断往外向公网某台机器的80端口发包,这时候需要设置OUTPUT链,s:本地 d 远程
firewalld服务
左边是centos6的iptables调用关系,右表是centos7的firewalld和iptables调用关系
crontab(Linux系统任务计划)
* * * * * /home/oracle/test.sh >/home/oracle/log.txt & 默认值为1,即和下面命令一致 默认值为1,即默认每分钟执行一次
/etc/crontab: cron的主配置文件,crontab的环境变量,可以定义PATH,如果crontab里面的命令不在PATH需要写绝对路径
每个用户自己的crontab
/var/spool/cron/root
/var/spool/cron/steven
/var/spool/cron/zhangli
cron格式如下:
# .----------------分钟 (0 - 59)
# | .------------- 小时 (0 - 23)
# | | .---------- 日 (1 - 31)
# | | | .------- 月 (1 - 12)
# | | | | .---- 周 (0 - 6) (周日=0 or 7)
# | | | | |
-----------------------------------------------------
格式:# * * * * *| user-name| command to be executed
cron 也是一个服务,所以需要先启动服务才能生效: service crond start; service crond status
安装
yum install -y vixie-cron
yum install -y crontabs
查看当前的crontab列表
# crontab -l
*/ * * * * /bin/bash /usr/sbin/ntpdate ntpupdate.tencentyun.com >/dev/null & //每二十分钟执行
*/ * * * * /bin/bash /usr/local/qcloud/stargate/admin/start.sh > /dev/null >& & //每一分钟执行 都是每分钟
#secu-tcs-agent monitor, install at Sun Oct :: CST
* * * * * /bin/bash /usr/local/sa/agent/secu-tcs-agent-mon-safe.sh > /dev/null >&1 //每一分钟执行 都是每分钟
备份特定用户的crontab列表
第一种方法:crontab -l >1.cronbak //要注意当前用户,如果当前是root用户,那么只保存root的crontab
第二种方法 :cat /var/spool/cron/root >1.cronbak //要备份steven用户,只需要cat /var/spool/cron/steven >1.cronbak
任务计划练习题:
注意:环境变量
注意:不要超出时间界限,比如一分钟只有60秒 30 */2 * * *
# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
minute (0 - 59)
hour (0 - 23)
day of month (1 - 31)
month (1 - 12) OR jan,feb,mar,apr ...
day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sa
基本格式 :
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
M: 分钟(0-59)。
H:小时(0-23)。
D:天(1-31)。
m: 月(1-12)。
d: 周(0~6,0为星期天)
# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
(default operation is replace, per 1003.2)
-e (edit user's crontab)
-l (list user's crontab)
-r (delete user's crontab)
-i (prompt before deleting user's crontab)
-s (selinux context)
#每30s执行一次的秘诀
*/1 * * * * date >> /tmp/date.log #每一分钟执行一次
*/1 * * * * sleep 30s;date >> /tmp/date.log #每一分30s执行一次
# tail -f /tmp/date.log
Mon Apr 27 06:35:01 CST 2015
Mon Apr 27 06:35:31 CST 2015
Mon Apr 27 06:36:01 CST 2015
#每月1、10、22日的4 : 45重启apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
#每周六、周日的1 : 10重启apache
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
#在每天18 : 00至23 : 00之间每隔30分钟重启apache
*/30,18-23 * * * /usr/local/etc/rc.d/lighttpd restart
#每一小时重启apache
0 */1 * * * /usr/local/etc/rc.d/lighttpd restart
#晚上11点到早上7点之间,每隔一小时重启apache
0 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
#每月的4号与每周一到周三的11点重启apache
0 11 4 */1 1-3 /usr/local/etc/rc.d/lighttpd restart
#一月一号的4点重启apache
0 4 1 1 * /usr/local/etc/rc.d/lighttpd restart
#每天早上7点执行一次 /bin/ls :
0 7 * * * /bin/ls
#在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :
0 6-12/3 * 12 * /usr/bin/backup
#周一到周五每天下午 5:00 寄一封信给 alex@domain.name :
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
#每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha" ,每月每天这句话是废的
20 0-4/2 * * * echo "haha"
#晚上11点到早上8点之间每两个小时,早上8点 11点到早上8点之间8<>23 7点
0 23-7/2,8 * * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 date
#1月1日早上4点
0 4 1 1 * date
0 */2 * * * 每2小时?
0 0 */2 * * 每2天?
0 0 0 0 */2 每2个星期?
最后一个不对
每两周可以用 0 0 */14 * *表示
注意 :
当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之
后加上 > /dev/null 2>&1 即可
要注意shell : /bin/sh、/bin/bash
不要加用户!! 例如root : 20 1 * * * root echo " " > /var/log/slow.log
腾讯云用的是/bin/sh
# ll /bin/sh
lrwxrwxrwx 1 root root 4 3月 10 2015 /bin/sh -> bash
anacron 即使关机也不会影响计划,cron关机之后会重新开始计划
ls /etc/anacrontab
# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/ # For details see man crontabs # Example of job definition:
# .---------------- minute ( - )
# | .------------- hour ( - )
# | | .---------- day of month ( - )
# | | | .------- month ( - ) OR jan,feb,mar,apr ...
# | | | | .---- day of week ( - ) (Sunday= or ) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
最好写一下英文注释
strings
strings命令在对象文件或二进制文件中查找可打印的字符串。
要搜索至少有 12 个字符的字符串,请输入:
strings - .txt
strings 命令显示:
1.17 com/cmd/scan/strings.c, cdmscan, bos320 5/7/92 10:21:20
标准输入
/usr/bin/strings
# strings - .txt
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
iptables图片
五条链四个表
详细文档:https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#USERLANDSTATES
http://blog.csdn.net/comchen/article/details/7772630
公司iptables脚本
注意:如果将iptables -A INPUT -j DROP写在最前面,那么iptables会drop所有包,后面有任何规则都不生效,要不设置默认规则为DROP,再设置后面的放行规则
touch /root/iptables.sh #!/bin/sh
iptables -F
iptables -X
iptables -t nat -F #ACCESS http
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport -j ACCEPT #ACCESS ftp
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT #ACCESS smtp
iptables -A INPUT -p tcp --dport -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.0/ -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT #ACCESS pop3
#iptables -A INPUT -p tcp --dport -s 127.0.0.1 -j ACCEPT
#iptables -A INPUT -p tcp --dport -s 192.168.1.0/ -j ACCEPT
#iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT
#iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT #ACCESS imap
iptables -A INPUT -p tcp --dport -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.0/ -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT #ACCESS mysql
iptables -A INPUT -p tcp --dport -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.0/ -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT #ACCESS redis
iptables -A INPUT -p tcp --dport -s 192.168.1.0/ -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT #ACCESS memcache
iptables -A INPUT -p tcp --dport -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.0/ -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT #ACCESS rabbitmq
iptables -A INPUT -p tcp --dport -s 192.168.1.0/ -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT iptables -A INPUT -p tcp --dport -s 192.168.1.0/ -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT iptables -A INPUT -p tcp --dport -s 192.168.1.0/ -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT iptables -A INPUT -p tcp --dport : -s 192.168.1.0/ -j ACCEPT #ACCESS rsync
iptables -A INPUT -p tcp --dport -s 192.168.1.100 -j ACCEPT #ACCESS rails
iptables -A INPUT -p tcp --dport -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.0/ -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT #ACCESS snmp
iptables -A INPUT -p udp --dport -s 192.168.1.0/ -j ACCEPT
iptables -A INPUT -p udp --dport -s 192.168.1.2 -j ACCEPT
iptables -A INPUT -p udp --dport -s 192.168.1.2 -j ACCEPT #ACCESS ssh
iptables -A INPUT -p tcp --dport -s 192.168.1.0/ -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT
iptables -A INPUT -p tcp --dport -s 192.168.1.2 -j ACCEPT #ACCESS ping
iptables -A INPUT -p icmp --icmp-type -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT iptables -I INPUT -s 192.168.1.2 -j DROP #ACCESS NAT
#iptables -t nat -A POSTROUTING -s 192.168.122.8 -o em3 -j SNAT --to-source 123.125.114.144
iptables -t nat -A POSTROUTING -o em1 -s 192.168.2.6/ -j MASQUERADE
iptables -t nat -A POSTROUTING -o em3 -s 192.168.2.1/ -j MASQUERADE
iptables -t nat -A POSTROUTING -o em3 -s 192.168.2.4/ -j MASQUERADE
iptables -t nat -A POSTROUTING -o em3 -s 192.168.2.8/ -j MASQUERADE
iptables -t nat -A PREROUTING -d 123.125.114.144 -p tcp -m tcp --dport -j DNAT --to-destination 192.168.2.1:
iptables -t nat -A PREROUTING -d 123.125.114.144 -p tcp -m tcp --dport -j DNAT --to-destination 192.168.2.4:
iptables -t nat -A PREROUTING -d 123.125.114.144 -p tcp -m tcp --dport -j DNAT --to-destination 192.168.2.8: #Deny all
iptables -A INPUT -j DROP /etc/init.d/iptables save
----------------------------------------------------------------------------------
---------------------------------------------------------------------------------
iptables指南示例脚本
https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#INCLUDE.RCFIREWALL 示例脚本的代码 I.. rc.firewall脚本代码 #!/bin/sh
#
# rc.firewall - Initial SIMPLE IP Firewall script for Linux 2.4.x and iptables
#
# Copyright (C) Oskar Andreasson <bluefluxATkoffeinDOTnet>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program or from the site that you downloaded it
# from; if not, write to the Free Software Foundation, Inc., Temple
# Place, Suite , Boston, MA - USA
# ###########################################################################
#
# . Configuration options.
# #
# 1.1 Internet Configuration.
# INET_IP="194.236.50.155"
INET_IFACE="eth0"
INET_BROADCAST="194.236.50.255" #
# 1.1. DHCP
# #
# 1.1. PPPoE
# #
# 1.2 Local Area Network configuration.
#
# your LAN's IP range and localhost IP. /24 means to only use the first 24
# bits of the bit IP address. the same as netmask 255.255.255.0
# LAN_IP="192.168.0.2"
LAN_IP_RANGE="192.168.0.0/16"
LAN_IFACE="eth1" #
# 1.3 DMZ Configuration.
# #
# 1.4 Localhost Configuration.
# LO_IFACE="lo"
LO_IP="127.0.0.1" #
# 1.5 IPTables Configuration.
# IPTABLES="/usr/sbin/iptables" #
# 1.6 Other Configuration.
# ###########################################################################
#
# . Module loading.
# #
# Needed to initially load modules
# /sbin/depmod -a #
# 2.1 Required modules
# /sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state #
# 2.2 Non-Required modules
# #/sbin/modprobe ipt_owner
#/sbin/modprobe ipt_REJECT
#/sbin/modprobe ipt_MASQUERADE
#/sbin/modprobe ip_conntrack_ftp
#/sbin/modprobe ip_conntrack_irc
#/sbin/modprobe ip_nat_ftp
#/sbin/modprobe ip_nat_irc ###########################################################################
#
# . /proc set up.
# #
# 3.1 Required proc configuration
#
开启内核数据包转发
方法一
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
sysctl -a |grep ip_forward
net.ipv4.ip_forward = 1
方法二
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "" > /proc/sys/net/ipv4/ip_forward #
# 3.2 Non-Required proc configuration
# #echo "" > /proc/sys/net/ipv4/conf/all/rp_filter
#echo "" > /proc/sys/net/ipv4/conf/all/proxy_arp
#echo "" > /proc/sys/net/ipv4/ip_dynaddr ###########################################################################
#
# . rules set up.
# ######
# 4.1 Filter table
# #
# 4.1. Set policies
# $IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP #
# 4.1. Create userspecified chains
# #
# Create chain for bad tcp packets
# $IPTABLES -N bad_tcp_packets #
# Create separate chains for ICMP, TCP and UDP to traverse
# $IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets #
# 4.1. Create content in userspecified chains
# #
# bad_tcp_packets chain
# $IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK \
-m state --state NEW -j REJECT --reject-with tcp-reset
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \
--log-prefix "New not syn:"
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP #
# allowed chain
# $IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP #
# TCP rules
# $IPTABLES -A tcp_packets -p TCP -s / --dport -j allowed
$IPTABLES -A tcp_packets -p TCP -s / --dport -j allowed
$IPTABLES -A tcp_packets -p TCP -s / --dport -j allowed
$IPTABLES -A tcp_packets -p TCP -s / --dport -j allowed #
# UDP ports
# #$IPTABLES -A udp_packets -p UDP -s / --destination-port -j ACCEPT
#$IPTABLES -A udp_packets -p UDP -s / --destination-port -j ACCEPT
$IPTABLES -A udp_packets -p UDP -s / --destination-port -j ACCEPT
$IPTABLES -A udp_packets -p UDP -s / --destination-port -j ACCEPT #
# In Microsoft Networks you will be swamped by broadcasts. These lines
# will prevent them from showing up in the logs.
# #$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d $INET_BROADCAST \
#--destination-port : -j DROP #
# If we get DHCP requests from the Outside of our network, our logs will
# be swamped as well. This rule will block them from getting logged.
# #$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d 255.255.255.255 \
#--destination-port : -j DROP #
# ICMP rules
# $IPTABLES -A icmp_packets -p ICMP -s / --icmp-type -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s / --icmp-type -j ACCEPT #
# 4.1. INPUT chain
# #
# Bad TCP packets we don't want.
# $IPTABLES -A INPUT -p tcp -j bad_tcp_packets #
# Rules for special networks not part of the Internet
# $IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT #
# Special rule for DHCP requests from LAN, which are not caught properly
# otherwise.
# $IPTABLES -A INPUT -p UDP -i $LAN_IFACE --dport --sport -j ACCEPT #
# Rules for incoming packets from the internet.
# $IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED \
-j ACCEPT
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets #
# If you have a Microsoft Network on the outside of your firewall, you may
# also get flooded by Multicasts. We drop them so we do not get flooded by
# logs
# #$IPTABLES -A INPUT -i $INET_IFACE -d 224.0.0.0/ -j DROP #
# Log weird packets that don't match the above.
# $IPTABLES -A INPUT -m limit --limit /minute --limit-burst -j LOG \
--log-level DEBUG --log-prefix "IPT INPUT packet died: " #
# 4.1. FORWARD chain
# #
# Bad TCP packets we don't want
# $IPTABLES -A FORWARD -p tcp -j bad_tcp_packets #
# Accept the packets we actually want to forward
# $IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT #
# Log weird packets that don't match the above.
# $IPTABLES -A FORWARD -m limit --limit /minute --limit-burst -j LOG \
--log-level DEBUG --log-prefix "IPT FORWARD packet died: " #
# 4.1. OUTPUT chain
# #
# Bad TCP packets we don't want.
# $IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets #
# Special OUTPUT rules to decide which IP's to allow.
# $IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT #
# Log weird packets that don't match the above.
# $IPTABLES -A OUTPUT -m limit --limit /minute --limit-burst -j LOG \
--log-level DEBUG --log-prefix "IPT OUTPUT packet died: " ######
# 4.2 nat table
# #
# 4.2. Set policies
# #
# 4.2. Create user specified chains
# #
# 4.2. Create content in user specified chains
# #
# 4.2. PREROUTING chain
# #
# 4.2. POSTROUTING chain
# #
# Enable simple IP Forwarding and Network Address Translation
# $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP #
# 4.2. OUTPUT chain
# ######
# 4.3 mangle table
# #
# 4.3. Set policies
# #
# 4.3. Create user specified chains
# #
# 4.3. Create content in user specified chains
# #
# 4.3. PREROUTING chain
# #
# 4.3. INPUT chain
# #
# 4.3. FORWARD chain
# #
# 4.3. OUTPUT chain
# #
# 4.3. POSTROUTING chain
#
iptables深入解析-应用层插件篇
在Linux的防火墙体系Netfilter下有一个独立的模块L7 filter
#iptables -t nat -A POSTROUTING -m layer7 --17proto qq -j DROP
http://blog.chinaunix.net/uid-20786208-id-5157053.html
ip地址在线计算器 子网掩码计算器
http://www.ab126.com/goju/1840.html
NETMASK='255.255.192.0'
TCP,UDP,ICMP,FTP网络知识
https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#TABLE.DESTINATIONLOCALHOST
连接关闭后,进入TIME_WAIT状态,缺省时间是2分钟。之所以留这个时间,是为了让数据包能完全通过 各种规则的检查,也是为了数据包能通过拥挤的路由器,从而到达目的地。
如果连接是被RST包重置的,就直接变为CLOSE了。这意味着在关闭之前只有10秒的默认时间。RST包是不 需要确认的,它会直接关闭连接。针对TCP连接,还有其他一些状态我们没有谈到。下面给出一个完整的状 态列表和超时值。
从上图可以看出,以用户的角度考虑,UDP连接的建立几乎与TCP的一样
当UDP连接遇到问题时,同样会有相应的ICMP信息返回,当然它们的状态也是RELATED
ICMP:主机向目标发送一个回显请求,防火墙就认为这个包处于NEW状态。 目标回应一个回显应答,防火墙就认为包处于ESTABLISHED了
以上各种情况包括TCP,UDP,ICMP,请求被认为NEW,应答是ESTABLISHED。 换句话说,就是当防火墙看到一个请求包时,就认为连接处于NEW状态,当有应答 时,就是ESTABLISHED状态。
注意,应答包必须符合一定的标准,连接才能被认作established的,每个传输类型都是这样
conntrack机制并不知道如何处理某个特殊的协议,尤其是在它不了解这个协议或不知道协议如何 工作时,比如,NETBLT,MUX还有EGP。这种情况下,conntrack使用缺省的操作。这种操作很象对UDP连接的 操作,就是第一个包被认作NEW,其后的应答包等等数据都是 ESTABLISHED。
Conntrack helper即可以被静态地编译进内核,也可以作为模块,但要用下面的命令装载:
modprobe ip_conntrack_*
6.4.3. 显式匹配
显式匹配必须用-m或--match装载,比如要使用状态匹配 就必须使用-m state。有些匹配还需要指定协议,有些就不需要,比如连接状态就 不要。这些状态是NEW(还未建立好的连接的第一个包), ESTABLISHED(已建立的连接,也就是已经在内核里注册过的),RELATED(由 已经存在的、处于已建立状态的连接生成的新连接),等等。有些匹配还处在开发阶段,或者还只是为了说 明iptables的强大能力。这说明不是所有的匹配一开始就是实用的,但以后你可能会用到它。随着iptables 新版本的发布,会有一些新的匹配可用。隐含匹配和显式匹配最大的区别就是一个是跟随协议匹配自动装载 的,一个是显式装载的。
6.4.3.1. Limit match
这个匹配操作必须由-m limit明确指定才能使用。有了它的帮助,就可以对指定 的规则的日志数量加以限制,以免你被信息的洪流淹没哦。比如,你可以事先设定一个限定值,当符合条件 的包的数量不超过它时,就记录;超过了,就不记录了。我们可以控制某条规则在一段时间内的匹配次数 (也就是可以匹配的包的数量),这样就能够减少DoS syn flood攻击的影响。这 是它的主要作用,当然,还有很多其他作用(译者注:比如,对于某些不常用的服务可以限制连接数量,以 免影响其他服务)。limit match也可以用英文感叹号取反,如:-m limit ! --limit 5/s表示在数量超过限定值后,所有的包都会被匹配。
6.4.3.6. State match
状态匹配扩展要有内核里的连接跟踪代码的协助,因为它是从连接跟踪机制中得到包的状态的。这样我 们就可以了解连接所处的状态。它几乎适用于所有的协议,包括那些无状态的协议,如ICMP和UDP。针对每 个连接都有一个缺省的超时值,如果连接的时间超过了这个值,那么这个连接的记录就被会从连接跟踪的记 录数据库中删除,也就是说连接就不再存在了。这个match必须有-m state作为前提 才能使用。状态机制的详细内容在章节状态机制 中。
指定要匹配包的的状态,当前有4种状态可用:INVALID,ESTABLISHED,NEW和RELATED。 INVALID意味着这个包没有已知的流或连接与之关 联,也可能是它包含的数据或包头有问题。ESTABLISHED意思是包是完全有效的,而 且属于一个已建立的连接,这个连接的两端都已经有数据发送。NEW表示包将要或已 经开始建立一个新的连接,或者是这个包和一个还没有在两端都有数据发送的连接有关。RELATED说明包正在建立一个新的连接,这个连接是和一个已建立的连接相关的。比 如,FTP data transfer,ICMP error 和一个TCP或UDP连接相关。注意NEW状态并不在试图建立新连接的TCP包里寻找SYN标 记,因此它不应该不加修改地用在只有一个防火墙或在不同的防火墙之间没有启用负载平衡的地方。具体如 何使用,你就再看看章节状态机制吧:)
6.5.4. LOG target
这个target是专门用来记录包地有关信息的。这些信息可能是非法的,那就可以用来除错。LOG会返回包 的有关细节,如IP头的大部分和其他有趣的信息。这个功能是通过内核的日志工具完成的,一般是syslogd。返回的信息可用dmesg阅读,或者可以直接查看syslogd的日志文件,也可以用其他的什么程序来看。LOG对调试规则有很大的帮助,你 可以看到包去了哪里、经过了什么规则的处理,什么样的规则处理什么样的包,等等。当你在生产服务器上 调试一个不敢保证100%正常的规则集时,用LOG代替DROP是比较好的(有详细的信息可看,错误就容易定 位、解决了),因为一个小小的语法错误就可能引起严重的连接问题,用户可不喜欢这样哦。如果你想使用 真正地扩展日志地话,可能会对ULOG target有些兴趣,因为它可以把日志直接记录 到MySQL databases或类似的数据库中。
注意,如果在控制台得到的信息不是你想要的,那不是iptables或Netfilter的问题,而是 syslogd 配置文件的事,这个文件一般都是/etc/syslog.conf。有关这个问题的更多信息请查通过man syslog.conf查看。
f
f
f
f
f
f
f
f
f
http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html
-v选项 详细打印选项: tcpdump -v
如果-v 标志被多次重复给出(nt: 如-vv), tcpdump会显示更加详细的信息.
SMB/CIFS 解码
tcpdump 已可以对SMB/CIFS/NBT相关应用的数据包内容进行解码(nt: 分别为'Server Message Block Common', 'Internet File System'
'在TCP/IP上实现的网络协议NETBIOS的简称'. 这几个服务通常使用UDP的137/138以及TCP的139端口). 原来的对IPX和NetBEUI SMB数据包的
解码能力依然可以被使用(nt: NetBEUI为NETBIOS的增强版本).
tcpdump默认只按照最简约模式对相应数据包进行解码, 如果我们想要详尽的解码信息可以使用其-v 启动选现. 要注意的是, -v 会产生非常详细的信息,
比如对单一的一个SMB数据包, 将产生一屏幕或更多的信息, 所以此选项, 确有需要才使用.
关于SMB数据包格式的信息, 以及每个域的含义可以参看www.cifs.org 或者samba.org 镜像站点的pub/samba/specs/ 目录. linux 上的SMB 补丁
(nt | rt: patch)由 Andrew Tridgell (tridge@samba.org)提供.
NFS 请求和回应
tcpdump对Sun NFS(网络文件系统)请求和回应的UDP数据包有如下格式的打印输出:
src.xid > dst.nfs: len op args
src.nfs > dst.xid: reply stat len op results
以下是一组具体的输出数据
sushi.6709 > wrl.nfs: 112 readlink fh 21,24/10.73165
wrl.nfs > sushi.6709: reply ok 40 readlink "../var"
sushi.201b > wrl.nfs:
144 lookup fh 9,74/4096.6878 "xcolors"
wrl.nfs > sushi.201b:
reply ok 128 lookup fh 9,74/4134.3150
第一行输出表明: 主机sushi向主机wrl发送了一个'交换请求'(nt: transaction), 此请求的id为6709(注意, 主机名字后是交换
请求id号, 而不是源端口号). 此请求数据为112字节, 其中不包括UDP和IP头部的长度. 操作类型为readlink(nt: 即此操作为读符号链接操作),
操作参数为fh 21,24/10.73165(nt: 可按实际运行环境, 解析如下, fd 表示描述的为文件句柄, 21,24 表示此句柄所对应设
备的主/从设备号对, 10表示此句柄所对应的i节点编号(nt:每个文件都会在操作系统中对应一个i节点, 限于unix类系统中),
73165是一个编号(nt: 可理解为标识此请求的一个随机数, 具体含义需补充)).
第二行中, wrl 做了'ok'的回应, 并且在results 字段中返回了sushi想要读的符号连接的真实目录(nt: 即sushi要求读的符号连接其实是一个目录).
第三行表明: sushi 再次请求 wrl 在'fh 9,74/4096.6878'所描述的目录中查找'xcolors'文件. 需要注意的是, 每行所显示的数据含义依赖于其中op字段的
类型(nt: 不同op 所对应args 含义不相同), 其格式遵循NFS 协议, 追求简洁明了.
如果tcpdump 的-v选项(详细打印选项) 被设置, 附加的信息将被显示. 比如:
sushi.1372a > wrl.nfs:
148 read fh 21,11/12.195 8192 bytes @ 24576
wrl.nfs > sushi.1372a:
reply ok 1472 read REG 100664 ids 417/0 sz 29388
(-v 选项一般还会打印出IP头部的TTL, ID, length, 以及fragmentation 域, 但在此例中, 都略过了(nt: 可理解为,简洁起见, 做了删减))
在第一行, sushi 请求wrl 从文件 21,11/12.195(nt: 格式在上面有描述)中, 自偏移24576字节处开始, 读取8192字节数据.
Wrl 回应读取成功; 由于第二行只是回应请求的开头片段, 所以只包含1472字节(其他的数据将在接着的reply片段中到来, 但这些数据包不会再有NFS
头, 甚至UDP头信息也为空(nt: 源和目的应该要有), 这将导致这些片段不能满足过滤条件, 从而没有被打印). -v 选项除了显示文件数据信息, 还会显示
附加显示文件属性信息: file type(文件类型, ''REG'' 表示普通文件), file mode(文件存取模式, 8进制表示的), uid 和gid(nt: 文件属主和
组属主), file size (文件大小).
如果-v 标志被多次重复给出(nt: 如-vv), tcpdump会显示更加详细的信息.
必须要注意的是, NFS 请求包中数据比较多, 如果tcpdump 的snaplen(nt: 抓取长度) 取太短将不能显示其详细信息. 可使用
'-s 192'来增加snaplen, 这可用以监测NFS应用的网络负载(nt: traffic).
NFS 的回应包并不严格的紧随之前相应的请求包(nt: RPC operation). 从而, tcpdump 会跟踪最近收到的一系列请求包, 再通过其
交换序号(nt: transaction ID)与相应请求包相匹配. 这可能产生一个问题, 如果回应包来得太迟, 超出tcpdump 对相应请求包的跟踪范围,
该回应包将不能被分析.
IP 数据包破碎
(nt: 指把一个IP数据包分成多个IP数据包)
碎片IP数据包(nt: 即一个大的IP数据包破碎后生成的小IP数据包)有如下两种显示格式.
(frag id:size@offset+)
(frag id:size@offset)
(第一种格式表示, 此碎片之后还有后续碎片. 第二种格式表示, 此碎片为最后一个碎片.)
id 表示破碎编号(nt: 从下文来看, 会为每个要破碎的大IP包分配一个破碎编号, 以便区分每个小碎片是否由同一数据包破碎而来).
size 表示此碎片的大小 , 不包含碎片头部数据. offset表示此碎片所含数据在原始整个IP包中的偏移((nt: 从下文来看,
一个IP数据包是作为一个整体被破碎的, 包括头和数据, 而不只是数据被分割).
每个碎片都会使tcpdump产生相应的输出打印. 第一个碎片包含了高层协议的头数据(nt:从下文来看, 被破碎IP数据包中相应tcp头以及
IP头都放在了第一个碎片中 ), 从而tcpdump会针对第一个碎片显示这些信息, 并接着显示此碎片本身的信息. 其后的一些碎片并不包含
高层协议头信息, 从而只会在显示源和目的之后显示碎片本身的信息. 以下有一个例子: 这是一个从arizona.edu 到lbl-rtsg.arpa
途经CSNET网络(nt: CSNET connection 可理解为建立在CSNET 网络上的连接)的ftp应用通信片段:
arizona.ftp-data > rtsg.1170: . 1024:1332(308) ack 1 win 4096 (frag 595a:328@0+)
arizona > rtsg: (frag 595a:204@328)
rtsg.1170 > arizona.ftp-data: . ack 1536 win 2560
有几点值得注意:
第一, 第二行的打印中, 地址后面没有端口号.
这是因为TCP协议信息都放到了第一个碎片中, 当显示第二个碎片时, 我们无法知道此碎片所对应TCP包的顺序号.
第二, 从第一行的信息中, 可以发现arizona需要向rtsg发送308字节的用户数据, 而事实是, 相应IP包经破碎后会总共产生512字节
数据(第一个碎片包含308字节的数据, 第二个碎片包含204个字节的数据, 这超过了308字节). 如果你在查找数据包的顺序号空间中的
一些空洞(nt: hole,空洞, 指数据包之间的顺序号没有上下衔接上), 512这个数据就足够使你迷茫一阵(nt: 其实只要关注308就行,
不必关注破碎后的数据总量).
一个数据包(nt | rt: 指IP数据包)如果带有非IP破碎标志, 则显示时会在最后显示'(DF)'.(nt: 意味着此IP包没有被破碎过).
时间戳
tcpdump的所有输出打印行中都会默认包含时间戳信息.
时间戳信息的显示格式如下
hh:mm:ss.frac (nt: 小时:分钟:秒.(nt: frac未知, 需补充))
此时间戳的精度与内核时间精度一致, 反映的是内核第一次看到对应数据包的时间(nt: saw, 即可对该数据包进行操作).
而数据包从物理线路传递到内核的时间, 以及内核花费在此包上的中断处理时间都没有算进来.
限制同一个时刻同一个来源ip只能有3个ssh连接到服务器 这里数量要谨慎,比如原来已经有3个ssh连接了,这时候第4个要进来,必须前3个其中一个直接 点击xshell的关闭按钮才行,connlimit有个好处就是当第4个ssh连接进来不管杀掉之前的3个ssh连接
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
第一句话:当有ssh连接进来服务器的时候他会记录到sshuser这个表
第二句话:检查这个新的ssh连接来源是否已经在sshuser这个表中,如果已经在sshuser这个表中,并且60秒之内建立了3个连接,那么将这个ssh连接来源的所有ssh连接拒绝,意思就是,如果尾号111这个ip之前已经有3个ssh连接到155这个服务器,那么当它发起第4个ssh连接,服务器会断开它的所有ssh连接,包括前面的3个已建立连接,在一分钟之后解除,一般--update 和--seconds --hitcount 连用
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name sshuser --set
iptables -A INPUT -m recent --update --name sshuser --seconds 60 --hitcount 3 -j DROP
记录日志
iptables -A INPUT -m recent --update --name sshuser --seconds 60 --hitcount 3 -j LOG --log-prefix '/root/sshattack'
connlimit模块和recent模块的--hitcount一般是互拆的
用了connlimit模块就没有必要用recent模块的--hitcount
f