WireShark学习之抓取和分析HTTP数据包

1. 设置过滤条件

指定网络协议http

未分类

2. 打开Chrome浏览器输入网址

在浏览器输入https://sspai.com/post/30292

未分类

3. 在抓获得包中得到两个数据包,分别是HTTP请求以及HTTP响应

未分类

4. 双击打开 GET /30292 HTTP/1.1

未分类

5. 对Http协议包进行分析

HTTP请求消息头

  • Accept:call服务器,可以接收文件、网页和图片。
  • Accept-Charset:所接收的字符编码。
  • Accept-Encoding:可接收()压缩后的数据。
  • Accept-Language:Browser支持中、英文。
  • Host:要找的主机是。
  • If-Modified-Since:告诉服务器我们的缓冲中有这个资源文件,该文件的时间是,,
  • Referer:告诉服务器,我来自哪里。
  • User-Agent:告诉服务器,Browser内核。
  • Cookie:
  • Connection:保持连续发完信息后,我不关闭连接。
  • Date:Browser发送时间。

未分类

6. 查看Tcp流-Follow TCP Stream

未分类

未分类

7. 分析三次握手

三次握手的原理

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

下图转自百度百科:

未分类

  • Wireshark中三次握手的具体情形

未分类

8. 总结

这些操作分为两步,第一步设置合理的过滤条件,第二步在任意数据包中选择Follow TCP Stream 。

OpenResty + Varnish Cache 实现 WP 的高性能加载教程

前言

Varnish Cache 是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台 Varnish 代替了原来的 12 台 Squid,性能比以前更好。(超级老的梗了,但是就这么用吧。)

Varnish Cache 在高端 WordPress 托管上也是非常常见的,由其构成的 Web 服务缓存加速解决方案已经非常成熟了,不过由于其开发者在 HTTPS 问题上并不关切所以很多人又抛弃了它采用了其他方案,不过前面也有提到 Varnish Cache 成熟、稳定,所以尽管不支持 HTTPS,我们也可以再加一层 Nginx 来反代实现 HTTPS。

介绍

Varnish Cache 的开发公司 Varnish Software 从 V5 时代开始了全新的命名方式,我们常提到的 Varnish 由 Varnish-Cache 的命名方式代替。

常见的 Varnish Cache 缓存规则从 V4 开始已经不同于 V3 了,不过 V5 依旧向下兼容 V4 的规则。

本教程主要介绍和前面的 https://www.mf8.biz/the-guide-for-wordpress-ubuntu/ 相呼应。

具体的教程可以参考:https://www.mf8.biz/varnish-wordpress-make-fast-1/

安装 Varnish 5

curl -s https://packagecloud.io/install/repositories/varnishcache/varnish5/script.deb.sh | bash
apt-get install varnish

更多系统的安装请看:

https://www.varnish-cache.org/releases/index.html https://packagecloud.io/varnishcache/varnish5/install

设置 Nginx

编辑虚拟主机的配置文件,将之前的 80 端口内容改成 8080 端口,其实就是将 listen 后改成 8080 ,例如:

  server {
  ##运行端口
  listen 8080; 

  ##这里需要改成你的域名
  server_name www.mf8.biz; 

  access_log /data/wwwlogs/access_nginx.log combined; #日志目录
  root /data/wwwroot/build; #网站文件目录
  index index.html index.htm index.php; #首页文件优先级
  include /usr/local/openresty/nginx/conf/rewrite/wordpress.conf;

  ##PHP
  location ~ [^/].php(/|$) {
      fastcgi_pass unix:/run/php/php7.1-fpm.sock;
      fastcgi_index index.php;
      include fastcgi.conf;
      fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/:/proc/";
    }

  ##下面的都是缓存
  location ~ .*.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
    expires 30d;
    access_log off;
    }
  location ~ .*.(js|css)?$ {
    expires 7d;
    access_log off;
    }
  location ~ /.ht {
    deny all;
    }
  }

同理,/usr/local/openresty/nginx/conf/nginx.conf 文件也必须将之前的 80 端口改成 8080 端口,其他所有在 Nginx 上打开的 80 端口都需要修改,不然 Varnish 无法启动。

然后将 HTTPS 部分,改成反代:

    server {

  ##开启 HTTPS 和 HTTP/2
  listen 443 ssl http2;

  ssl_certificate /usr/local/openresty/nginx/conf/ssl/www.mf8.biz.crt; #RSA证书
  ssl_certificate_key /usr/local/openresty/nginx/conf/ssl/www.mf8.biz.key; #RSA密钥

  ##SSL增强安全设置部分
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 10m;
  ssl_session_cache builtin:1000 shared:SSL:10m;
  ssl_buffer_size 1400;
  ssl_stapling on;
  ssl_stapling_verify on;

  server_name www.mf8.biz;
  access_log off;

        location / {
            proxy_pass http://127.0.0.1:80;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;
            proxy_set_header X-Forwarded-Port 443;
            proxy_set_header Host $host;
        }
}

设置 Varnish

cd /etc/varnish/
mv default.vcl default.vclold
git clone https://gitee.com/mf8/varnish-caching-wordpress.git

cd /lib/systemd/system/
mv varnish.service varnish.service.old
wget https://gitee.com/yunvy/codes/d79nhgw2aitm8xky65p4399/raw?blob_name=varnish.service

cd /etc/default
mv varnish varnish.old
wget https://gitee.com/yunvy/codes/folh28bm9ipveagc04ws740/raw?blob_name=varnish

systemctl daemon-reload
service varnish restart

设置 WordPress

不过呢,由于我们是 Nginx HTTPS 443 端口 —— Varnish 80 端口 —— Nginx 80 端口 饶了三层,所以 WP 就会反应不过来,所有的静态资源的加载依旧走的 HTTP ,这里就需要额外设置一下了。

修改 wp-config.php 文件,加入:

if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')  $_SERVER['HTTPS']='on';

因为我们在 Nginx 443 反代的时候加入了 proxy_set_header X-Forwarded-Proto https; ,所以当 WP 检测 HTTP_X_FORWARDED_PROTO 有 https 反馈的时候就会将静态资源的加载自动走 HTTPS 了!

CentOS-7.0.中安装与配置Tomcat-7的方法

安装说明

  • 安装环境:CentOS-7.0.1406
  • 安装方式:源码安装
  • 软件:apache-tomcat-7.0.29.tar.gz
  • 下载地址:http://tomcat.apache.org/download-70.cgi

安装前提

系统必须已安装配置JDK6+

安装tomcat

将apache-tomcat-7.0.29.tar.gz文件上传到/usr/local中执行以下操作:

代码如下:

[root@linuxidc local]# cd /usr/local
[root@linuxidc local]# wget http://apache.fayea.com/apache-mirror/tomcat/tomcat-7/v7.0.57/bin/apache-tomcat-7.0.57.tar.gz
[root@linuxidc local]# tar -zxv -f apache-tomcat-7.0.29.tar.gz // 解压压缩包
[root@linuxidc local]# rm -rf apache-tomcat-7.0.29.tar.gz // 删除压缩包
[root@linuxidc local]# mv apache-tomcat-7.0.29 tomcat

启动Tomcat

执行以下操作:

代码如下:

[root@linuxidc ~]# /usr/local/tomcat/bin/startup.sh //启动tomcat
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.7.0/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

出现以上信息说明已成功启动。

防火墙开放8080端口

增加8080端口到防火墙配置中,执行以下操作:

[root@linuxidc ~]# vi + /etc/sysconfig/iptables
#增加以下代码
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT

重启防火墙

[root@linuxidc java]# service iptables restart

检验Tomcat安装运行

通过以下地址查看tomcat是否运行正常:

http://192.168.15.231:8080/

看到tomcat系统界面,说明安装成功!

停止Tomcat

[root@linuxidc ~]#  /usr/local/tomcat/bin/shutdown.sh  //停止tomcat

Tcpdump命令的使用与示例

网络数据采集分析工具TcpDump的简介

  顾名思义,TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。tcpdump就是一种免费的网络分析工具,尤其其提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的FreeBSD系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。

  我们用尽量简单的话来定义tcpdump,就是:dump the traffice on a network.,根据使用者的定义对网络上的数据包进行截获的包分析工具。作为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的东西之一。tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的FreeBSD系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。

网络数据采集分析工具TcpDump的使用

普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。

# tcpdump tcpdump: listening on fxp011:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 5011:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43 0000 0000 0080 0000 1007 cf08 0900 0000 0e80 0000 902b 4695 0980 8701 0014 0002 000f 0000 902b 4695 0008 0011:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97 ffff 0060 0004 ffff ffff ffff ffff ffff 0452 ffff ffff 0000 e85b 6d85 4008 0002 0640 4d41 5354 4552 5f57 4542 0000 0000 0000 00^C

  tcpdump支持相当多的不同参数,如使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,使用-c参数指定要监听的数据包数量,使用-w参数指定将监听到的数据包写入文件中保存,等等。

  然而更复杂的tcpdump参数是用于过滤目的,这是因为网络中流量很大,如果不加分辨将所有的数据包都截留下来,数据量太大,反而不容易发现需要的数据包。使用这些参数定义的过滤规则可以截留特定的数据包,以缩小目标,才能更好的分析网络中存在的问题。tcpdump使用参数指定要监视数据包的类型、地址、端口等,根据具体的网络问题,充分利用这些过滤规则就能达到迅速定位故障的目的。请使用man tcpdump查看这些过滤规则的具体用法。

  显然为了安全起见,不用作网络管理用途的计算机上不应该运行这一类的网络分析软件,为了屏蔽它们,可以屏蔽内核中的bpfilter伪设备。一般情况下网络硬件和TCP/IP堆栈不支持接收或发送与本计算机无关的数据包,为了接收这些数据包,就必须使用网卡的混杂模式,并绕过标准的TCP/IP堆栈才行。在FreeBSD下,这就需要内核支持伪设备bpfilter。因此,在内核中取消bpfilter支持,就能屏蔽tcpdump之类的网络分析工具。

  并且当网卡被设置为混杂模式时,系统会在控制台和日志文件中留下记录,提醒管理员留意这台系统是否被用作攻击同网络的其他计算机的跳板。

May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled

  虽然网络分析工具能将网络中传送的数据记录下来,但是网络中的数据流量相当大,如何对这些数据进行分析、分类统计、发现并报告错误却是更关键的问题。网络中的数据包属于不同的协议,而不同协议数据包的格式也不同。因此对捕获的数据进行解码,将包中的信息尽可能的展示出来,对于协议分析工具来讲更为重要。昂贵的商业分析工具的优势就在于它们能支持很多种类的应用层协议,而不仅仅只支持tcp、udp等低层协议。

  从上面tcpdump的输出可以看出,tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。FreeBSD提供的一个有效的解码程序为tcpshow,它可以通过Packages Collection来安装。

# pkg_add /cdrom/packages/security/tcpshow*# tcpdump -c 3 -w tcpdump.outtcpdump: listening on fxp0# tcpshow < tcpdump.out---------------------------------------------------------------------------Packet 1TIME:12:00:59.984829LINK:00:10:7B:08:3A:56 -> 01:80:C2:00:00:00 type=0026<*** No decode support for encapsulated protocol ***>---------------------------------------------------------------------------Packet 2TIME:12:01:01.074513 (1.089684)LINK:00:A0:C9:AB:3C:DF -> FF:FF:FF:FF:FF:FF type=ARPARP:htype=Ethernet ptype=IP hlen=6 plen=4 op=requestsender-MAC-addr=00:A0:C9:AB:3C:DF sender-IP-address=202.102.245.3target-MAC-addr=00:00:00:00:00:00 target-IP-address=202.102.245.3---------------------------------------------------------------------------Packet 3TIME:12:01:01.985023 (0.910510)LINK:00:10:7B:08:3A:56 -> 01:80:C2:00:00:00 type=0026<*** No decode support for encapsulated protocol ***>

  tcpshow能以不同方式对数据包进行解码,并以不同的方式显示解码数据,使用者可以根据其手册来选择最合适的参数对截获的数据包进行分析。从上面的例子中可以看出,tcpshow支持的协议也并不丰富,对于它不支持的协议就无法进行解码。

  除了tcpdump之外,FreeBSD的Packages Collecion中还提供了Ethereal和Sniffit两个网络分析工具,以及其他一些基于网络分析方式的安全工具。其中Ethereal运行在X Window 下,具有不错的图形界面,Sniffit使用字符窗口形式,同样也易于操作。然而由于tcpdump对过滤规则的支持能力更强大,因此系统管理员仍然更喜欢使用它。对于有经验的网络管理员,使用这些网络分析工具不但能用来了解网络到底是如何运行的,故障出现在何处,还能进行有效的统计工作,如那种协议产生的通信量占主要地位,那个主机最繁忙,网络瓶颈位于何处等等问题。因此网络分析工具是用于网络管理的宝贵系统工具。为了防止数据被滥用的网络分析工具截获,关键还是要在网络的物理结构上解决。常用的方法是使用交换机或网桥将信任网络和不信任网络分隔开,可以防止外部网段窃听内部数据传输,但仍然不能解决内部网络与外部网络相互通信时的数据安全问题。如果没有足够的经费将网络上的共享集线器升级为以太网交换机,可以使用FreeBSD系统执行网桥任务。这需要使用option BRIDGE编译选项重新定制内核,此后使用bridge命令启动网桥功能。

tcpdump采用命令行方式,它的命令格式为:

tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]          [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]          [ -T 类型 ] [ -w 文件名 ] [表达式 ]

  
(1) tcpdump的选项介绍

  • -a    将网络地址和广播地址转变成名字;
       
  • -d    将匹配信息包的代码以人们能够理解的汇编格式给出;
       
  • -dd    将匹配信息包的代码以c语言程序段的格式给出;
       
  • -ddd   将匹配信息包的代码以十进制的形式给出;
       
  • -e    在输出行打印出数据链路层的头部信息;
       
  • -f    将外部的Internet地址以数字的形式打印出来;
       
  • -l    使标准输出变为缓冲行形式;
       
  • -n    不把网络地址转换成名字;
       
  • -t    在输出的每一行不打印时间戳;
       
  • -v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服
    务类型的信息;
       
  • -vv    输出详细的报文信息;
       
  • -c    在收到指定的包的数目后,tcpdump就会停止;
       
  • -F    从指定的文件中读取表达式,忽略其它的表达式;
       
  • -i    指定监听的网络接口;
       
  • -r    从指定的文件中读取包(这些包一般通过-w选项产生);
       
  • -w    直接将包写入文件中,并不分析和打印出来;
       
  • -T    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议;)
      
    (2) tcpdump的表达式介绍

  表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会被截获。在表达式中一般如下几种类型的关键字。

  第一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.

  第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。

  第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是”ether”的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。
  除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是 ‘not ‘ ‘! ‘, 与运算是’and’,’&&’;或运算 是’or’ ,’││’;这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。

  A、想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
#tcpdump host 210.27.48.1
  B、想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令:(在命令行中适用   括号时,一定要
#tcpdump host 210.27.48.1 and (210.27.48.2 or 210.27.48.3 )
  C、如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
  D、如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
#tcpdump tcp port 23 host 210.27.48.1
  
(3) tcpdump的输出结果介绍

  
下面我们介绍几种典型的tcpdump命令的输出信息

  A、数据链路层头信息

使用命令

#tcpdump --e host ice

ice 是一台装有linux的主机,她的MAC地址是0:90:27:58:AF:1A
H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;上一条命令的输出结果如下所示:

21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ice.telne
t 0:0(0) ack 22535 win 8760 (DF)

  分析:21:50:12是显示的时间, 847509是ID号,eth0 < 表示从网络接口eth0 接受该数据包,eth0 >表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 > ice.telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535 表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.

  B、ARP包的TCPDUMP输出信息
  
使用命令

#tcpdump arp

得到的输出结果是:

22:32:42.802509 eth0 > arp who-has route tell ice (0:90:27:58:af:1a)

22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)分析: 22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该数据包, arp表明是ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:58:af:1a是主机ICE的MAC地址。

  C、TCP包的输出信息

用TCPDUMP捕获的TCP包的一般输出信息是:

src > dst: flags data-seqno ack window urgent options

src > dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (FIN), P (PUSH) , R (RST) “.” (没有标记); data-seqno是数据包中的数据的顺序号, ack是下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针. Options是选项.

  D、UDP包的输出信息
  
用TCPDUMP捕获的UDP包的一般输出信息是:

route.port1 > ice.port2: udp lenth

UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机ICE的port2端口,类型是UDP, 包的长度是lenth。

Linux下通过SSH实现服务器间简单的分发文件与执行命令

SSH介绍

SSH服务由服务端软件OpenSSH(openssl)和客户端(常见的有SSH(linux),SecureCRT,xshell,Putty)组成,SSH服务默认使用22端口提供服务,它有两个不兼容的SSH协议版本,分别是1.x和2.x.

SSH 1.x协议存在被黑客针对联机的Key pair插入恶意程序代码的风险,而SSH 2.x针对这个问题,多加了一个确认联机正确性的Diffie-Hellman机制,每次数据传输中,都会以该机制检查输出来源是否正确.

SSH的服务认证类型主要分为:

  • 基于口令的安全认证
  • 基于密钥的安全认证:首先建立一对密钥对,把公钥(public key)放在需要访问的目标服务器上.另外还需要吧私有密钥(private key)放到SSH的客户端或对应的客户端服务器上.

SSH的操作命令

SSH连接其他服务器

ssh -p22 [email protected] #被连接的主机

SSH通过远程连接执行命令

ssh -p22 [email protected] /sbin/ifconfig eht0

ssh 链接主机记录信息位置

~/.ssh/known_hosts

ssh客户端文件拷贝至远端服务器

可以通过 -l 参数限制传输速度.

scp -P22 -rp /tmp/oldboy [email protected]:/tmp/oldboy #方向由左至右

sftp功能?(不要用)

sftp无法显示登陆用户的目录,可以随时跳到别的目录

sftp -oPort=55555 [email protected]
get(download) put(upload)

实现SSH密钥批量分发

#确认系统版本信息
cat /etc/redhat-release
uname -r
uname -m
#添加批量分发账号
useradd fenfa (所有计算器创建分发账号)
echo 123456|passwd --stdin fenfa
#分发账号需要sudo授权rsync
echo "fenfa ALL=(ALL) NOPASSWD: /usr/bin/rsync" >>/etc/sudosers
visudo -c
#生成密钥对
ssh-keygen -t dsa
#查看密钥对
ls -l .ssh/
#分发密钥
ssh-copy-id -i .ssh/id_dsa.pub "-p [email protected]"
#测试
ssh -p55555 [email protected] /sbin/ifconfig

增量,加密传输文件:

rsync -avz hosts -e 'ssh -p55555' [email protected]:~

简单文件批量分发脚本(有待修改)

#!/bin/sh
. /etc/init.d/functions
if [ $# -ne 2 ]
then
echo "USAGE:/bin/sh $0 localfile remotedir"
exit 1
fi
for n in 1 2 3
do
scp -P55555 -r ~/$1 [email protected].$n:~ &>dev/null &&
ssh -p55555 -t [email protected].$n sudo rsync ~/$1 $2 &>/dev/null
if [ $? -eq 0 ]
then
action "fenfa $1 192.$n is ok" /bin/true
else
action "fenfa $1 192.$n is false" /bin/false
fi
done

简单的批量查看脚本

#!/bin/sh
if [ $# -ne 1 ]
then
echo "USAGE:$0 COMMAND"
exit 1
fi
for n in 1 2 3
do
echo ============192.168.117.$n========
ssh -p55555 [email protected].$n $1
done

非交互式生成密钥并实现批量管理

1、为所有机器创建传输用用户及密码

useradd key888
echo 123456|passwd --stdin key888
id key888
echo "key888 ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers 
visudo -c
su - key888

2、管理机创建密钥对

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1

3、分发密钥

yum install expect -y #只安装在管理机
ssh-copy-id -i.ssh/id_dsa.pub "-p 52113 [email protected]"

4、此处需要三个脚本实现

fenfa_auto.sh

ssh_expect.exp

~/intall.sh

vi ssh_expect.exp
#!/usr/bin/expect
if { $argc != 2 }{
send_user "usage: expect ssh_expect.exp file hostn"
exit
}
#define var
set file [lindex $argv 0]
set host [lindex $argv 1]
set password "123456"
#spawn scp /etc/hosts [email protected]:/etc/hosts
#spawn scp -P55555 $file kendally@$host:$dirn
spawn ssh-copy-id -i $file "-p 55555 key888@host"
expect {
"yes/no"   {send "yes/r";exp_continue}
"*password"{send "$passwordr"}
}
expect eof
exit -onexit {
send_user "kendall say good bye to you!n"
}
#script usage
#expect kendall-6.exp file host 
#expaple
#expect ssh_expect.exp file host 
#expect ssh_expect.exp ~/.ssh/id_dsa.pub 172.16.1.31
vi fenfa_auto.sh
#!/bin/sh
. /etc/init.d/functions
shh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
if [ $? -eq 0 ];then
action "ccreat dsa $ip" /bin/true
else
action "create dsa $ip" /bin/false
exit 1
fi
for ip in 8 31 41
do
expect ssh_expect.exp ~/.ssh/id_dsa.pub 172.16.1.$ip >dev/null 2>&1
if [ $? -eq 0 ];then
action "$ip" /bin/true
else
action "$ip" /bin/false
fi
done
#dis fenfa scripts
for m in 8 31 41
do
scp -P55555 -rp ~/scripts [email protected].$m:~
done
#install service
for n in 8 31 41
do
ssh -t -p55555 [email protected].$n sudo /bin/bash ~/scripts/install.sh
done
vim intall.sh
yum install httpd -y

SSH反向连接及Autossh

简介

接触Linux恐怕对SSH再熟悉不过了,还有scp,sftp各种方便的功能,一般的使用都需要ip:port(如果不是默认22的话),但有些情况比较特殊,就是想连接一台内网主机(比如公司内网,当然你肯定做不了Port Forwarding,除非你想在公司防火墙上拆个洞)。稍懂一点网络的童鞋会明白,Internet上去主动连接一台内网是不可能的,一般的解决方案分两种,一种是端口映射(Port Forwarding),将内网主机的某个端口Open出防火墙,相当于两个外网主机通信;另一种是内网主机主动连接到外网主机,又被称作反向连接(Reverse Connection),这样NAT路由/防火墙就会在内网主机和外网主机之间建立映射,自然可以相互通信了。但是,这种映射是NAT路由自动维持的,不会持续下去,如果连接断开或者网络不稳定都会导致通信失败,这时内网主机需要再次主动连接到外网主机,建立连接。

环境

A要控制B

A主机:外网,ip:123.123.123.123,sshd端口:2221

B主机:内网,sshd端口:2223

无论是外网主机A,还是内网主机B都需要跑ssh daemon

一、使用SSH方式连接

1.1 首先在B上执行

$ ssh -NfR 1234:localhost:2223 [email protected] -p2221

这句话的意思是将A主机的1234端口和B主机的2223端口绑定,相当于远程端口映射(Remote Port Forwarding)。

这里每次需要输入A主机user1的登陆密码,后面会讲到解决办法。

1.2 这时在A主机上sshd会listen本地1234端口

$ ss -ant
State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port
LISTEN     0      128               127.0.0.1:1234                     *:*

1.3 像平时一样连接到A主机的1234端口就可以控制内网B主机了

$ ssh localhost -p1234

二、使用Autossh方式

一开始提到,这种反向连接(Reverse Connection)不稳定,可能随时断开,需要内网主机B再次向外网A发起连接,这时需要个“朋友”帮你在内网B主机执行这条命令。它就是Autossh。

在此之前还要解决之前的一个问题,那就是每次内网主机B连接外网主机A时都需要输入密码,这个问题ssh本身是提供另外一种验证方式——通过密钥验证用户身份,实现自动登录。

2.1 在内网B主机上生产公钥和私钥

$ ssh-keygen
...(一直按Enter,最后在~/.ssh/下生成密钥)
$ ls ~/.ssh/
id_rsa id_rsa.pub known_hosts

2.2 复制B主机上生成的id_rsa.pub公钥到外网A主机上,并将内容加入到~/.ssh/authorized_keys中

$ cat id_rsa.pub >> ~/.ssh/authorized_keys

试下,内网B主机连接外网A主机,就不再输入密码验证了

补充:今天了解到ssh-copy-id这个命令,上面这个操作就变的简单了

$ ssh-copy-id [email protected]

2.3 再来看看Autossh的用法

$ autossh -M 5678 -NR 1234:localhost:2223 [email protected] -p2221

比之前的命令添加的一个-M 5678参数,负责通过5678端口监视连接状态,连接有问题时就会自动重连,去掉了一个-f参数,因为autossh本身就会在background运行。

三、终极方案:当重启内网B主机,谁来自动Autossh呢,加入daemon吧

以daemon方式执行,相当于root去执行autossh, ssh,这时刚才普通用户目录下的.ssh/authorized_keys文件会不起效。有两种办法解决,一种是用autossh的参数指定.ssh路径;另外一种是以普通用户身份执行daemon,下面是第二种方式。

/bin/su -c '/usr/bin/autossh -M 5678 -NR 1234:localhost:2223 [email protected] -p2221' - user1

autossh还有很多参数,用来设置重连间隔等等。

将上面命令放入下面各启动方式中,根据自己系统自己配置:

  • SysV:/etc/inid.d/autossh

  • Upstart: /etc/init/autossh.conf

  • systemd: /usr/lib/systemd/system/autossh.service

用啥ngrok,用ssh解决大局域网反向端口转发问题

自从家里换了联通光纤后,联通就在我家宽带出口前搭了一个路由器,我家也彻底沦为192.168.1.0/24段的局域网了,带来的问题就是在外网无法访问家里的路由器。这对于刷了LEDE,有时候需要从外网直接管理使用路由器的我,觉得难受极了。周末有空,干脆解决这个问题。

在这之前,了解过一个ngrok项目,用于将局域网内的某一个地址的端口,映射到公网。但是研究了一下该软件,发现其在LEDE的源中,并不包含,我又是个懒的去编译的程序员,因此想看看有没有其他办法。

研究一下,发现其实程序员必备的SSH就有这个功能。SSH一共支持三种端口转发:

  • 本地端口转发:就是客户端方的某个端口和服务器某个端口相连,这样访问客户端该端口,就相当于访问服务器端某个端口

  • 远程端口转发:还是把客户端方的某个端口和服务器某个端口相连,只不过反向的,访问服务器端某个端口,就相当于访问到了客户端该端口

  • 动态转发:SOCKS5代理模式,不多说了

更具体一些,可以参见这篇文章:https://blog.twofei.com/528/

回到我的需求,我是希望访问VPS的某个端口,就相当于访问路由器的指定端口。比如我访问VPS的2222,就相当于访问路由器的22端口。所以是第二种:远程端口转发

SSH做起来非常简单,首先,修改VPS端/etc/ssh/sshd_config加入GatewayPorts yes。据说,不这样外网无法访问转发的端口,未验证。然后路由器一条命令搞定:

ssh -f -NR "*:2222:localhost:22" user@vps  

这样子,访问VPS的2222端口,就直接访问到了路由器

进化一:持久

用ssh命令有个问题,因为各种因素,它可能会莫名挂掉,网络不好啦,网络干扰啦,网络xxx啦,总归都是网络问题。因此,我们得祭出神奇autossh。在LEDE的包中,默认就有,安装之,爱死LEDE。在这之前,自己搞定SSH的密钥登录哦,否则autossh起来,也会卡在输入密码。 autossh在LEDE的配置文件是/etc/config/autossh,配置一下

config autossh 'ssh'  
    option gatetime '0'
    option monitorport '20000'
    option poll '600'
    option ssh '-p 22 -NR *:2222:localhost:22 user@vps'

然后开启autossh

进化二:隐藏

在我家的运营商,我发现了一个问题,如果你ssh启动一段时间后,到目的地址的网络丢包就开始大量出现。思来想去,把ssh塞到ssr-tunnel中不就完事了。

先建立一个到VPS的22端口的ssr-tunnel隧道

ssr-tunnel -c /var/etc/shadowsocksr.json -l 2222 -L VPS:22 -f /tmp/ssr-tunnel.pid >> /tmp/ssr-tunnel.log  

这样,访问本机的2222端口,就相当于走ssr流量访问远端的22端口。把autossh的配置稍微改一下,让其访问本机2222端口

config autossh 'ssh'  
    option gatetime '0'
    option monitorport '20000'
    option poll '600'
    option ssh '-p 2222 -NR *:2222:localhost:22 vpsuser@localhost'

为了让ssr-tunnel隧道保持运行,需要搞个监控。不需要很复杂,放到crontab里就可以了

ps | grep [s]sr-tunnel || `ssr-tunnel -c /var/etc/shadowsocksr.json -l 2222 -L vps:22 -f /tmp/ssr-tunnel.pid >> /tmp/ssr-tunnel.log`  

进化三:多射

映射了第一个端口,你就想再来一个。什么aria2映射出来,就可以做外网离线下载。其实也蛮简单的,因为autossh支持多端口映射

config autossh 'ssh'  
    option gatetime '0'
    option monitorport '20000'
    option poll '600'
    option ssh '-p 2222 -NR *:2222:localhost:22 -NR *:6800:localhost:6800 vpsuser@localhost'

这样就把aria2的6800也映射出来了

就这样,结束了.

related post: http://briteming.blogspot.com/2016/04/ngrok.html

SSH的三种端口转发(Port forwarding)/ 隧道协议概要

用SSH有一段时间了,自认为对ssh的操作还是有一定的了解。而今天我要介绍的是ssh的三种端口转发(隧道协议、Tunnel、Port forwarding)功能的使用与它们的使用场合。

为什么要用ssh的端口转发功能,我想大家一定明白(不明白也无所谓,既然来到了这里,你肯定是想把它弄明白的!)。一来是为了安全(数据加密传输);二来是为了突破(穿越)某些防火墙对某些主机的访问限制。

据我所知,SSH一共提供了 3 种端口转发,分别是本地转发(-L参数)、远程转发(-R参数)和动态转发(-D参数)。接下来我就一一介绍这几种不同的转发方式的使用。我尽量简明扼要地叙述主题重点,让人一看就学会(回忆起)该如何操作。

本文用到的一些“术语”和约定

既然提到转发,就应该明白:这是三台主机之间要合作干的事。不然为何不两台主机直连,而要通过第三者转发?
本地主机:形式为IP或域名,你当前正在使用的这台机器;
远程主机:形式与本地主机一样。这里的“远程”并不是指实际的距离有多远,准确地说是“另一台”;

本地转发

本地转发,顾名思义(有点)就是把本地主机端口通过待登录主机端口转发到远程主机端口上去。

本地转发通过参数 -L 指定,格式:-L [本地主机:]本地主机端口:远程主机:远程主机端口。加上ssh待登录主机,这里就有了三台主机。

举例:ssh -L 50000:www.google.com:80 user@host。例中本地主机、远程主机和待登录主机分别用颜色红绿蓝标识。

当成功执行上面的命令之后,访问本地的50000端口,就等同于访问 www.google.com 的 80 端口。但和直接访问有着本质的区别:这次是通过登录主机来安全转发数据的,没有人知道你和远程主机之间传输了何种数据。就算你不能和远程主机建立连接(而登录主机能访问),那就能突破(绕过)(防火墙的)限制。

但本例其实举得不够好。就算你能访问 www.google.com,你却依然不能其它主机,甚至是 google域 的另一台主机,比如 plus.google.com。想要更全面的端口转发功能,还需动态转发。

远程转发

远程转发是指把登录主机端口通过本地主机端口转发到远程主机。
远程转发通过参数 -R 指定,格式:-R [登录主机:]登录主机端口:远程主机:远程主机端口。

举例:ssh -R 0.0.0.0:8080:localhost:80 user@host。

当成功执行上面的命令之后,访问登录主机的 8080 端口就相当于访问 localhost:80!

不要小看这个例子,它可是有相当有用。我书读得多,不会骗你 ????
设想这样一种情况(其实这种情况太普遍了):你在本机开发了一个web应用,想拿给别人测试,但现在你却处在内网,外网是无法直接访问内网的主机的,怎么办!?很多人可能会说,找台有公网IP的主机,重新部署一下就行了。这样可行,但太麻烦。然而自从你了解了ssh的远程转发之后,一切都变得简单了。只需在本地主机上执行一下上面例子的命令即可实现外网访问内网的web应用,相信我,我经常就这样干,屡试不爽。这简直是太好了,awesome! 让你从此对ssh爱不释手。

动态转发

相对于本地转发和远程转发的单一端口转发模式而言,动态转发有点更加强劲的端口转发功能,即是无需固定指定被访问目标主机的端口号。这个端口号需要在本地通过协议指定,该协议就是简单、安全、实用的 SOCKS 协议。FQ(你懂的)就靠她了!

动态转发通过参数 -D 指定,格式:-D [本地主机:]本地主机端口。相对于前两个来说,动态转发无需再指定远程主机及其端口。它们由通过 SOCKS协议 连接到本地主机端口的那个主机(peer,比如最常见的浏览器)指定(此属协议内容,无需深究)。

举例:ssh -D 50000 user@host。

当成功执行上面这个命令后。通过协议告诉你要访问的远程主机及端口,然后你与目标主机之间的数据就通过登录主机安全地传输了。

最常见的用途:FQ(大家都懂的)。在浏览器中设置代理类型为 SOCKS(5),主机及端口:127.0.0.1:50000。然后 gg/ytb/tt/fb 等就一丝不挂地摆在眼前了!

ssh 隐藏版本号

在openssh的源码文件中。

出现有一个sshd.c的文件,用vi sshd.c打开这个文件,找到这一条语句:

snprintf(buf, sizeof buf, “SSH-%d.%d-%.100sn”, major, minor, SSH_VERSION);

将其修改成:

snprintf(buf, sizeof buf, “goodbye”);

然后再使用下面使命令安装openssh

./configure -prefix=/opt/ssh -sysconfdir=/etc/ssh
make
make install

安装完成之后,执行下面命令:

/opt/ssh/sbin/sshd

然后,你在其他机器上使用如下命令:

telnet SSH服务器IP地址 22

此时就只显示goodbye啦。

以上操作在Redhat EL AS4中测试过,不过在安装openssh时需要一些库文件支持,以上只是个人的做法,仅供参考。

Centos 7搭建、配置和使用Http代理(Squid服务器)

一、前言

最近搞了一台腾讯云内网服务器(把公网带宽调到了0Mbps),为了使内网服务器也能连上外网,稍微折腾了一下下Http代理。

本文以Squid代理服务器为栗子,简单介绍一下基本用法

二、安装Squid服务器

首先,在一台能同时连接公网和内网服务器的服务器上安装Squid代理服务器

yum install squid -y

然后就安装完了,是不是很简单呢(鬼才懒得编译呢)

三、配置Squid服务器

主要需要配置的是三个部分:

1、配置允许使用代理的IP地址

#此处使用10.0.0.0/16代表的是,整个10.0.x.x IP段都能使用(x代表任意255内的数字)
acl localnet src 10.0.0.0/16

#如果是限定单个IP使用,则是10.0.0.1/32
acl localnet src 10.0.0.1/32

2、配置允许访问的IP列表

第一个步骤是将10.0.0.0/16整个IP段命名标记为localnet,现在要将localnet添加进允许使用的列表中

#此处代表允许访问的列表包括localhost、manager、localnet三个IP段
http_access allow localhost manager localnet

3、配置Squid监听地址

这个步骤是为了进一步加强安全措施,防止代理服务器被滥用(盗用)

#最简便的规则,监听所有IP的3128端口,不安全,不建议使用
http_port 0.0.0.0:3128

#仅监听内网IP的3128端口,相对安全,建议使用
http_port 10.0.0.1:3128

四、使用代理

1、yum代理

#编辑/etc/yum.conf文件
vim /etc/yum.conf

#查找并修改或追加以下语句(将10.0.0.1修改为你的Squid配置的监听地址或服务器的IP):

proxy=http://10.0.0.1:3128/ 

2、wget代理

#编辑/etc/wgetrc文件
vim /etc/wgetrc

#查找并修改或追加以下语句(将10.0.0.1修改为你的Squid配置的监听地址或服务器的IP):

http_proxy=http://10.0.0.1:3128/
ftp_proxy=http://10.0.0.1:3128/

3、环境变量

#编辑/etc/profile文件
vim /etc/profile

#查找并修改或追加以下语句(将10.0.0.1修改为你的Squid配置的监听地址或服务器的IP):

http_proxy=http://10.0.0.1:3128/
ftp_proxy=http://10.0.0.1:3128/

export http_proxy
export ftp_proxy

squid+stunnel为docker配置代理服务器

目地

为k8s的docker服务提供http/https代理,解决docker无法pull gcr.io/google_containers 谷歌镜像问题

环境

  • GCE ubuntu 16.04
  • k8s集群机器 ubuntu16.04

简要步骤

一、GCE 搭建squid正向http/https代理服务器

1. 直接使用apt-get install 安装

apt-get install squid3 -y

注意:配置文件在/etc/squid或/etc/squid3下,根据系统不同可能会有一点差异,由于这里进行快速安装,不需要暴露端口给外部使用,也不需要密码,所以配置文件我这里保持默认

二、GCE 安装stunnel代理服务器

1. stunnel主要用来在GCE和k8s机器上代理的数据传输进行加密,否则明文传输很快会被GFW拦截.注意stunnel分为服务端和客户端,GCE上安装服务端,在k8s集群上安装客户端

2. 直接使用apt-get install 安装服务端

apt-get install stunnel4 -y

如果遇到

  • 正试图覆盖 /etc/ppp/ip-down.d,它同时被包含于软件包 resolvconf 1.78ubuntu2
  • dpkg-deb:错误:子进程 粘贴 被信号(断开的管道) 终止了

使用dpkg强制覆盖安装:

cd /var/cache/apt/archives
dpkg -i --force-overwrite xxx.deb

编辑配置文件 vim /etc/stunnel/stunnel.conf

client = no #是否为客户端 这里是服务端填写no
[squid]
accept = 65501
connect = 127.0.0.1:3128 #本地squid服务地址
cert = /etc/stunnel/stunnel.pem #下一步生成的证书地址

openssl生成证书,用户stunnel加密解密

openssl genrsa -out key.pem 2048
openssl req -new -x509 -key key.pem -out cert.pem -days 1095
cat key.pem cert.pem >> /etc/stunnel/stunnel.pem

注意:创建证书时,系统会要求您提供一些国家/地区信息,可随便输入,但是当被要求输入“Common Name”时,您必须输入正确的hostname或IP地址(VPS),我这里输入的ip地址。

通过配置/etc/default/stunnel4文件启用自动启动,vim /etc/default/stunnel4

#将ENABLED更改为1:

ENABLED=1

重新启动Stunnel使配置生效,使用以下命令:

/etc/init.d/stunnel4 restart

三、K8S 集群机器分别搭建stunnel

1. 安装步骤几乎和上面相同

2. scp或其他方法把证书拷贝到k8s集群中

3. 配置文件不同(注意不要#号,systemctl status stunnel4.service)

cert = /etc/stunnel/stunnel.pem #和服务端完全相同的证书
client = yes #声明为客户端
[squid]
accept = 127.0.0.1:65502 #本地代理的端口,即为http/https代理地址
connect = {GCE_IP}:65501 #GCE 服务端ip和端口

四、浏览器SwitchyOmega代理穿透GFW

1. 配置添加http代理127.0.0.1:65502 即可

五、docker添加http/https代理请参考官方文档

https://docs.docker.com/engine/admin/systemd/#start-manually