Nginx版本: nginx/1.14.0 (Ubuntu)

Let’s Encrypt证书使用acme.sh客户端获取, 由Let’s Encrypt颁发.

问题现象: nginx配置https网站后, 浏览器(Edge/Chrome等)访问正常, curl访问报错提示curl: (60) SSL certificate problem: unable to get local issuer certificate. 从Java中通过HttpClient访问也提示证书校验失败.

分析: 根据 SSL Server Test 系统测试提示 This server's certificate chain is incomplete. Grade capped to B. 多处搜索无果, 于是查看通过acme.sh获取到的几个证书, 可以看到chain.cer中包含两个证书, *开头的cer文件中包含一个证书, fullchain.cer中包含以上两个证书, 考虑是否因证书链不完整导致报错.

解决方案: nginx对应server配置中:

ssl_certificate 改用 fullchain.cer

ssl_trusted_certificate 改用 chain.cer.

改动后需重新加载服务器: systemctl reload nginx

比较疑惑的是为什么非泛解析域名就不存在这个问题, 还没太想明白.

呐呐呐(x) 爆爆爆(√)

【鏡音リン・初音ミク】呐呐呐。【ピノキオピー】

《曾经的你》曾梦想仗剑走天涯 看一看世界的繁华 【突然听懂系列】

“假如我年少有为 不自卑”

《后来》刘若英 MV 1080P 50帧(CD音轨)

Audio Paradyne - Lost In Space

K-391 - Everybody

The Bass & The Melody - S3RL

Predictable Rave Song (Roski Veair Remix) - S3RL ft Tamika

【M A R i A】马口铁之舞

八目鳗穴

沙丁鱼从地面钻了出来

我在八目鳗穴飙着车

【音源配布】全部国产素材的沙丁鱼

【UTAU7人】沙丁鱼从地里钻了出来

!

【中文翻唱】!

【ころんば4号· デフォ子】八目鳗穴

毫无干劲的 八目鳗穴【イシル】

用一首先进国带你认识2009年NICO全明星

唱了一下”马口铁之舞”【MiraiAkari】

往期优秀作品推荐

2021年7月

主板: 微星MSI 迫击炮 B550

网卡: Intel Corporation Ethernet Connection (7) I219-V (rev 10)

内核版本: Linux 5.11.22-1-pve #1 SMP PVE 5.11.22-2

PVE版本: pve-manager/7.0-8/b1dbf562

问题现象: 每隔1-3分钟, 网卡会掉线15-30秒, 期间ping丢包100%, ip丢包100%. 系统日志提示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Aug 15 18:48:46 proxmox kernel: e1000e 0000:00:1f.6 eno1: Detected Hardware Unit Hang:
TDH <39>
TDT <7b>
next_to_use <7b>
next_to_clean <38>
buffer_info[next_to_clean]:
time_stamp <1015769ac>
next_to_watch <39>
jiffies <101576ae0>
next_to_watch.status <0>
MAC Status <40080083>
PHY Status <796d>
PHY 1000BASE-T Status <3800>
PHY Extended Status <3000>
PCI Status <10>
Aug 15 18:48:48 proxmox kernel: e1000e 0000:00:1f.6 eno1: Detected Hardware Unit Hang:
TDH <39>
TDT <7b>
next_to_use <7b>
next_to_clean <38>
buffer_info[next_to_clean]:
time_stamp <1015769ac>
next_to_watch <39>
jiffies <101576cd0>
next_to_watch.status <0>
MAC Status <40080083>
PHY Status <796d>
PHY 1000BASE-T Status <3800>
PHY Extended Status <3000>
PCI Status <10>
Aug 15 18:48:50 proxmox kernel: e1000e 0000:00:1f.6 eno1: Detected Hardware Unit Hang:
TDH <39>
TDT <7b>
next_to_use <7b>
next_to_clean <38>
buffer_info[next_to_clean]:
time_stamp <1015769ac>
next_to_watch <39>
jiffies <101576ec8>
next_to_watch.status <0>
MAC Status <40080083>
PHY Status <796d>
PHY 1000BASE-T Status <3800>
PHY Extended Status <3000>
PCI Status <10>
Aug 15 18:48:52 proxmox kernel: e1000e 0000:00:1f.6 eno1: Detected Hardware Unit Hang:
TDH <39>
TDT <7b>
next_to_use <7b>
next_to_clean <38>
buffer_info[next_to_clean]:
time_stamp <1015769ac>
next_to_watch <39>
jiffies <1015770b8>
next_to_watch.status <0>
MAC Status <40080083>
PHY Status <796d>
PHY 1000BASE-T Status <3800>
PHY Extended Status <3000>
PCI Status <10>
Aug 15 18:48:54 proxmox kernel: e1000e 0000:00:1f.6 eno1: Detected Hardware Unit Hang:
TDH <39>
TDT <7b>
next_to_use <7b>
next_to_clean <38>
buffer_info[next_to_clean]:
time_stamp <1015769ac>
next_to_watch <39>
jiffies <1015772b0>
next_to_watch.status <0>
MAC Status <40080083>
PHY Status <796d>
PHY 1000BASE-T Status <3800>
PHY Extended Status <3000>
PCI Status <10>
Aug 15 18:48:54 proxmox kernel: e1000e 0000:00:1f.6 eno1: Reset adapter unexpectedly

解决方法: 驱动问题, 需要关闭网卡的一些属性.

1
ethtool -K eno1 gso off gro off tso off tx off rx off rxvlan off txvlan off sg off

使用apt install -y ethtool以安装以太网工具.

此改动仅限本次开机期间, 重启后会失效. 持久化保存需要修改 /etc/network/interfaces

在对应的网卡配置下, 与address同级添加配置:

1
2
3
4
5
6
7
8
9
10
offload-gso off
offload-gro off
offload-tso off
offload-rx off
offload-tx off
offload-rxvlan off
offload-txvlan off
offload-sg off
offload-ufo off
offload-lro off

不修改interfaces也可以使用另一种方式, 即开机运行一次ethtool命令, 创建一个ethfix.service

1
2
3
4
5
6
7
8
9
[Unit]
Description=Fix network card on boot

[Service]
Type=simple
ExecStart=/usr/sbin/ethtool -K eno1 gso off gro off tso off tx off rx off rxvlan off txvlan off sg off

[Install]
WantedBy=multi-user.target

运行systemctl enable ethfix, 即可在今后开机时自动应用改动.

参考

e1000 driver hang | Proxmox Support Forum

e1000 driver hang | Page 8 | Proxmox Support Forum

e1000e eno1: Detected Hardware Unit Hang: | Proxmox Support Forum

ethtool(8) — Linux manual page

TSO、UFO、GSO、LRO、GRO和RSS介绍(ethtool命令)

局域网内Linux机器间如何快速传文件? ssh过于繁琐, 转而采用 nc(netcat)

TL;DR:

先在接收端监听端口: nc -l 12345 > filename

在发送端写入文件: nc -w 3 <ip> 12345 < sourcefile

其中-w 3的含义是输入数据到达末尾三秒后, 关闭socket. 针对openbsd.nc实现也可以改用 nc -N <ip> 12345 < sourcefile. 不加这个参数会导致接收端一直等待数据而无法退出.

注意 nc 是 netcat. Ubuntu上预装的是openbsd实现. 和nmap套件中的 ncat 要区分开.

传输完成后可通过hash校验判断文件是否完整传输:

sha256sum filname

sha256sum sourcefile

需要注意的是, nc是基于明文传输的, 因此只适用于受信任的局域网环境. 公网环境下还是老实用ssh/scp/sftp吧.

参考

Using Netcat for File Transfers

nc(1) - OpenBSD manual pages

ncat(1) - Linux manual page

tcpdump -nnvvXSs 1514 -i <device> <filters>

举例: sudo tcpdump -nnvvXSs 1514 -i eth0 src host 1.2.3.4

-nn 不解析协议和端口号.

-vv 输出更多详细信息.

-X 除了输出包头部信息外, 还以十六进制和ASCII码的格式输出payload

-S 输出绝对TCP报文序号. (默认是相对的)

-s <size> 设置抓取包长度为size, 默认为65535字节. 当包长度超过此设置时将出现截断. 若出现截断则输出中会出现[|tcp](以tcp协议举例). 处理时间随长度增加而增加.

参考

See entire packet payload using tcpdump.

tcpdump(8) - Linux man page

tcpdump详细教程

A tcpdump Tutorial with Examples — 50 Ways to Isolate Traffic

Linux bash下未配置git ssh, 使用http clone时反复弹出用户名密码输入框

使用内存缓存(cache), 默认超时时间是15分钟.

git config --global credential.helper cache

可配置超时时间为1小时, 单位是秒

git config --global credential.helper 'cache --timeout=3600'

配置了git ssh, 但远程地址是http协议

配置git使用ssh来替代http

git config --global --add url."git@github:".insteadOf https://github.com/

修改了 .gitmodules 但是没有生效

需要先同步submodule变更到git, 再执行其他命令

git submodule sync

参考

Git Tools - Credential Storage

Git - git-submodule Documentation

SSH使用HTTP代理

一句话命令行形式:

ssh -o "ProxyCommand=nc -X connect -x 代理主机:代理端口 %h %p" 目标主机 -p 目标SSH端口

配置文件形式 ~/.ssh/config

1
2
3
4
5
Host 目标机名称
HostName 目标机IP
Port 22
User 登录用户名
ProxyCommand nc -X connect -x 代理主机:代理端口 %h %p

通过跳板机登录SSH (多跳登录)

一句话命令行形式

ssh -J user@<JumpHost:JumpPort> user@<TargetHost:TargetPort>

配置文件形式

1
2
3
4
5
6
7
8
9
10
Host 跳板机
HostName 跳板机IP
Port 22
User 跳板机登录用户名

Host 目标机名称
HostName 目标机IP, 如果登录跳板机后目标机在内网则写内网IP.
Port 22
User 登录用户名
ProxyJump 跳板机

端口转发 (SSH隧道)

端口转发会引起安全问题, 企业IT部门可能会禁止使用.

正向端口转发: listen在本地, 请求本地相当于请求远程接口

ssh -fNL 本地端口:转发目标IP:转发目标端口 user@<host:port>

注意, 转发目标IP是相对远程主机而言的. 如果想请求远程主机本身, 使用127.0.0.1

反向端口转发: listen在远端, 请求远端相当于请求本地接口. 服务器的sshd配置(/etc/ssh/sshd_config)需包含GatewayPorts yesGatewayPorts clientspecified才能监听在0.0.0.0上, 否则只能监听在127.0.0.1上.

ssh -fNR [允许的远端来源IP:]远端监听端口:转发目标IP:转发目标端口 user@<host:port>

注意, 此处转发目标IP是相对本地主机而言的. 如果想请求本地主机, 使用127.0.0.1

-f 运行在后台

-N 不执行任何命令, 仅用于转发数据.

利用SSH搭建Socks5代理

ssh -D 本地代理监听端口 -fCN user@<host:port>

-C 进行数据压缩

SSH Agent

ForwardAgent生效时, 本机的root用户和目标机上的root用户均有权限使用此agent, 因此确保仅在可信的目标主机上启用此功能.

启动ssh-agent: eval `ssh-agent`

停止ssh-agent: eval `ssh-agent -k` , 直接kill掉对应的进程也可以. 注意清除环境变量中的SSH_AUTH_SOCKSSH_AGENT_PID.

添加私钥到agent: ssh-add 不带参数则添加默认的私钥到agent. 若要添加其他私钥, 则直接将文件名作为参数即可.

查看agent中包含的key公钥: ssh-add -L

查看agent中包含的key私钥: ssh-add -l

锁定agent: ssh-add -x

解锁agent: ssh-add -X

登录到其他主机, 并允许在对应主机上使用本机的agent:

一句话: ssh -A user@<host:port>

配置文件:

1
2
3
4
5
Host 目标机名称
HostName 目标机IP
Port 22
User 登录用户名
ForwardAgent yes

查看本机的SSH Host Key

1
sudo ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key

参考

SSH port forwarding - Example, command, server config

ssh(1) - Linux man page

ssh-add(1) - Linux man page

ssh-agent(1) - Linux man page

Using SSH agent forwarding

About the SSH host key fingerprint

无法为Docker添加SWAP使用限制? 报错 WARNING: No swap limit support

TL;DR: vim /etc/default/grub

添加这一行 GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1" (如果已经有了就追加在后面)

sudo update-grub && sudo reboot 必须重启才能生效.

参考

Runtime options with Memory, CPUs, and GPUs

moby/moby #4250: “WARNING: No {swap,memory} limit support” Ubuntu LTS (Precise)

How does kernel support swap limit?