macOS上网速变慢原因排查及解决方案

 

起因

在之前跟家人聊天,通过apple的photos软件翻了一下原来的老照片,共享了其中的一些照片给家人看。

聊天之后开始下载一部美剧,发现速度奇慢,只有30KB/s,遂觉得不对劲,一定有什么后台进程。

工具

macOS上的命令行工具:nettop

一看这个名称,就知道这个是跟linux的top equivalent的工具。以下是使用概要。

  1. 直接在终端输入:nettop
  2. 注意nettop有以下选项,均可以通过在nettop界面中通过点击的方式:
    • p:换成人类易读模式。即通过KB, MB来表示,而不是全部是bytes。
    • d:delta。即切换为显示当前的增量,这样能够找到在这一秒内下载最多的程序。
  3. 另外,以下命令可以看到流量在网络TCP/IP层是怎么走的,相当于网络的traceroute。

nettop -m route

macOS上的图形工具:Activity Manager

Activity Manager里面的网络tab,也能够看到每个进程的网络占比。但缺点是没有delta选项,即不容易通过增量单独来看。

元凶:nsurlsessiond。苹果的Photos同步进程

找到一个占了200KB/s的线程:nsurlsessiond

查google得知这个是macOS的photos应用的云同步进程。

只要知道怎么关闭这个云同步就行。

解决方案

  1. 打开photos应用,点击Preference
  2. 打开icloud页签,能够找到iCloud Photo Library,发现其中有N百张照片在下载。
  3. 点击暂停一天即可。
  4. 然后我的下载器的速度就恢复了。

Linux的文件系统层次结构标准(浓缩版)

由于经常使用linux,想要系统看看linux的各个distribution的文件层次结构是什么样的,所以去linux找了一个3.0的FHS(Filesystem Hierarchy Standard)来看,并且把其中重要的部分翻译成了中文,适合快速了解linux的文件系统。以下:

1.这个章节包含了根目录的层级结构,以及/usr目录的层级结构。

https://c4fun.gitbooks.io/linux-unix/content/FHS101.html

2.这个章节包含了/var的目录层级结构。

https://c4fun.gitbooks.io/linux-unix/content/fhs201var.html

 

 

HTTP 基础概念&常用的命令

基本概念

定义

HTTP是OSI的应用层(7层)的一个response-request协议。一个HTTP服务器会监听某个指定端口来的client request,然后server根据Request做出反馈。默认端口80.

握手

  1. 另外HTTP建立连接有三次握手,分别是:客户端发起SYN, 服务器发起SYN+ACK, 客户端发起ACK。
  2. HTTP断开连接有四次握手:客户端发起FIN,服务器发起ACK,服务器发起FIN, 客户端发起FIN。

返回状态码

2XX:good

3XX:重定向

4XX:客户端错误

5XX:服务器端错误

linux中常用命令

telnet

这是一个不安全的协议,但是可以用来测试连接有效性。

$ telnet www.opsschool.org 80
GET /en/latest/http_101.html HTTP/1.1
Host: www.opsschool.org

Trying 162.209.114.75...
Connected to ops-school.readthedocs.org.

cURL

cURL是一个使用URL语法来传输数据的工具。比Telnet强大的点是:cURL可以创建HTTP Request(即可以指定GET, POST, HEAD等方法),

  1. 例如以下:
  • –request 指定方法为GET
  • -I 即只输出header
$ curl -I --request GET  http://www.opsschool.org/en/latest/http_101.html
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 23 Jun 2015 20:42:25 GMT
Content-Type: text/html
Content-Length: 140673
Last-Modified: Wed, 27 May 2015 12:16:25 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: "5565b599-22581"
X-Served: Nginx
X-Subdomain-TryFiles: True
X-Deity: chimera-lts
Accept-Ranges: bytes

2. 对于大文件,可以使用-O选项来显示进度

然后会显示以下的进度:


  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  4  467M    4 20.2M    0     0   116k      0  1:08:15  0:02:57  1:05:18 71532
3. 如果curl碰到重定向,而你想把这个重定向继续跟踪下去,使用-L选项
$ curl -IL www.opsschool.org
HTTP/1.1 302 FOUND
Server: nginx/1.4.6 (Ubuntu)
......

HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
.......

netcat

Netcat是一个可以建立HTTP连接,并且实现读写数据的工具。netcat可以作为服务器端或者客户端。

在很多地方,直接用nc这个简称指代netcat。

做一个简单的client/server

  1. 可以通过-L选项告诉netcat监听某个端口,造一个服务器端。
$ nc -l 192.168.0.1 1234 > output.log

以上命令告诉某台机器通过1234监听消息,听到的消息传递给output.log。注意IP地址改为该机器的IP地址。

2. 用客户端连接服务器,并且输入信息

$ echo "I'm connected as client" | nc 192.168.0.1 1234

3. 然后在服务器端可以看到输出:

$ cat output.log
I'm connected as client

可以做一个简单的聊天器

上面的命令如果不输出到文件,可以做及时聊天,只要:

  1. 服务器端
$ nc -l -p 1234

2. 客户端

$ nc 192.168.0.1 1234

然后就可以愉快的聊天了

作简单的HTTP服务器(比较危险,如果不懂网络安全,不要轻易尝试)

Netcat连接建立之后,可以执行命令或者脚本

netcat有一个traditional的版本,其中有DGAPING_SECURITY_HOLE这个选项,可以使用-e <program/shell_script.sh>来执行命令。

那么如何建立这个简单的HTTP服务器呢?

  1. 定义一个文件httpd.sh
  2. 然后在服务器端,通过这个命令来launch
$ while true; do netcat -lp 1234 -e ./httpd.sh; done

然后服务器端就已经在1234端口监听了。

3. 在客户端通过不同的HTTP命令连接,可以看到反馈

$ curl 192.168.0.1:1234/
<html>Hello there world!</html>

$ nc 192.168.0.1 1234
GET /notexisting.html HTTP/1.1

最后注意:一定要在服务器端把服务关闭

以上文章来源:opsschool

rsync, scp远程机器的文件拷贝到本地+部分拷贝+指定端口

记得还是VPS小白的时候,只懂得怎么按照教程一步步建立ss。

后来发现用VPS进行torrent下载很快,不用一直占用我的电脑,只要在空闲的时候再拷贝回自己的电脑就行。

那么,

如何把VPS上的文件拷贝到本地电脑呢?

rsync命令

  1. rsync可以实现保存部分文件,通过-P选项。所以比较适合大文件的下载。
  2. rsync的-e选项可以调用另外的remote shell,所以可以实现用ssh安全下载,并且还可以使用ssh命令的-p指定端口,所以可以应对VPS改了端口的场景。

综上所述,针对于我的使用命令

rsync -P -e "ssh -p 2234" my_username@my_ip_addr:/home/remote_files /local/path

scp命令

命令很简单,scp顾名思义就是使用了ssh的cp(copy命令),所以可以从远程拷贝文件。

由于使用了ssh,所以有以下两点需要满足:

  1. 远端主机的端口号需要正确。
  2. 需要输入对应用户名以及密码。或者已经对这个用户名建立了一个公私钥配对。

具体就不举例了,详见这个链接中的描述

使用crontab自动备份mysql中的数据库,例如wordpress数据库

使用命令:mysqldump

reference doc

可以使用mysql专用的mysqldump,下面这个语句即可创建一个

mysqldump -u root -p [DB NAME] > backup.sql
  • 这里-p后面也可以接password明码,然而容易暴露密码,并不好。如何解决这个问题见下一节
  • 另外,可以不用mysql的root来dump WP的数据库,WP数据库是可以用当初建立的单独的用户来dump的,所以降低了mysql的root密码暴露的风险。
  • 上面命令的[DB NAME]处,通过 ps aux|grep mysql,找到正在运行的mysql进程,其中–datadir对应的位置即当前数据库的位置,备份该位置的对应数据库即可。

自动化的crontab备份方案

参考megamorf答复

这里-p后面也必须接password才能够进行备份;然而直接在命令行容易暴露密码,并不好。

上面的问题,通过在对应用户的根目录创造一个文件./my.cnf,该文件的权限改为600权限,这样就只有这个用户能够看到了。

另外地,调试一下命令看效果,diff发现文件没有差别,就可以写到crontab中了。通过以下语句编辑:

crontab -e

下一步优化:

  1. 服务器定期压缩备份。
  2. 用pc机,隔一段时间从服务器的backup文件夹中拷贝相应的备份文件。
  3. 定时备份到移动硬盘(timemachine已经做了这一步了)

linux中的/var/log/auth.log

这个是管理鉴权的日志,可以看到网络上相应的登陆attempt。

感觉是不看不知道,一看吓一跳。有各种各样登陆的attempt:用户名为root的,mysql的,hadoop,ubuntu, oracle, tom。。。。。。

下面就把log里面最常见的两种说一下。

0. 时间 机器名 sshd[sshd_id]: input_userauth_request: invalid user XXX [preauth]

这是最常见的log。

其实就是IP在公网上被弱口令攻击。换句话说,就是有黑客写了脚本,for循环该网域上的主机,并且用弱用户名+弱口令暴力尝试。

防范方法:

  1. 禁止root用户直接远程登陆
  2. 禁用密码登陆,启用公私钥登陆。
  3. 设置fail2ban,以缓和攻击频率(但是也没有什么卵用,一般都是几十上百个机器攻击)configuration guide

1. “POSSIBLE BREAK-IN ATTEMPT” error message

次常见的log。

Stack Exchange解释:一个普遍现象

那没什么有”reverse mapping checking getaddrinfo failed”这句话呢?而且并不是全部的sshd的log都有这句话

首先,我们注意到log中,与POSSIBLE BREAK-IN ATTEMPT成对出现的log:reverse mapping checking getaddrinfo for sender3p4.nosoffresdumois.fr IP地址 failed

也就是说,我们的主机想要进行reverse mapping checking,但是通过PTR record(pointer record)没有找到该地址,所以linux主机认为受到了BREAK-IN ATTEMPT。

那么,再究其原因,是因为:

  1. 攻击者没有update其静态IP的PTR record。
  2. ISP没有为它的动态用户配置好 reverse records。 an ISP does not setup proper reverse records for its dynamic IP customers. This is very common, even for large ISPs.