多域名的 SSL 配置
这要求浏览器支持有「SNI」扩展「TLS」协议。
多证书的配置方法参考「Traefik/Examples」手册的「HTTP + HTTPS (with SNI)」部分。
另外,查看证书信息:openssl x509 -in certificate.crt -text -noout
相关连接
https://traefik.io
Using Traefik to host multiple SSL websites on your VPS[……]
「Traefik」- The Cloud Native Edge Router
「NETWORKING」- 概念术语、认识网络、整体架构
问题描述
该部分笔记将记录:网络基础概念、整体架构,以形成对网络的基本认识,理解常用术语。
解决方案
该部分笔记: 1)偏向网络通信理论,以形成对网络通信的宏观认识; 2)但并不涉及网络协议细节、网络技术实现等等内容;
网络通信基本概念
通信,是指人与人、人与物、物与物之间,通过某种媒介和行为进行的信息传递和交流。
网络通信,是指终端设备之间通过计算机网络进行的通信。如下示例:
网络信息传递过程
虚拟信息的传递过程,与真实的物品传递过程(快递)有很多相识之处: 1)快递:打包 ⇒ 贴签 ⇒ 集散 ⇒ 运输 ⇒ 集散 ⇒ 解签 ⇒ 签收; 2)网络:计算机 ⇒ 报文封装 ⇒ 网络设备 ⇒ 互联网 ⇒ 网络设备 ⇒ 报文解封 ⇒ 计算机;
计算机 ⇒ |报文|数据| ⇒ 网关路由器 ⇒ |报文|数据| ⇒ 网络主干道 ⇒ |报文|数据| ⇒ 网关路由器 ⇒ |报文|数据| ⇒ 计算机
终端之间的通信
物理层设备直接转发:物理主机或设备直接通信,解封装只发生在物理层。
交换机(二层)设备转发:解封装值发生在物理层、数据链路层;
路由器(三层)设备转发:解封装发生在物理层、数据链路层、网络层;
数据通信网络基本概念
数据通信网络:由路由器、交换机、防火墙、无线控制器、无线接入点等等设备过程的通信网络。
最基本的功能:实现数据互通。
扁平化网络结构
普通见得网络结构,接入设备直通路由设备;
层次化网络架构
交换区块:办公区域 1,办公区域 2,办公区域 3,核心机房 都是交换区块。
办公网络的网络结构: 1)核心层:快速转发,设备连接外网, 2)汇聚层:通常为三层交换机,设备性能高于接入层;对于办公网络应该称为分布层,因为流量多为下行,由设备分发。 3)接入层:普通的交换机设备,用于接入终端设备; 4)终端:内网终端设置;
服务器集群网络: 1)核心层 2)汇聚层:数据主要上行,汇聚到交换机设备,因此称为汇聚层。 3)接入层: 4)服务器:服务器设备
网络的三要素
1)NIC(网络接口卡): 2)介质:有线、无线: 3)中间系统:网络设备,比如 Router、Switch、AP 等等;
网络通信的基本概念
网络通信的示例: 1)工作组:PCa — PCb,由双绞线连接(网线) 2)通过路由通讯; 3)通过网络设备通讯,组建互联网;
交换机是接入设备,路由器是核心汇聚设备。
交换机: 1)下联接口:用于连接计算机,组件局域网; 2)级联接口:用于连接其他网络设备,通常为光口;
数据转发过程
数据包在相同网段内或不同网段之间的转发所依据的原理基本一致。[……]
「TCP」- Transmission Control Protocol
问题描述
我们最近在学习网络相关的内容,TCP 自然是绕不开的技术内容,必须要学习。
该笔记将记录:与 TCP 协议相关内容,是我们的学习笔记。
解决方案
我们通过以下途径进行学习: 1)在互联网中开放的免费学习视频; 2)通过 Wireshare 抓包观察(curl https//blog.k4nz.tech ⇒ ./tcp.pcapng)
初步认识
面向连接的传输层协议,提供可靠的传输服务。 端口号标识要访问的服务。 五元组来区分不同的连接:源、末网络地址,源、末端口号,协议类型
原理简述
建立连接(三次握手)
如下为 TCP 建立连接(三次握手)的文字描述,其中的数据来自于 Wireshark 抓包的结果:
0 Server 在创建连接前,Server 处于 LISTEN 状态,以准备接收来自 Client 连接请求;
1 Client ⇒ Server(第一次) Client 向 Server 发送 SYN 数据包:SYN = 1,Sequence number = 10955578,ACK = 0,Acknowledgment number = 0; Client 进入 SYN-SENT 状态,等待匹配的连接请求;
2 Client ⇐ Server(第二次) Server 向 Client 发送 SYN-ACK 数据包:SYN = 1,Sequence number = 157237846,ACK = 1,Acknowledgment number = 10955579; Server 进入 SYN-RECEIVED 状态,等待请求确认;
3 Client ⇒ Server(第三次) Client 向 Server 发送 ACK 报文:SYN = 0,Sequence number = 10955579,ACK = 1, Acknowledgment number = 157237847; Client 进入 ESTABLISHED 状态;
4 Server Server 收到 ACK 报文后,进入 ESTABLISHED 状态;至此,一条全双工的连接就已经建立。
通过上述的三次报文发送,在 Client 与 Server 之间建立已知连接。
关于 ACK Number 与 SYN Number 增长: 1)在握手过程中,由于没有 Payload 部分,因此 ACK Number 与 SYN Number 每次都 +1; 2)但是在数据发送过程中,ACK Number 与 SYN Number 每次都增加数据大小;
数据发送
假如每次发送 500B 数据,Client 能够连续发送,那么:
A => -[……]
「BBR」- Bottleneck Bandwidth and RRT
系统要求
首先Linux的内核必须在4.9或者4.9以上。升级方法略过,已经由很多文章了。升级之后记得重启。
!!!注意BBR是在发送端进行设置的。
当前配置
开箱即用,Linux使用Reno和CUBIC,通过如下命令进行验证:
# sysctl net.ipv4.tcp_available_congestion_control
上述命令查看TCP可用的拥塞控制,输出如下:
net.ipv4.tcp_available_congestion_control = reno cubic
显示了支持的算法。
执行如下命令显示当前配置:
sysctl net.core.default_qdisc
sysctl net.ipv4.tcp_congestion_control
启用配置
临时开启
执行如下命令,临时启用BBR设置:
#!/bin/sh
sysctl -w net.core.default_qdisc=fq
sysctl -w net.ipv4.tcp_congestion_control=bbr
永久开启
下面开始设置BBR参数。修改/etc/sysctl.conf文件,追加如下行:
# net.core.default_qdisc = pfifo_fast
net.core.default_qdisc=fq
# net.ipv4.tcp_congestion_control = cubic
net.ipv4.tcp_congestion_control=bbr
其中,注释的行为原由的参数。当不像使用BBR时,可以进行恢复。
然后执行sysctl -p命令,应用文件中的变更。
验证修改
最后,可以执行如下命令来验证变更是否有效:
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc
关闭设置
临时关闭
直接通过sysctl命令进行临时关闭:
sysctl -w net.core.default_qdisc=pfifo_fast
sysctl -w net.ipv4.tcp_congestion_control=cubic
永久关闭
修改/etc/sysctl.conf文件,将设置修改为:
net.core.default_qdisc = pfifo_fast
# net.core.default_qdisc=fq[……]
「TCP」- 全局同步(Global Synchronization)
TCP 全局同步现象如图,三种颜色表示三条 TCP 连接;
TCP 启动过程 1)网络设备的流量过大,导致队列被装满,发生尾丢弃行为; 2)服务器回复的 TCP-Ack 由于拥塞被丢掉,故发送方未收到 TCP-Ack,则认为网络拥塞,于是同时将 TCP 滑动窗口 Size 减小,则整体流量同时减小; 3)此时网络拥塞消除,发送方又都能收到 TCP 确认包,故认为网络不再拥塞,于是都进入 TCP 慢启动过程,周而复始
TCP 全局同步: 对于 TCP 报文,如果大量的报文被丢弃,将造成 TCP 超时,从而引发 TCP 慢启动,使得 TCP 减少报文的发送; 当队列同时丢弃多个 TCP 连接的报文时,将造成多个 TCP 连接同时进入拥塞避免和慢启动状态以调整并降低流量,这就被称为 TCP 全局同步现象。这样多个 TCP 连接发往队列的报文将同时减少,而后又会在某个时间同时出现流量高峰,如此反复,使网络资源利用率低;[……]
「UDP」 – User Datagram Protocol
初步认识
面向无连接的传输协议,传输可靠性没有保证。
当对传输速度和延迟要求较高时,又对传输可靠性要求不高,此时可以使用 UDP 协议替代 TCP 协议。一些时延敏感的流量(如语音、视频)使用 UDP 协议。
协议无序列号,需要应用程序负责进行报文的排序、流量控制、到达确认等等。
不提供重传机制,因此资源占用小,速度快
报文格式
参考文献
User Datagram Protocol – Wikipedia[……]
「Layer 5」- Session Layer
会话层:建立、维护、管理会话连接。
数据单元:SPDU[……]
「Layer 7」- Application Layer
应用层:为应用程序提供网络服务。
数据单元:APDU
内容简介
本部分下整理了常用的网络协议,相关的知识、应用、工具等等内容。
常用协议
已经在子目录中创建相关的分类及文章。(这里本该有一个TABLE OF CONTENS的)
听别人提到过的协议
有些协议也是挺别人提起过,但是没有实际的使用过,这里简单的记录一下。
# SIP – Session Initiation Protocol
-「Wikipieda/Session Initiation Protocol」 一种信令协议,用于发起、维护、终止实时会话(包括语音,视频和消息传递应用程序)。它用于信令和控制多媒体通信会话,这包括在用于语音和视频呼叫的因特网电话的应用中、在专用IP电话系统中、在IP网络上的即时消息传送以及通过LTE的移动电话呼叫(VoLTE)中。[……]
「DNS」- 报文格式
两种类型的消息:「Query」与「Reply」。
两种报文格式相同,都有:一个头部 + 四个部分
header
A header field contols the content of these four sections.
(16 bit)Identification, used to match responses with queries
(16 bit)Flags,
QR, Indicates if the message is a query (0) or a reply (1)
OPCODE, The type can be QUERY (standard query, 0), IQUERY (inverse query, 1), or STATUS (server status request, 2)
AA, Authoritative Answer, in a response, indicates if the DNS server is authoritative for the queried hostname
TC, TrunCation, indicates that this message was truncated due to excessive length
RD, Recursion Desired , indicates if the client means a recursive query
RA, Recursion Available, in a response, indicates if the replying DNS server supports recursion
Z, Zero, reserved for future use
RCODE, Response code, can be NOERROR (0), FORMERR(1, Format error), SERVFAIL (2), NXDOMAIN (3, Non existent domain), etc.
(16 bit)Number of questions,
(16 bit)Number of answers,
(16 bit)Number of authority resource records (RRs),
(16 bit)Number of additional RRs
question, answer, authority, an additional space
question
NAME Name of the requeste[……]
「DNS」- 图形化的管理工具
for BIND
# 下面这一堆项目,都是 BIND 相关的。不过,要么是打不开,要么是四年前的了:
# DNS Control
# ProBIND
# unxsBind/iDNS (mysqlBind2/iDNS)
# gadmin-BIND (part of GAdminTools)
# Binder
# dnSQLpanel
# myWebDNS
# BIND Webmin Module
# smBIND (Simple Management for BIND)
# xbaydns
# WeBBind
我们使用 WebMin 进行管理(但是该平台用于系统维护,功能较多,而我们只需要管理 DNS 服务)
sameersbn/docker-bind
sameersbn/docker-bind: Dockerize BIND DNS server with webmin for DNS administration
BIND + Docker + Webmin
for DNS Safety
DNS Safety – Simple and Powerful DNS Filter for Your Network
内置 Web GUI 管理,但是暂不支持容器化部署;
参考文献
Web interfaces for BIND management[……]
「Bind」- The most widely used Name Server Software
用作缓存的DNS服务架设
用作转发的DNS服务架设
用作覆盖的DNS服务架设
主/从同步的DNS服务架设
参考文献
BIND 9 – Versatile, Classic, Complete Name Server Software 鳥哥的 Linux 私房菜/第十九章、主機名稱控制者: DNS 伺服器[……]
「BIND」- 快速入门与基本概念
内容简介
本文将介绍与BIND有关的基础内容,以及与DNS服务相关的基础内容。通过BIND加深对DNS的理解。
常见术语
# DNS Forwarding
转发,如字面意思,在「客户端直连的服务器」收到解析请求时,它将查询请求直接转发到另外一台主机,而本身不进行解析。
术语「DNS forwarding」只指:将特定DNS请求转发到指定的DNS服务器以进行解析的过程。
# 转发和递归的区别
「What’s the difference between recursion and forwarding in bind」 「dns分类与区别-权威DNS、递归DNS、转发DNS」
Forwarding
just passes the DNS query to another DNS server (e.g. your ISP’s). Home routers use forwarding to pass DNS queries from your home network’s clients to your ISP’s DNS servers.
For example, for foo.example.com, a forwarding DNS server would first check its cache (did it already ask this question before), and if the answer is not in its cache, it would ask its forwarder (your ISP’s DNS server) for the answer, which would respond with either a cached response, or would perform recursion until it figured out the answer.
Recursion
the DNS server receiving the query takes it upon itself to figure out the answer to that query by recursively querying authoritative DNS servers for that domain.
For example, for foo.example.com, a recursor would first query the root servers for what DNS servers are responsible for the .com TLD, then it would ask those serve[……]
「DNS」- 安装 BIND 服务
# 下载:ftp://ftp.isc.org/isc/
# 06/15/2019 CentOS 7.6.1810 && BIND 9.9.4
#!/bin/sh
yum install -y bind
# 06/15/2019 CentOS 7.6.1810 && Source[……]
「BIND」- Logging
内容简介
通过 BIND 的日志,我们可以知晓在服务中正在发生什么、当前正在进行哪些查询解析、出现了哪些错误;
本部分介绍与 BIND 日志相关的内容;
关于日志
关于 BIND 各方面的日志相关的配置还挺多的;
有关日志的基础内容,可以参考「BIND Logging – some basic recommendations」一文;
附加说明
如果向查看 SERVFAIL 的日志,则需要设置category query-errors{}及对应的channel参数,并且开启追踪(执行rndc trace命令),详细参考「Logging SERVFAIL Errors」邮件列表;[……]
「BIND」- 常见问题处理,配置,管理
问题描述
该笔记将记录:与 BIND 服务配置管理相关的内容,以及常见问题的处理方法。
官方文档
# 文档:https://kb.isc.org/docs/aa-01310 # 对于历史版本的文档,需要到源码目录中查找 # BIND 9.9 Administrator Reference Manual (ARM)
# 技巧与提示
「How to Check DNS ( BIND ) Configuration File」 检查配置文件:named-checkconf /etc/named.conf
「Turn on or enable BIND DNS server logging to see all queries or for troubleshooting problem」 打开及关闭日志都可以使用rndc querylog命令,然后查看tail -f /var/log/message文件。
仅监听特定网络接口
Configure BIND DNS Server to Listen Only On Certain IP Address or Network Interface
通过 dnsperf 进行性能测试[……]
「BIND」- 配置选项
# filter-aaaa/filter-aaaa-on-ipv4/filter-aaaa-on-ipv6
filter-aaaa测试 filter-aaaa-on-v4 does not filter AAAA if there is no existing A Record with the same FQDN – working as designed?
filter-aaaa-on-ipv4
需要在编译时启用了–enable-filter-aaaa选项,才能使用该指令。该选项选项用于帮助从IPv4向IPv6过渡,如果Client没有进入IPv6网络,就不返回IPv6地址。否则,如果Client没有加入IPv6网络,当你DNS解析返回IPv6地址后,应用程序是无法进行后续请求的。
默认值为no。可以在view中使用该选项以覆盖全局的设置。
yes – 如果Client地址包含在filter-aaaa中,并且响应中不包含DNSSEC标志,则从响应中删除AAAA记录。过滤应用于所有的相应,不光是权威的回应。
reak-dnssec – 如果Client地址包含在filter-aaaa中,即使响应中包含DNSSEC标志,则从响应中删除AAAA记录。正如name所示,这使得响应无法验证,因为DNSSEC协议被设计为检测删除。
!!!没错,根据邮件列表中的描述:虽然文档没写,但是代码中的注释就是,如果ZONE中没有A记录,那么它是不会过滤AAAA记录的。
!!!但是返回DNS的返回状态为SERVFAIL的时候,这个选项是不好用的。在BIND DLZ时遇到了这个问题,可以参见 BIND DLZ 相关的问题描述。
filter-aaaa-on-ipv4
与filter-aaaa-on-ipv4选项同理。
filter-aaaa
指定一个地址列表,将为这些地址使用filter-aaaa-on-v4功能。默认为any。
附加说明
# forward/forwarders
Reduce bind9 cache on a forwarded zone only
# max-cache-ttl/max-ncache-ttl
Reduce bind9 cache on a forwarded zone only
用于配置在Forward中缓存的时间。[……]
「BIND9」- DLZ(Dynamically Loadable Zones)
问题描述
使用 BIND 最不方便的地方在于:每次添加新的解析记录,在修改配置文件后,需要执行命令重新加载。如果可以从数据库动态读取 DNS 记录就完美了;
该笔记将记录:使用 DLZ 的配置,实现从数据库中动态读取 DNS 记录;
解决方案
动态可加载区域(DLZ)是 BIND 9 的补丁,它简化了 BIND 管理,并减少了内存使用和启动时间;
该技术允许将 DNS 记录存储在数据库中,在解析时从数据库中查询 DNS 记录。与使用脚本不同,在数据库中的更改会立即体现在 BIND 对 DNS 查询的响应中,因此无需重新加载或重新启动 BIND 服务,并且不需要在内存中载入及缓存 DNS 记录,因此也减少内存的使用;
注意事项
这是个非常老的项目了,最后一个版本:DLZ-0.7.0,修改时间 2004-04-17(Bind DLZ)。前人在公司内网 DNS 解析中使用了这个技术,又不能轻易替换;
如果正在寻找数据库存储 DNS Record 的解决方案,请慎用(官方文档也存在部分问题),我们已经开始使用 PowerDNS 服务;
服务部署
项目地址:http://bind-dlz.sourceforge.net
安装及部署,可以参考官方的文档:「Examples」
通过源码编译
bin/ld: cannot find -l<nameOfTheLibrary> install BigARTM – CentOS v7 GCC/3.14 Options for Linking GCC how to add before the default linker search path by default? LIBRARY_PATH not working
只要在编译 BIND 的时候指定了–with-dlz-mysql=yes 选项,即可以支持 MySQL 后端来存储 ZONE 信息;
… /usr/bin/ld: cannot find -lmysqlclien … 1)问题描述:在 CentOS 上编译时,已经安装安装了 MySQL 应用,且 libmysqlclient 也是存在的,但是依旧有这个错误。执行make VERBOSE=1后,发现执行编译命令时,/usr/lib64/mysql并不在 gcc 的库查找路径中; 2)解决方案:在编译时,增加库的搜索路径,即执行命令LIBRARY_PATH=/usr/lib64/mysql make即可。当然可能还有其他办法;
通过包管理器
# 在 CentOS 中的 Bind 是支持 DLZ 的,但是位于 bind-sdb 软件包中
yum install -y bind-sdb[……]
「Bind」- 使用RNDC管理服务
内容简介
在Bind中,可以使用内置的rndc(8)命令管理Bind服务。比如:rndc status,查看服务的状态;rndc trace,将调试级别加一;等等。
本文将介绍在BIND中配置及使用RNDC管理工具。
RNDC – name server control utility
RNDC,用于操作域名服务,对应sbin/rndc命令,使用TCP连接与域名服务通信,使用953端口,使用数字签名进行身份验证。
附加说明
如果是直接从源中安装DNS服务,则RNDC一般不需要单独配置。使用ss -n -o state listening sport = 953验证服务是否开启管理
配置RNDC管理
#1 生成rndc.conf配置文件
执行rndc-confgen命令生成配置文件:
#!/bin/sh
rndc-confgen -r /dev/urandom > etc/rndc.conf
# 在多数情况下,配置文件rndc.conf与named.conf位于同级目录中。
由上述命令生成的rndc.conf文件内容如下:
# Start of rndc.conf
key “rndc-key” {
algorithm hmac-md5;
secret “utSg/xHrAYorbcG6eJIT4Q==”;
};
options {
default-key “rndc-key”;
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf
# Use with the following in named.conf, adjusting the allow list as needed:
# key “rndc-key” {
# algorithm hmac-md5;
# secret “utSg/xHrAYorbcG6eJIT4Q==”;
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { “rndc-key”; };
# };
# End of named.conf
#2 修改named.conf配置文件
正如上面生成的配置文件中所述,将注释部分复制到named.conf即可:
# ……(省略named.conf中其他配置)
# Use with the following in named.conf, a[……]
「BIND9」- 配置DNS转发
内容简介
本文将介绍如何使用BIND配置DNS转发服务。
服务配置
使用BIND配置转发倒是很容易。只需要如下定义named.conf配置文件:
options {
directory “/var/named”;
/*
* Using the DNS Server of the Network Provider as a forwarder
* can make responses to queries faster and less of load on your
* local network
*/
forward first;
forwarders {
193.247.122.26;
};
};
参考文献
How to setup DNS Forwarding ? DNS之BIND使用小结(Forward转发) DNS BIND之forwarder转发 What is DNS Forwarding[……]
「BIND9」- 如果记录不存在,则进行转发
问题背景
“如果记录不存在,则进行转发”。
实际的情况是这样的:在同一个ZONE中,有些域名使用ISP的DNS服务器进行解析,而有些域名希望仅在本地DNS服务器解析的。比如域名inner.k4nz.com仅在内网的DNS服务器上解析,而outer.k4nz.com则由公网的DNS服务器解析。我们希望这二者可以共存,即“如果内网DNS服务找不到对应的记录,则到公网的DNS服务器查找”,亦即“如果记录不存在,则进行转发”。
这就会存在一个问题:内网的DNS服务器接管k4nz.com这个ZONE之后,导致同ZONE内的在公网DNS服务解析的域名无法解析。就是说,使用内网DNS服务接管k4nz.com这个zone后,在公网解析的outer.k4nz.com就无法解析了。(为什么?因为就这样,去了解以下DNS吧……)
解决方案
要怎么解决这个问题呢:首先想到的当然就是“如果记录不存在,则进行转发”,但是BIND好像没有提供这个功能“在ZONE里找不到就去其他DNS服务器查询的功能”(或许是我没找到)。所以,就去搜索了以下,给出的办法是“覆盖”,用到了“Response Policy Zones (RPZ)”配置,包含在BIND 9.8.1以后的版本中:定义一个ZONE,这个ZONE用作覆盖原由的记录。
注意,本文侧重于从DNS服务层面解决这个问题,而不是在客户端中使用类似于“如果这个DNS服务器没有找到记录,则去下一个查找”的方法进行解决。相关方法参见「Ubuntu resolv.conf, not going to next nameserver?」「second nameserver in /etc/resolv.conf not picked up by wget」 TODO DNS – 如果没有找到对应的记录,则去下一台进行查找
实行配置
修改/etc/named.conf配置文件,内容如下:
options {
listen-on port 53 { any; };
directory “/var/named”;
dump-file “/var/named/data/cache_dump.db”;
statistics-file “/var/named/data/named_stats.txt”;
memstatistics-file “/var/named/data/named_mem_stats.txt”;
recursing-file “/var/named/data/named.recursing”;
secroots-file “/var/n[……]
「BIND9」- 常见错误汇总
#1 network unreachable resolving
「Disabling IPv6 lookups in bind」
问题描述: 使用journalctl -f -u named.service查看日志时,会发现在执行DNS解析时产生如下错误:
network unreachable resolving
问题原因: 所有现代操作系统都支持开箱即用的IPv6协议,其中BIND也是如此。操作系统在接口上配置IPv6地址,但是IPv6不能在本地网络之外工作,所以说IPv6地址是不可达的,所以产生了这个错误。
解决方法: 解决方法有两个: 1)要么使IPv6网络可用,可以访问外部网络。(访问外网有些麻烦,暂时不可行) 2)要么在Bind层面禁用IPv6监听。(禁用BIND9的IPv6监听)
在CentOS中,修改/etc/sysconfig/named文件,加入OPTIONS=”-4″行,然后重启DNS服务。这只是禁止了Bind服务监听IPv6的地址。(这并不能阻止Bind在IPv4上进行AAAA记录的解析。我们也不需要禁止IPv4上的AAAA解析,因为我们的问题是IPv6网络不可用导致的,所以只要不再IPv6地址上发包即可)[……]
「DNS」- 使用接口更新域名解析(Tencent Cloud)
问题描述
该笔记将记录:使用腾讯的 API 进行更改域名解析的方法。实现在 IP 地址发生变化的时候,调用接口修改域名的 DNS 解析;
解决方案
腾讯的接口地址:https://cloud.tencent.com/document/api/302/8511
不过我调用的时候返回了 403,提了工单,他们家说目前出于封闭状态,让我等待进一步确认。emmmmm…..那就等等把;
# 08/02/2018 好了已经,具体原因不想说了。客观的讲:(1)没有仔细看文档;(2)不能说我们没有仔细看,只能说腾讯把完整的 URL 放在“示例”里;
生成接口参数的时候你可能需要用到 SHA1 算法来签名,如果你在 SHELL 中可能会用到 OpenSSL 的如下命令:
# echo -n “value” | openssl dgst -sha1 -hmac “key”
57443a4c052350a44638835d64fd66822f813319
# echo -n “value” | openssl sha1 -hmac “key”
57443a4c052350a44638835d64fd66822f813319
上面的两个命令是等价的。参数“key”是腾讯的 SecretKey,文档已描述如何获取;参数“value”是要签名的原串;
使用命令 curl(1) 发送请求,下面是 SHELL 脚本的关键部分:
#!/bin/sh
IPADDRESS=”// 要解析的 IP 地址”
SecretId=”// 参见文档”
SecretKey=”// 参见文档”
domain=”// k4nz.com”
recordId=”// 记录 ID,直接去腾讯云平台复制就行了”
subDomain=”// 子域”
recordType=”A”
recordLine=”默认”
METHOD=”GET”
PROTOCOL=’https://’
HOST=’cns.api.qcloud.com’
URI=’/v2/index.php’
PARAM=”Action=RecordModify&Nonce=${RANDOM}&SecretId=${SecretId}&Timestamp=$(date +%s)&domain=${domain}&recordId=${recordId}&recordLine=${recordLine}&recordType=${recordType}&subDomain=${subDomain}&value=${IPADDRESS}”
signString=”${METHOD}${HOST}${[……]
「resolvconf」
resolvconf,name server information handler Resolvconf is a framework for keeping up to date the system’s
between programs that supply this information (such as ifup and ifdown, DHCP clients, the PPP daemon and local name servers) and programs that use this information (such as DNS caches and resolver libraries). . This package may require some manual configuration. Please read the README file for detailed instructions.
安装的可执行程序
resolvconf
「resolvconf」 and 「openresolv」
openresolv – the DNS management framework: https://roy.marples.name/projects/openresolv
参考文献
Homepage: http://alioth.debian.org/projects/resolvconf/ Wikipedia / resolvconf: https://en.wikipedia.org/wiki/Resolvconf[……]
「Email Protocols」- 电子邮件协议
「Ray Tomlinson」
「History of email」
「The Reason Why Your Email Address Has an @ in It」 “I looked at the keyboard, and I thought: ‘What can I choose here that won’t be confused with a username?'” Tomlinson remembers. “If every person had an ‘@’ sign in their name, it wouldn’t work too well. But they didn’t. They did use commas and slashes and brackets. Of the remaining three or four characters, the ‘@’ sign made the most sense. It denoted where the user was … at. Excuse my English.”
Tomlinson calls the ‘@’ symbol “the only preposition on the keyboard.”
POP – Post Office Protocol
POP 是本地电子邮件 Client 从远程 Server 取回电子邮件时所使用的应用层协议,服务使用的端口号是 110。 POP 已经开发过几个版本,第三版(POP3)是最常用的标准,但那是在被更先进的 IMAP 以及 webmail 废弃之前的事情了。POP 协议支持“离线”邮件存储转发处理:Client 程序连接 Server,下载所有未阅读的电子邮件;一旦将邮件从邮件 Server 端送到 Client 上,邮件 Server 上的邮件将会被删除。目前的 POP3 邮件 Server 大都可以“只下载邮件,Server 端并不删除”,也就是改进的 POP 协议。POP3 的加密通信是在协议启动之后,使用 STLS 命令(如果支持)或 POP3S,连接 Server 时,使用 TLS 或 SSL 在 995 端口上;
POP3 协议允许电子邮件 Client 下载 Server 上的邮件,但是在 Client 的操作(如移动邮件、标记已读等),不会影响 Server 上。比如:通过 Client 收取了邮箱中的 3 封邮件并移动到其他文件夹,邮箱 Server 上的这些邮件是不受影响的 ;
POP3 的特征 1)POP3 在 Client 的操作不会反馈到 Server 上,所有对邮件的操作都保存在 Client 的本地中; 2)POP3 需要下载未阅读的[……]
「Email」- 架构
邮件是如何发送给收件人的?
简单的说
你的邮箱是sender@163.com,收件人的邮箱是recipient@gmail.com,现在你要给他发邮件:
打开你的 Foxmail 邮件客户端,写好邮件,填上收件人地址,点击「发送」;
此时 Foxmail 会将邮件先发送到你所在的邮件服务器上,这里是 mail.163.com 服务器;
然后,邮件服务器 mail.163.com 将邮件发送到收件人所在的邮件服务器,这里是 mail.gmail.com 服务器;
在邮件服务器 mail.gmail.com 收到邮件后,将邮件存储在起来,等待收件人来收取邮件;
收件人打开自己的邮件客户端(Foxmail、Thunderbird 等等),到 mail.google.com 上拉取邮件;
上述过程概括起来就是:
发件人,使用邮件客户端,将邮件发送到发件人所在的邮件服务器;
发件人所在的服务器,将邮件发送到收件人所在的服务器;
收件人,使用邮件客户端,到自己所在的邮件服务器上收取邮件;
如下图所示:
复杂点说就是…
这并不是最复杂的,上图只涉及了邮件发送中的一部分角色;
发送邮件中的各种角色
邮件用户代理(MUA, Mail User Agent)
常用的客户端,比如 Foxmial、Thunderbird 等等,都是邮件用户代理;
邮件传输代理(MTA, Mail Transfer Agent)
由于接收邮件的服务器,有时候也称为「邮件中继(Mail Relay)」
邮件投递代理(MDA, Mail Delivery Agent)
邮件传递代理是一种计算机软件组件,负责将电子邮件传递到本地收件人的邮箱。它也被称为本地传递代理(LDA);
在因特网邮件体系结构中,通过处理来自 MTA 的消息,并将邮件存储到接收者的环境(通常是“邮箱”)中来实现本地消息传递;
许多邮件处理软件产品将多个 MDA 与 MTA 组件捆绑在一起;
邮件提交代理(MSA, Mail Submmission Agent)
Wikipedia/Message submission agent 收取 MUA 发来的邮件,并与 MTA 合作。大多数 MTA 已经包含了 MSA 的功能,但也有写软件专门提供 MSA 功能;
邮件访问代理(MAA, Mail Access Agent)
「Application Layer (email services) – Message Access Agents (POP and IMAP)」 用于将用户连接到系统邮件库,使用 POP 或 IMA[……]
「与邮件服务有关的杂记」
保护网页中的邮件地址
SMTP Commands and Definitions
邮件服务的实现
Exim
Debain Wiki/PkgExim4UserFAQ
使用 Postfix 搭建邮件服务器
Postfix主页:http://www.postfix.org 从零开始邮件服务器搭建:https://www.jianshu.com/p/610d9bf0ae8b
OpenPGP
OpenPGP 是一个广泛使用的邮件加密标准。[……]
「Linux」- 使用 mail 命令发送邮件
使用mail命令发送邮件
当你需要定时获取服务器上的信息,又或者在满足一定条件后对你进行通知时,使用命令行发送邮件会非常有用。我的个人服务器上就配置了定时任务,每小时会自动汇总服务器的资源信息,然后发到我的邮箱里。
本文将会介绍在Linux中如何使用mail命令用163邮箱给126的邮箱发送邮件。
命令mail是如何工作的?
在使用mail命令发送邮件之前,最好是先了解以下mail命令是如何工作的。如果不知道的话,就会像我当初一样,花了很长时间才搞明白为什么邮件总是发送不成功。我在网上看了很多教程,很多教程都可以概括为一句话:在某个配置文件里加点东西,然后执行以下mail命令,嗒嗒,邮件就发送成功了。然而我测试了半天都不好用。当我弄明白mail命令是如何工作的以后,我才知道我最初的理解是错误的。
实际上,mail命令调用标准的sendmail程序(通常是/usr/sbin/sendmail),sendmail又连接到本地的邮件传输代理(MTA)以将邮件发送到目的地址。本地邮件传输代理(MTA)是一个在本地运行的smtp服务器,它接受端口25上的邮件。大致的原理如下图:
「mail command」 -> 「/usr/sbin/sendmail」 -> 「local MTA (smtp server)」 -> 「recipient MTA」
这就表示本地必须运行一个SMTP服务器,比如Postfix、Exim4等等。如果没有运行,使用mail命令时,会得到一个”send-mail: Cannot open mail:25″的错误提示。
这就表示,使用mail命令的第一步是应该先搭建本地邮件传输代理。本教程使用的Exim4。
系统环境
操作系统 Kali GNU/Linux Rolling
使用的mail命令 本文使用的mail命令来自于mailutils软件包。当然使用heirloom-mailx、bsd-mailx等等其他的软件包也是可以的,他们都提供了mail命令,再用法上大同小异,只有细微的差别。
邮件传输代理(MTA) 如上说述,本地需要配置邮件传输代理(MTA)。本文使用的Exim4。当然你也可以使用Postfix,又或者其他的邮件传输代理,虽然配置上不同,但是原理上是相同的。
配置本地的邮件传输代理
安装本地的邮件传输代理
执行下面命令来安装Exim4服务:
#!/bin/bash
apt-get install exim4 exim4-base exim4-config exim4-daemon-light
配置Exim4服务
再提一次,Exim4在这里提供的是本地邮件传[……]
「Linux」- 从命令行发送邮件
给本地用户发送邮件
该部分中演示的是使用mail命令给同一个系统中的其他用户发送邮件。
#!/bin/bash
echo “A Test Mail.” | mail -s “Test Mail” zheng
# 当前登录的用户为root,所以发邮件的用户为root。命令中的zheng为系统中的另外一个用户。
# 上述命令发送一封主题为“Test Mail”且邮件内容为“A Test Mail.”的邮件给用户zheng。
# 用户zheng登录后,在终端中执行mail命令,即可查看邮箱中的邮件。
# 系统中所有的邮件位于/var/mial/$USER。注意,如果用户从未收到过邮件,那么在/var/mail中可能没有对应的文件。
使用telnet命令发送邮件
该部分中演示的是使用telnet命令,登录163邮箱服务器,给QQ邮箱发送邮件。
几点说明
在下面的示例中,需要用户输入的内容进行了加粗显示。
以「# 说明:」之类的文本为解释性内容,使用斜体显示。
<ENTER>表示回车键。
示例中发件人的邮箱地址:sender@163.com
示例中收件人的地址为:recipient@qq.com
最重要的一点:以下命令的有些地方连一个空格都不能多。类似的地方会着重说明。
操作步骤如下
telnet smtp.163.com 25<ENTER> # 说明:SHELL命令。连接的163邮箱服务器及端口号。
Trying 220.181.12.11…
Connected to smtp.163.com.
Escape character is ‘^]’.
220 163.com Anti-spam GT for Coremail System (163com[20141201]) # 说明:表示连接成功。如果再按<ENTER>键,则直接退出。
helo localhost<ENTER> # 说明:发送HELLO命令,开始会话。
250 OK
auth login<ENTER> # 说明:请求认证登录命令。
334 dXNlcm5hbWU6 # 说明:“username:”的Base64值,提示你输入用户名。
ZG9uZ2hhbmhhbmdAMTYzLmNvbQ==<ENTER> # 将你的用户名base64编码后填入
334 UGFzc3dvcmQ6 # 说明:”Password:”的Base64值,提示你输入密码。这个密码是授权码(登录邮箱客户端使用的那个),不是在网页登录邮箱使用的那个密码。
bGl1a2FpMTM4LC4=<ENTER>
2[……]
「mailutils」- 常见错误汇总
#1 不要在邮件中显示HTML标签
如果传递给mail命令的邮件内容中含有HTML标签,并且希望HTML被解析而不是直接显示在页面上,那你在发送邮件的时候需要指定Content-Type,比如下面的命令:
# echo “<h1>demo</h1>” | mail -s “subject” -a “Content-Type: text/html” demo@example.com
正如上面的命令,在你收件箱中将显示H1渲染后的文本demo。如果你没有使用-a “Content-Type: text/html”,那你收到的邮件就是<h1>demo</h1>。
参考文献
How to send HTML email using linux command line
参考文献
GNU Mailutils项目主页[……]
「FTP」- 文件传送协议,FILE TRACSFER PROTOCOL
问题描述
FTP,用于传送文件的协议。
解决方案
使用 FTP 实现远程文件传输的同时,还能够保证数据传输的可靠性(TCP)和高效性。
原理简述
协议特性
WIP
应用场景
WIP
概念术语
控制连接,数据连接
在 FTP 中,协议连接与数据发送是分离的: 1)Control Connection,控制连接:用于发送控制信息,与 FTP 协议相关; 2)Data Connection,数据连接,用于发送数据(文件);
数据连接三大用途: 1)客户机向服务器发送文件 (上传) 2)服务器向客户机发送文件 (下载) 3)服务器向客户机发送文件列表 (查看那些东西可以下载)
协议模式:主动模式(FTP Server 主动连接 FTP Client)
主动模式,指 FTP Server 主动连接 FTP Client;
1)FTP Client,打开任意的非特权端口 Port-A(>1024),连接 FTP Server 的 21 端口; 2)FTP Client,开始监听端口 Prot-A+1,并发送命令 PORT <Port-A+1> 到 FTP Server; 3)FTP Server,从它的数据端口(20)连接到 FTP Client 的 PortA+1 端口,进行数据发送;
所用端口: 1)21,服务端口; 2)20,数据端口;
但是,很多 FTP Client 都是在内网中(NAT)发起连接,所以 FTP Server 通常无法连接 FTP Client,因此主动模式已经很少使用。
协议模式:被动模式(FTP Server 被 FTP Client 连接)
被动模式,指 FTP Server 被 FTP Client 连接;
1)FTP Client,当创建 FTP 连接时,将打开两个任意的非特权端口(Port-A 和 Port-A+1); 2)FTP Client,使用 Port-A 连接 FTP Server 的 21 端口,然后 FTP Client 发送 PASV 命令给 FTP Server; 3)FTP Server,收到 PASV 指令后,会开启任意的非特权端口(Port-C),并响应 PORT <Port-C> 命令给 FTP Client; 4)FTP Client,发起从端口 Port-A+1 到 FTP Server 的端口 Port-C 的连接用来传送数据。
所用端口: 1)21,服务端口; 2)<port-range>,数据端口;
补充说明: 1)在实际抓包过程中,我们未看到(3)的 PORT <Port-C> 响应(明[……]