一、抓包工具,分析工具
抓包工具 :
tcpdump
格式 :
tcpdump [-AennqX] [-i 接口] [-w 储存档名] [-c 次数] [-r 档案] [所欲撷取的封包数据格式]
常用选项 :
-A :封包的内容以 ASCII 显示,通常用来捉取 WWW 的网页封包资料。
-e :使用资料连接层 (OSI 第二层) 的 MAC 封包数据来显示;
-nn:直接以 IP 及 port number 显示,而非主机名与服务名称
-q :仅列出较为简短的封包信息,每一行的内容比较精简
-X :可以列出十六进制 (hex) 以及 ASCII 的封包内容,对于监听封包内容很有用
-i :后面接要『监听』的网络接口,例如 eth0, lo, ppp0 等等的界面;
-w :如果你要将监听所得的封包数据储存下来,用这个参数就对了!后面接档名
-r :从后面接的档案将封包数据读出来。那个『档案』是已经存在的档案,
并且这个『档案』是由 -w 所制作出来的。
-c :监听的封包数,如果没有这个参数, tcpdump 会持续不断的监听,
直到使用者输入 [ctrl]-c 为止。
我们可以专门针对某些通讯协议或者是 IP 来源进行封包截取,那就可以简化输出的结果,并取得最有用的信息。常见的表示方法有:
'host foo', 'host 127.0.0.1' :针对单部主机来进行封包截取
'net 192.168' :针对某个网域来进行封包的截取;
'src host 127.0.0.1' 'dst net 192.168':同时加上来源(src)或目标(dst)限制
'tcp port 21':还可以针对通讯协议侦测,如 tcp, udp, arp, ether 等
还可以利用 and 与 or 来进行封包数据的整合显示呢!
1 )示例 :监测网卡eth0的封包信息
[root@test ~]# tcpdump -i eth0 -nn tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 09:15:43.969449 IP 192.168.0.120.22 > 192.168.0.116.50039: Flags [P.], seq 4182134245:4182134453, ack 2359223205, win 292, length 208 09:15:43.969809 IP 192.168.0.116.50039 > 192.168.0.120.22: Flags [.], ack 208, win 251, length 0 09:15:43.972277 IP 192.168.0.120.22 > 192.168.0.116.50039: Flags [P.], seq 208:496, ack 1, win 292, length 288 ......................中间省略................. ^C <==按下 [ctrl]-c 之后结束 952 packets captured <==截取到的封包数量 952 packets received by filter <==由过滤所得的总封包数量 0 packets dropped by kernel <==被核心所丢弃的封包
09:15:43.972277 IP 192.168.0.120.22 > 192.168.0.116.50039: Flags [P.], seq 208:496, ack 1, win 292, length 288 截取其中一条信息进行分析
09:15:43.972277 :这个是此封包被截取的时间,单位:时:分:秒的格式
IP :使用的通讯协议是IP
192.168.0.120.22 > :来源的IP是192.168.0.120,所使用的端口是22,> 代表传输的方向
192.168.0.116.50039 :目的的IP是192.168.0.116,所使用接收的端口是50039
[P.], seq 208:496 :封包带有 PUSH 的数据传输标志, 且传输的数据为整体数据的 196~472 byte
2 )示例:监测端口
[root@test ~]# tcpdump -i eth0 -nn port 22 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 09:49:43.323168 IP 192.168.0.120.22 > 192.168.0.116.50039: Flags [P.], seq 4182816229:4182816437, ack 2359228693, win 292, length 208 09:49:43.323587 IP 192.168.0.116.50039 > 192.168.0.120.22: Flags [.], ack 208, win 256, length 0 09:49:43.326386 IP 192.168.0.120.22 > 192.168.0.116.50039: Flags [P.], seq 208:496, ack 1, win 292, length 288
3 )示例:以十六进制显示监测的数据
[root@test ~]# tcpdump -i eth0 -nn port 22 -X -c 1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 09:55:47.264963 IP 192.168.0.120.22 > 192.168.0.116.50039: Flags [P.], seq 4188295253:4188295461, ack 2359246885, win 292, length 208 0x0000: 4510 00f8 c2b9 4000 4006 f4f9 c0a8 0078 E.....@[email protected] 0x0010: c0a8 0074 0016 c377 f9a4 5055 8c9f 4025 ...t...w..PU..@% 0x0020: 5018 0124 8327 0000 8578 31ae e713 1540 P..$.'...x1....@ 0x0030: 63d5 51cb 41e9 a67b 6ecd ab3b a8b3 3df7 c.Q.A..{n..;..=. 0x0040: 999a 4d66 abc8 9100 f000 4763 3851 fe84 ..Mf......Gc8Q.. 0x0050: 5d71 eb81 918b 0161 cc44 b9e7 5994 9fd7 ]q.....a.D..Y... 0x0060: bb3d e795 666e 277e c840 4500 ff1f 525b .=..fn'[email protected][ 0x0070: 2a11 46a0 8bb9 b10d dc69 6110 4658 b926 *.F......ia.FX.& 0x0080: 5246 f375 c8a8 b5d4 4161 e688 bcb5 4740 RF.u....Aa....G@ 0x0090: 386b 01b1 874f 6432 5b02 59f3 ce70 20ce 8k...Od2[.Y..p.. 0x00a0: 5604 7bc9 0a7e b593 bb66 8be9 3edc a047 V.{..~...f..>..G 0x00b0: 62bd fb58 1613 6458 80bd b632 00bc 4472 b..X..dX...2..Dr 0x00c0: 542e a051 7716 6ef8 d37a 6187 322e 23d5 T..Qw.n..za.2.#. 0x00d0: 9d80 4fb0 009a 1383 3313 3d74 e20a f263 ..O.....3.=t...c 0x00e0: fc2d 6c49 4305 509d 280b a54c 6059 4745 .-lIC.P.(..L`YGE 0x00f0: a8f5 6932 a5a0 aa24 ..i2...$ 1 packets captured 4 packets received by filter 0 packets dropped by kernel
分析工具 :
wireshark
二、iptables
1 )查看规则与策略
选项 :
-t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter
-L :列出目前的 table 的规则
-n :不进行 IP 与 HOSTNAME 的反查,显示讯息的速度会快很多!
-v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等
示例 :
[root@test ~]# iptables -nvL Chain INPUT (policy ACCEPT 42 packets, 3866 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 25 packets, 3048 bytes) pkts bytes target prot opt in out source destination
主要项目解释
target:代表进行的动作, ACCEPT 是放行,而 REJECT 则是拒绝,此外,尚有 DROP (丢弃) 的项目!
prot:代表使用的封包协议,主要有 tcp, udp 及 icmp 三种封包格式;
opt:额外的选项说明
source :代表此规则是针对哪个『来源 IP』进行限制?
destination :代表此规则是针对哪个『目标 IP』进行限制?
2 ) 对策略的修改
选项与参数:
-P :定义政策( Policy )。注意,这个 P 为大写啊!
ACCEPT :该封包可接受
DROP :该封包直接丢弃,不会让 client 端知道为何被丢弃。
示例 :
# iptables -P INPUT DROP # iptables -P OUTPUT ACCEPT # iptables -P FORWARD ACCEPT
3 ) 增加一条规则
[-AI 链名] 针对某的链进行规则的 "插入" 或 "累加"
-A :新增加一条规则,该规则增加在原本规则的最后面。例如原本已经有四条规则,
使用 -A 就可以加上第五条规则!
-I :插入一条规则。如果没有指定此规则的顺序,默认是插入变成第一条规则。
例如原本有四条规则,使用 -I 则该规则变成第一条,而原本四条变成 2~5 号
链 :有 INPUT, OUTPUT, FORWARD 等,此链名称又与 -io 有关
[-io 网络接口] 设定封包进出的接口规范
-i :封包所进入的那个网络接口,例如 eth0, lo 等接口。需与 INPUT 链配合;
-o :封包所传出的那个网络接口,需与 OUTPUT 链配合;
[-p 协议] 设定此规则适用于哪种封包格式,主要的封包格式有: tcp, udp, icmp 及 all
[-s 来源IP/网域] 来源 IP/网域:设定此规则之封包的来源项目,可指定单纯的 IP 或包括网域,例如:IP :192.168.0.100 网域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。
若规范为『不许』时,则加上 ! 即可,例如: -s ! 192.168.100.0/24 表示不允许192.168.100.0/24 之封包来源;
[-d 目标IP/网域] 同 -s ,只不过这里指的是目标的 IP 或网域
-j[ACCEPT|DROP|REJECT|LOG]后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)
[-s 来源IP/网域] [--sport 端口范围]
[-d 目标IP/网域] [--dport 端口范围] -j [ACCEPT|DROP|REJECT]
选项与参数:
--sport 端口范围:限制来源的端口号码,端口号码可以是连续的,例如 1024:65535
--dport 端口范围:限制目标的端口号码。
示例 :
# iptables -A -i eth0 INPUT -s 192.168.0.0/24 -p tcp -j ACCEPT
4 ) 删除规则
-D :删除动作
--line-numbers :显示规则编号
示例 :
# iptables -nvL --line-number <== 查看规则并显示编号 Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT all -- 192.168.1.0/24 0.0.0.0/0 2 DROP tcp -- 192.168.1.70 0.0.0.0/0 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination # iptables -D INPUT 2 <== 删除INPUT链中的规则2,
5 )规则相关的清除
选项与参数:
-F :清除所有的已订定的规则;
-X :杀掉所有使用者 "自定义" 的 chain (应该说的是 tables )
-Z :将所有的 chain 的计数与流量统计都归零
6 )iptables的保存,备份与恢复
① # /etc/init.d/iptables save <== 保存当前规则,使之生效;
② # iptables-save > ipt.rule <== 备份当前的规则,
# iptables-restore < ipt.rule <== 恢复当前的规则
③ # iptables -F <== 清空规则表,注:策略不会被清除
④ # /etc/init.d/iptables stop <== 停掉所有策略与规则
注意 :
主机规则设定流程 :
规则归零:清除所有已经存在的规则 (iptables -F...),最少是STOP掉服务
预设政策:除了 INPUT 这个自定义链设为 DROP 外,其他为预设 ACCEPT;
信任本机:由于 lo 对本机来说是相当重要的,因此 lo 必须设定为信任装置;
回应封包:让本机主动向外要求而响应的封包可以进入本机 (ESTABLISHED,RELATED)
信任用户:这是非必要的,如果你想要让区网的来源可用你的主机资源时
ICMP 封包规则的比对:针对是否响应 ping 来设计
# iptables -A INPUT -i eth0 -p icmp --icmp-type 8 -j ACCEPT
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?
# echo "1" > /proc/sys/net/ipv4/ip_forward <== 开启路由转发功能 # iptables -t nat -A POSTROUTING -s 172.16.10.0/24 -o eth0 -j MASQUERADE <== 执行转发规则