分类目录归档:FreeBSD

TCP连接的状态与关闭方式

TCP连接的状态与关闭方式,及其对Server与Client的影响

1TCP连接的状态

首先介绍一下TCP连接建立与关闭过程中的状态。TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用、特定数据包以及超时等,具体状态如下所示:

  • CLOSED初始状态,表示没有任何连接。
  • LISTENServer端的某个Socket正在监听来自远方的TCP端口的连接请求。
  • SYN_SENT发送连接请求后等待确认信息。当客户端Socket进行Connect连接时,会首先发送SYN包,随即进入SYN_SENT状态,然后等待Server端发送三次握手中的第2个包。
  • SYN_RECEIVED收到一个连接请求后回送确认信息和对等的连接请求,然后等待确认信息。通常是建立TCP连接的三次握手过程中的一个中间状态,表示Server端的Socket接收到来自Client的SYN包,并作出回应。
  • ESTABLISHED表示连接已经建立,可以进行数据传输。
  • FIN_WAIT_1主动关闭连接的一方等待对方返回ACK包。若Socket在ESTABLISHED状态下主动关闭连接并向对方发送FIN包(表示己方不再有数据需要发送),则进入FIN_WAIT_1状态,等待对方返回ACK包,此后还能读取数据,但不能发送数据。在正常情况下,无论对方处于何种状态,都应该马上返回ACK包,所以FIN_WAIT_1状态一般很难见到。
  • FIN_WAIT_2主动关闭连接的一方收到对方返回的ACK包后,等待对方发送FIN包。处于FIN_WAIT_1状态下的Socket收到了对方返回的ACK包后,便进入FIN_WAIT_2状态。由于FIN_WAIT_2状态下的Socket需要等待对方发送的FIN包,所有常常可以看到。若在FIN_WAIT_1状态下收到对方发送的同时带有FIN和ACK的包时,则直接进入TIME_WAIT状态,无须经过FIN_WAIT_2状态。
  • TIME_WAIT主动关闭连接的一方收到对方发送的FIN包后返回ACK包(表示对方也不再有数据需要发送,此后不能再读取或发送数据),然后等待足够长的时间(2MSL)以确保对方接收到ACK包(考虑到丢失ACK包的可能和迷路重复数据包的影响),最后回到CLOSED状态,释放网络资源。
  • CLOSE_WAIT表示被动关闭连接的一方在等待关闭连接。当收到对方发送的FIN包后(表示对方不再有数据需要发送),相应的返回ACK包,然后进入CLOSE_WAIT状态。在该状态下,若己方还有数据未发送,则可以继续向对方进行发送,但不能再读取数据,直到数据发送完毕。
  • LAST_ACK被动关闭连接的一方在CLOSE_WAIT状态下完成数据的发送后便可向对方发送FIN包(表示己方不再有数据需要发送),然后等待对方返回ACK包。收到ACK包后便回到CLOSED状态,释放网络资源。
  • CLOSING比较罕见的例外状态。正常情况下,发送FIN包后应该先收到(或同时收到)对方的ACK包,再收到对方的FIN包,而CLOSING状态表示发送FIN包后并没有收到对方的ACK包,却已收到了对方的FIN包。有两种情况可能导致这种状态:其一,如果双方几乎在同时关闭连接,那么就可能出现双方同时发送FIN包的情况;其二,如果ACK包丢失而对方的FIN包很快发出,也会出现FIN先于ACK到达。 继续阅读

让FreeBSD更安全

我们都知道Internet并不总是一个友好的地方,而且你可能也不想让另一个地方的人拥有与你一样的访问许可权限。这意味着你可能不希望在没有某种防火墙的前提下访问Internet。幸运的是,你的FreeBSD系统支持良种防火墙:ipfw 和 ipfilter。更令人振奋的是,通俗易懂的文档正在迅速增加。如果你不在防火墙后面,那么请花一个周六下午的时间读一读如何在你的系统上配置防火墙的文章,并操练一把。你将为此感到愉快,以下是一部分可用的资源:
继续阅读

Freebsd内核的http请求过滤器

Freebsd在2000年的时候就有这个功能,他的作用是前端过滤未完整的http请求,将完整的http请求转发给后端app server(Apache)。

原文:

 accf_http -- buffer incoming connections until a certain complete HTTP
     requests arrive

目的有两个:
1、  也许后面根本没有HTTP请求过来;
2、  请求不完整,属于非法请求;

这样,Apache将派生很多的子进程(假设为prefork模式)去处理这些也许没有用的(可能是SYN FLOOD)连接,最后进程数满,Apache不堪重负。

FreeBSD实现的接收过滤器明确的延迟了accpet()的返回,只有当满足了一定的条件后,比如一个完整的HTTP/1.0或者HTTP /1.1 HEAD或者GET请求完全被FreeBSD内核缓存之后才返回。HEAD和GET之外的其他请求仍然直接有accpet()进程处理。这样后续的读写 socket操作就不需要等待客户端的请求数据。因此,每个Apache就能处理更多的有效连接。也可以使子进程在accpet()返回后立即处理请求, 因为这个HTTP请求已经建立而且可以read(),这样就减少了Apache进程在执行初始的请求解析(解析HTTP请求)前,执行过多的上下文切换 (Context Switch).  FreeBSD通过accf_http和accf_data(kldload accf_http)来实现接收过滤,Apache相关配置语法为AcceptFilter protocol accept_filter,如

AcceptFilter http httpready
AcceptFilter https dataready

httpready接收过滤器(Accept Filter)在内核级别缓冲整个HTTP请求。一旦一个请求体被完整接收,内核将把它发送给服务器。因为HTTPS请求已经被加密了,所以只使用了 accf_data(9)过滤器。 注:FreeBSD 6.1必须载入这个模块才能启动Apache2.2,FreeBSD6.2及后续版本不管是否加载这个模块都可以启动Apache,默认不加载,可以在 /etc/rc.conf中加入:apache22_http_accept_enable=”YES”进行启动时自动加载。

Linux上的默认值是:
AcceptFilter http data
AcceptFilter https data

Linux的TCP_DEFER_ACCEPT并不支持对http请求进行缓冲。除none之外的任何值都将在监听程序上启用 TCP_DEFER_ACCEPT 。参见tcp(7)手册页以获得更多详情。使用none将会为那个协议禁用接收过滤器(accept filter)。这对于像nntp这样需要服务器先发送数据的协议很有用处:
AcceptFilter nttp none

NetScaler似乎也使用了同样的思想,只将真正的HTTP请求数据发送给后端服务器,而之前的3次TCP握手都由NetScaler本身处理,大大提升了服务器的吞吐量。

在FreeBSD中启用此功能的方法:

The accf_http kernel option is also a module that can be enabled at run-
     time via kldload(8) if the	INET option has	been compiled into the kernel.
#kldload accf_http并将/boot/defaults/loader.conf中,以便下次启动自动装载模块

accf_data_load=”YES”
accf_http_load=”YES”   改了这一个就可以启动了。

 

FreeBSD 技术上的先进性

FreeBSD 提供了许多先进特性

无论运行何种应用, 您总会希望系统资源发挥其最大潜能。 FreeBSD 的先进特性, 能够帮助您达成这一目的。

基于 4.4BSD 的完整操作系统

FreeBSD 的高贵根基, 派生于来自加州大学伯克利分校计算机系统研究小组最新的 BSD 软件版本。 因此, 由 4.4BSD 系统架构师们撰写的 The Design and Implementation of 4.4BSD Operating System (4.4BSD 操作系统的设计与实现) 也详细地介绍了 FreeBSD 的大部分核心功能。

来自全球各地的富有经验和开发技能的志愿者的长期努力, 使得 FreeBSD Project 得以在许多方面拓展 4.4BSD 操作系统的能力, 并不断使这一操作系统的每一个新版本更为稳定、 性能更好, 并提供用户所需的各种新功能。

FreeBSD 不仅提供了更好的性能, 也提供了更好的与其它操作系统的兼容性, 于此同时, 其所需要的人工管理和干预却比其他操作系统更少。

FreeBSD 的开发人员解决了许多操作系统设计上的疑难问题, 能够为您提供许多先进特性:

  • 与虚拟内存整合的文件系统快取缓存 能够持续地调整用于程序和磁盘快取缓存的内存量。 其结果是, 不仅为应用程序提供了良好的内存管理, 也提供了更高的磁盘访问性能, 并将系统管理员从调整快取缓存尺寸的工作中解放出来。
  • 兼容性模块 使得其他操作系统的应用程序能够在 FreeBSD 上正确运行, 目前已经能够兼容为 Linux、 SCO UNIX, 以及 System V Release 4 所编译的二进制形式的程序。
  • Soft Updates 在不牺牲安全性和可靠性的情况下, 大大改善了文件系统性能。 它能够分析文件系统的元数据操作, 并避免以同步方式执行全部操作。 它维护关于元数据操作的一组内部状态, 并利用这些信息对元数据进行缓存, 并通过重新组织元数据操作的方法, 来合并对同一文件的后续操作, 并重新排列元数据操作, 以便使其更为有效地进行处理。 包括后台文件系统检查, 以及文件系统快照等在内的一系列功能, 均是在 soft updates 所提供的一致性和性能基础之上完成的。
  • 文件系统快照, 使得管理员能够获得文件系统的原子快照, 并利用文件系统中的剩余空间来实现备份以及 后台 fsck, 使系统立即进入多用户模式, 而无需等待突然断电之后所需的文件系统清理操作。
  • 支持 安全 IP (IPsec) 为网络提供了更好的安全性, 并支持下一代 Internet 协议, IPv6。 FreeBSD 的 IPsec 实现同时还支持许多 硬件加密加速设备
  • 直接可用的 IPv6 支持 来自 KAME 的 IPv6 协议栈, 使得 FreeBSD 得以无缝地接入下一代网络环境。 FreeBSD 甚至还附带了许多支持 IPv6 的应用程序!
  • 多线程的 SMP 架构 能够在多个处理器上并行地运行内核, 配合 抢占式内核, 使得高优先级的内核任务能够抢占其他内核动作, 从而缩短响应时间。 这包括了 多线程的网络协议栈 以及 多线程的虚拟内存子系统。 从 FreeBSD 6.x 开始, 完全并行执行的 VFS, 使得 UFS 文件系统能够同时在多个处理器上执行, 从而使得 CPU-密集的 I/O 优化所造成的负荷得以分担。
  • 通过 pthread 接口提供的 M:N 应用程序线程支持 使得线程能够以具有强适应性的方式在多个 CPU 上执行, 并将许多用户线程映射为少量 内核调度实体(KSE)。 通过采用 调度器激活(Scheduler Activation) 模型, 线程支持能够适应更多应用程序的需要。
  • Netgraph 可插入式网络协议栈, 使开发人员能够很容易地通过清晰的网络层次抽象来动态扩展网络协议栈。 Netgraph 节点能够实现各式各样的新网络服务, 包括封装、 隧道、 加密, 以及性能适配。 其结果是, 能够轻易地迅速完成原形构建, 以及产品级的部署, 也减少了引入新问题的机会。
  • 可扩展的内核安全 TrustedBSD MAC 框架, 能够使开发人员为特定的环境定制操作系统的安全模型, 无论是建立强化的安全策略, 还是部署完整性策略的强制性机密标签。 示范的安全策略包括 多级别安全 (MLS), 以及 Biba 完整性保护。 第三方模块包括 SEBSD, 一种基于 FLASK 实现的 Type Enforcement
  • GEOM 可插入式存储层, 使您能够迅速开发并将新的存储服务完全集成进 FreeBSD 存储系统。 GEOM 提供了一致和连贯的模型, 用于发现和堆叠存储服务, 从而使层次式服务, 如 RAID 和卷管理更为容易。
  • FreeBSD 基于 GEOM 的磁盘加密 (GBDE), 通过 GEOM 框架提供了强加密保护, 并能用于保护文件系统、 交换区设备, 以及其他保存在存储介质上的数据。
  • 内核队列(Kernel Queues, kqueue) 使得应用程序能够更为高效地响应各种异步事件, 包括文件和 socket IO, 从而改善应用程序和系统性能。
  • 数据接收过滤器 (Accept Filters) 使得类似 web 服务器这样的连接密集型应用, 能够将它们的部分功能, 完全放入操作系统内核进行, 从而改善性能。
  • FreeBSD 提供了一系列用于保护网络和服务器的安全功能。

    FreeBSD 的开发人员在关注性能和稳定性的同时, 也同样非常关注安全。 FreeBSD 包含了内核级的 状态式 IP 防火墙, 以及许多其他服务, 如 IP 代理网关访问控制表强制式访问控制基于 jail 的虚拟主机, 以及 加密保护的存储。 这些功能可以用于支持高度安全地为不同的不受信客户或消费者提供托管服务, 为网络进行可靠的分区, 以及建立安全的信息净化和信息流传递途径。

    FreeBSD 也包含了对于加密软件、 安全 shell (SSH)、 Kerberos 认证、 通过 jail 建立 “虚拟服务器”、 通过 chroot 服务限制应用程序访问文件系统的能力, 安全 RPC 机制, 以及为支持 TCP wrapper 的服务建立访问控制表等多种能力。

Unison双向文件同步

Unison做双向文件同步非常不错。

server a
unison /usr/www/ ssh://root@b//home/www/ -batch

server b
unison /home/www/ ssh://root@b//usr/www/ -batch

 

在一个项目中使用效果非常不错,比rsync方便一点点。

Merry Christmas from the FreeBSD Security Team

Hi all,

 

No, the Grinch didn’t steal the FreeBSD security officer GPG key, and your eyes

aren’t deceiving you: We really did just send out 5 security advisories.

 

The timing, to put it bluntly, sucks. We normally aim to release advisories on

Wednesdays in order to maximize the number of system administrators who will be

at work already; and we try very hard to avoid issuing advisories any time close

to holidays for the same reason. The start of the Christmas weekend — in some

parts of the world it’s already Saturday — is absolutely not when we want to be

releasing security advisories.

 

Unfortunately my hand was forced: One of the issues (FreeBSD-SA-11:08.telnetd)

is a remote root vulnerability which is being actively exploited in the wild;

bugs really don’t come any worse than this. On the positive side, most people

have moved past telnet and on to SSH by now; but this is still not an issue we

could postpone until a more convenient time.

 

While I’m writing, a note to freebsd-update users: FreeBSD-SA-11:07.chroot has a

rather messy fix involving adding a new interface to libc; this has the awkward

side effect of causing the sizes of some “symbols” (aka. functions) in libc to

change, resulting in cascading changes into many binaries. The long list of

updated files is irritating, but isn’t a sign that anything in freebsd-update

went wrong.

haproxy安装配置

    HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代 理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。 继续阅读

FreeBSD做链路聚合与故障转移

我们将 FreeBSD 的两个网口作为一个负载均衡和故障转移链路聚合组接到交换机上。 在此基础上, 还可以增加更多的网口, 以提高吞吐量和故障容灾能力。 由于以太网链路上两节点间的帧序是强制性的, 因此两个节点之间的连接速度, 会取决于一块网卡的最大速度。 传输算法会尽量采用更多的信息, 以便将不同的网络流量分摊到不同的网络接口上, 并平衡不同网口的负载。 继续阅读