• 编程实战:如何在程序中解析域名

    由于域名比 IP 地址更便于记忆,我们通常使用它来访问网络服务。网络应用客户端想要跟服务端通信,必须先向 DNS 服务器查询域名对应的 IP 地址。

    举个例子,读者访问我的网站 fasionchan.com 时,浏览器需要先根据域名查询网站的 IP 地址,再和网站的 Web 服务器进行通信。

    那么,如何通过编程实现域名查询呢?这是开发网络应用无法回避的问题。

    我们知道,DNS 服务器和客户端之间使用 DNS 协议进行通信:客户端先向服务器发送 请求报文 ,服务器将查询结果封装成 应答报文 ,回复客户端。DNS 可以使用 UDP 或 TCP 作为传输层协议,通信端口号为 53 。

    阅读全文
  • 网络编程:开发TCP客户端

    开发网络程序离不开套接字编程,基于 TCP 通信的程序也不例外。我们知道 TCP 应用可以分为 客户端client )和 服务器server )两种角色,本节先介绍如何编写 TCP 客户端程序。

    连接套接字

    UDP 一样,想要发起 TCP 通信,必须通过操作系统提供的 套接字socket )。

    我们知道 TCP 是一个相对复杂的传输层协议,涉及的通信细节非常繁琐:

    • 数据序号;
    • 接收确认( ACK );
    • 超时重传;
    • 流量控制;
    • 拥塞控制;
    • 各种超时定时器;
    • 接收缓冲区;
    • 发送缓冲区;

    如果这些都要每个应用程序单独实现,想想就头大!因此,出于程序复用性考虑,操作系统内核实现了网络协议栈,并将编程接口以套接字形式提供给应用程序。

    阅读全文
  • DNS劫持

    本章,我们系统地学习了域名系统,初步掌握了 DNS 协议和 DNS 服务器工作原理。本节,我们再接再厉,继续研究一个跟 DNS 相关的网络安全问题:DNS劫持

    劫持原理

    根据 DNS 服务器的工作原理,我们知道主机一般依靠本地 DNS 缓存服务器来查询域名。运营商提供互联网接入服务,宽带成功拨号后,它将本区域内的 DNS 缓存服务器提供给客户端。

    阅读全文
  • 网络编程:开发TCP服务器

    上一小节,我们学习了如何编写 TCP 客户端程序,掌握了 socketconnectsendrecvclose 等系统调用的用法。本节我们再接再厉,学习 bindaccept 系统调用,开发一个 TCP 服务器。

    监听套接字

    编写 TCP 服务器同样离不开套接字——服务器需要先创建一个套接字,并监听服务端口:

    监听套接字保存着服务器要监听的地址和端口信息,等待处理客户端的连接请求。当客户端执行三次握手建立连接,SYNC 分组根据目的地址和端口即可找到对应的监听套接字。

    阅读全文
  • TLS传输层安全性协议实现加密传输的秘诀

    我们知道,传输层 TCP 协议负责提供端到端的流式数据传输能力,应用程序在其基础上组织应用层协议。以 HTTP 协议为例,客户端先与服务器建立 TCP 连接,再通过它来发送 HTTP 请求。 由于 TCP 协议只提供最基本的数据传输服务,数据不经加密明文传输,很容易被中间人窃取: 窃听风险( eavesdropping ),第三方获悉敏感信息; 篡改风险( tampering ),第三方修改数据内容; 冒充风险( pretending ),第三方可以冒充他人身份,例如钓鱼网站; 想要保护数据安全,我们就必须对数据进行加密。虽然数据理论上也可以在应用层加密,但这样做并不明智。因为应用层协议有很多,每个协议都自己实现加密逻辑,成本太高: 如果能够在 TCP 协议之上,专门实现新的协议提供加密的流式传输能力,应用层协议设计将得到极大简化。实际上,网络协议栈就是这样实现的: 负责加密实现安全传输的新协议,位于传输层 TCP 协议和应用层协议之间,这就是本文要介绍的 传输层安全性协议( transport layer security ),简称 TLS 。TLS 的前身是 安全套接层( secure sockets layer,SSL ),它实际上是 SSL 的后续版本。 简介 TLS 在 TCP 协议基础上,为应用层提供安全的流式数据传输能力,主要实现两个功能: 服务端身份认证 服务端提供数字证书用于身份校验 HTTPS 利用这个特性预防钓鱼网站 数据加密传输 采用对称加密算法加密数据 对称加密密钥由非对称加密算法加密保护 TLS 协议内部进一步分为四个子协议,各自负责一部分子功能: 握手协议( handshake protocol ),主要完成证书验证,并协商主加密密钥; 密钥规格变更协议( change cipher spec protocol ),主要用于更改密钥规格; 应用数据协议( application data protocol ),根据主加密密钥加密应用传输的数据; 警报协议( alert protocol ),用于传递告警消息,接到致命级别的告警则立即关闭连接; 每个 TLS 子协议分别承担自己的职责,也有自己的协议报文,由位于底层的 记录协议( record protocol )承载。换言之,TLS 协议报文分为两层,记录协议负责描述报文的类型、协议版本、长度和内容等基本信息。记录协议中的内容则承载着子协议的报文,而类型字段则表明子协议报文的类型。
    阅读全文
  • Nginx服务器安装配置教程

    Nginx 是目前最流行的 Web 服务器软件,没有之一。它不仅配置灵活,性能也不错,能够轻松支撑高并发访问。本节简单介绍一下如何在 Linux 服务器上安装、配置 Nginx 服务器。

    安装

    不同 Linux 发行版,程序包安装工具略有不同。在 Ubuntu 下,可以执行 apt 命名进行安装:

    1
    
    $ apt install nginx
    

    服务启停

    Nginx 安装好后,可能还没启动。我们可以执行 service 命令查看运行状态:

    1
    2
    
    $ service nginx status
     * nginx is not running
    
    阅读全文
  • QUIC 协议

    QUIC ,即 快速UDP网络连接 ( Quick UDP Internet Connections ), 是由 Google 提出的实验性网络传输协议 ,位于 OSI 模型传输层。 QUIC 旨在解决 TCP 协议的缺陷,并最终替代 TCP 协议, 以减少数据传输,降低连接建立延迟时间,加快网页传输速度。

    QUIC 主要特点有:

    • 多流设计;
    • 低等待延迟;
    • 加密性能更优;
    • 前向纠错;
    • 应用程序实现;
    • 连接保持;
    阅读全文
  • 用socat转发端口

    socatSOcket CAT )是一个多用途双向套接字数据转接工具。

    socatNetCat 类似,但功能更强大,也更安全(支持 chroot )。它兼容多种协议,支持操作 文件 ( file )、 管道 ( pipe )、 设备 ( device )、 TCP 套接字、 Unix 套接字、 SOCKS 客户端、 CONNECT 代理以及 SSL 等等。

    安装

    Linux

    Linux 系统,使用包管理器进行安装,以 Debian/Ubuntu 为例:

    1
    
    apt update && apt install socat
    
    阅读全文
  • HAProxy高可用负载均衡服务器配置

    HAProxy 是一款开源负载均衡软件,同时提供 4 层( TCP )和 7 层( HTTP )代理。

    负载均衡

    由于普通机器单机处理能力以及可靠性的限制,服务需要在多台机器进行部署,形成集群。这主要出于以下两方面的考虑:

    1. 提高可靠性;
    2. 提高处理能力;

    那么,用户(或客户端)如何访问多实例服务呢?

    最简单的方案是在客户端进行重试。以 DNS 解析为例,用户可以配置多台 DNS 服务器,一台查询失败则尝试另外一台:

    阅读全文
  • rinetd端口转发工具

    进行网络编程、服务部署时,经常需要临时对一些端口进行转发。

    举个例子,笔者开发过一个 Agent 软件——它部署于集群每台服务器上,对其上的某个服务进行管理,需要连接服务端口。我在本地进行开发,需要部署一套相同的服务,这多少有些麻烦。如果可以在本地部署端口转发服务,监听服务端口,将请求转发至部署有该服务的测试机,便可完美解决问题。

    端口转发方案很多,SSH端口转发 , NAT 端口转发,甚至 HAProxy 之类的工具都可以排上用场。然而,应对开发调试这种 临时需求rinetd 就能胜任,它足够简单轻量级,依赖也少。

    请不要将 rinetd 应用到生产服务!

    rinetd 底层采用 select 而不是 epoll 实现。众所周知, select 有致命缺陷,一次能处理的 文件描述符(套接字)非常有限,效率也比较低下。

    因此,在高并发环境采用rinetd无异于自杀

    更多细节可参考文章:rinetd 在生产环境要谨慎使用

    阅读全文