当前位置:文档之家› 网络相关

网络相关

TCP优化指导

以下是如何最大化TCP WAN吞吐量的技术摘要。

TCP使用一种称为“拥塞窗口”的机制来决定在同一时间能够传送多少数据包,拥塞窗口越大,吞吐量越。TCP使用“slow start”和“congestion avoidance”算法来决定拥塞窗口的大小。最大的拥塞窗口大小与内核分配给每个socket的缓冲空间数量有关。对于每个socket都有一个默认的缓冲大小,这个大小可以改变,在打开这个socket之前,应用程序可以使用系统库调用更改这个大小。另外,内核还会强制指定一个最大的缓冲数值。The buffer size can be adjusted for both the send and receive ends of the socket.

获得最大的吞吐量的关键是针对你所使用的连接类型最佳化TCP接收和发送的socket缓冲区的大小。如果缓冲太小,那么TCP拥塞窗口永远不会全部打开。如果接收缓冲过大,TCP的流量控制会失效,发送方的流量会造成接收方的溢出,从而导致TCP窗口关闭,这种问题通常发生在发送方主机比接收方主机快的情况下。如果有足够的内存,那么很大的窗口在发送一方不会产生太大的问题。

最佳的缓冲大小应该是 链路带宽*延时乘积的两倍

buffer size = 2 * bandwidth * delay

使用ping 可以获得延时的大小,使用类似pathrate的工具可以获得端到端的容量(链路中最慢的一跳的带宽)。因为ping可以给出round trip
time (RTT),通常可以使用下面的公式替代上边的那个:

buffer size = bandwidth * RTT

举例来说,如果ping值是50ms,端到端的网络全部由100M以太网组成,那么TCP缓冲的大小应该是:

0.05 sec * (100 Mbits / 8 bits) = 625 KBytes

你需要了解的TCP设置有两个,一个是 default TCP发送和接收的缓冲大小,另一个是maximum TCP发送和接收的缓冲大小。当前的类unix系统的maximum TCP缓冲大小只有256KB!关于如何调整maximum TCP缓冲的大小,请参考不同的操作系统设置方法。注意,不要将default 缓冲值设置大于128KB,因为这可能会降低LAN的性能。因此你需要在发送者和接收者两边都使用Unix setsockopt调用来设置缓冲区的大小。

====================================================================
Linux系统的调节

因为2.4和2.6内核有很大的不同,因此我们首先调整两者相同的部分:
将下边的内容加入/etc/sysctl.conf,然后运行 "sysctl -p"

# increase TCP max buffer size
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# increase Linux autotuning TCP buffer limits
# min, default, and max number of bytes to use
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

注: 请保持tcp_mem不动,默认值可以很好的工作。

另外一个可以增加TCP吞吐量的参数是增加网卡的队列大小,参考以下命令:



ifconfig eth0 txqueuelen 1000

我曾经在一条很长而且很快的线路上做了上边的修改,结果带宽增加了近8倍!!当然这仅仅对于那些使用GigaEthernet连接的主机来说是个好主意,而且可能会有副作用,例如uneven sharing between multiple streams。

Linux 2.4

Starting with Linux 2.4, Linux has implemented a sender-side autotuning mechanism, so that setting the opitimal buffer size on the sender is not needed. This assumes you have set large buffers on the recieve side, as the sending buffer will not grow beyond the size of the recieve buffer.
However, Linux 2.4 has some other strange behavior that one needs to be aware of. For example: The value for ssthresh for a given path is cached in the routing table. This means that if a connection has has a retransmition and reduces its window, then all connections to that host for the next 10 minutes will use a reduced window size, and not even try to increase its window. The only way to disable this behavior is to do the following before all new connections (you must be root):

sysctl -w net.ipv4.route.flush=1

More information on various tuning parameters for Linux 2.4 are available in the Ipsysctl tutorial .

Linux 2.6

Starting in Linux 2.6.7 (and back-ported to 2.4.27), BIC TCP is part of the kernel, and enabled by default. BIC TCP helps
recover quickly from packet loss on high-speed WANs, and appears to work quite well. A BIC implementation bug was discovered, but this was fixed in Linux 2.6.11, so you should upgrade to this version or higher.

Linux 2.6 also includes and both send and receiver-side automatic buffer tuning (up to the maximum sizes specified above).

There is also a setting to fix the ssthresh caching weirdness described above.

There are a couple additional sysctl settings for 2.6:

# don't cache ssthresh from previous connection
net.ipv4.tcp_no_metrics_save = 1
# recommended to increase this for 1000 BT or higher
https://www.doczj.com/doc/e21370419.html,dev_max_backlog = 2500
# for 10 GigE, use this
# https://www.doczj.com/doc/e21370419.html,dev_max_backlog = 30000

Starting with version 2.6.13, Linux supports pluggable congestion control algorithms . The congestion control algorithm used is set using the sysctl variable net.ipv4.tcp_congestion_control, which is set to Reno by default. (Apparently they decided that BIC was not quite ready for prime time.) The current set of congestion control options are:

* reno: Traditional TCP used by almost all other OSes. (default)
* bic: BIC-TCP
* highspeed: HighSpeed TCP: Sally Floyd's suggested algorithm
* htcp: Hamilton TCP
* hybla: For satellite links
* scalable: Scalable TCP
* vegas: TCP Vegas
* westwood: optimized for lossy networks

For very long fast paths, I suggest trying HTCP or BIC-TCP if Reno is not is not performing as desired. To set this, do the following:

sysctl -w net.ipv4.tcp_congestion_control=htcp

More information on each

of these algorithms and some results can be found here .

Note: Linux 2.6.11 and under has a serious problem with certain Gigabit and 10 Gig ethernet drivers and NICs that support "tcp segmentation offload", such as the Intel e1000 and ixgb drivers, the Broadcom tg3, and the s2io 10 GigE drivers. This problem was fixed in version 2.6.12. A workaround for this problem is to use ethtool to disable segmentation offload:
ethtool -K eth0 tso off
This will reduce your overall performance, but will make TCP over LFNs far more stable.

More information on tuning parameters and defaults for Linux 2.6 are available in the file ip-sysctl.txt, which is part of
the 2.6 source distribution.

And finally a warning for both 2.4 and 2.6: for very large BDP paths where the TCP window is > 20 MB, you are likely to hit the Linux SACK implementation problem. If Linux has too many packets in flight when it gets a SACK event, it takes too long to located the SACKed packet, and you get a TCP timeout and CWND goes back to 1 packet. Restricting the TCP buffer size to about 12 MB seems to avoid this problem, but clearly limits your total throughput. Another solution is to disable SACK.

Linux 2.2

If you are still running Linux 2.2, upgrade! If this is not possible, add the following to /etc/rc.d/rc.local

echo 8388608 > /proc/sys/net/core/wmem_max
echo 8388608 > /proc/sys/net/core/rmem_max
echo 65536 > /proc/sys/net/core/rmem_default
echo 65536 > /proc/sys/net/core/wmem_default

====================================================================
Windows系统的调节

使用注册表编辑器修改下边的键值

# turn on window scale and timestamp option
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Tcp1323=3
# set default TCP window size (default = 16KB)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpWindowSize=131400
# and maybe set this too: (default = not set )
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\GlobalMaxTcpWindowSize=16777216

进一步信息请参考:
https://www.doczj.com/doc/e21370419.html,/default.aspx?scid=kb;en-us;314053
https://www.doczj.com/doc/e21370419.html,/technet/itsolutions/network/deploy/depovg/tcpip2k.mspx
https://www.doczj.com/doc/e21370419.html,/read_articles.php?id=157
====================================================================
FreeBSD系统的调节

将下面的内容添加到/etc/sysctl.conf中,然后重启。

kern.ipc.maxsockbuf=16777216
net.inet.tcp.rfc1323=1
net.inet.tcp.sendspace=1048576
net.inet.tcp.recvspace=1048576

进一步信息请参考FreeBSD Network Tuning Performance Tuning Guide

https://www.doczj.com/doc/e21370419.html,/files/pub/FreeBSD_Network_Tuning_-_slides.pdf
ipvsadm命令参考(lna@https://www.doczj.com/doc/e21370419.html, 翻译 ipvsadm v1.21 2004 年4 月)
对ipvsadm 的命令参考,并根据自己使用的经验,进行了一个简单的翻译,希望对ipvsadm 的使用者有一定的帮助。
为了更好的让大家

理解这份命令手册,将手册里面用到的几个术语先简单的介绍一下:

1,virtual-service-address:是指虚拟服务器的ip 地址
2,real-service-address:是指真实服务器的ip 地址
3,scheduler:调度方法

ipvsadm 的用法和格式如下:
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p
[timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port
[-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface]
ipvsadm --stop-daemon
ipvsadm -h

命令选项解释:

有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可以。

-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D --delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C --clear 清除内核虚拟服务器表中的所有记录。
-R --restore 恢复虚拟服务器规则
-S --save 保存虚拟服务器规则,输出为-R 选项可读的格式
-a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增 加一台新的真实服务器
-e --edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d --delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l --list 显示内核虚拟服务器表
-Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)
--set tcp tcpfin udp 设置连接超时值
--start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在 这个功能上也可以采用keepalived 的VRRP 功能。
--stop-daemon 停止同步守护进程
-h --help 显示帮助信息

其他的选项:

-t --tcp-service service-address
说明虚拟服务器提供的是tcp 的服务[vip:port] 或 [real-server-ip:port]
-u --udp-service service-address
说明虚拟服务器提供的是udp 的服务[vip:port] 或 [real-server-ip:port]
-f --fwmark-service fwmark
说明是经过iptables 标记过的服务类型。
-s --scheduler scheduler
使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc.
-p --persistent [timeout]

持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。 timeout 的默认值为300 秒。
-M --netmask netmask
persistent granularity mask
-r --real-server server-address
真实的服务器[Real-Server:port]
-g --gatewaying
指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i --ipip 指定LVS 的工作模式为隧道模式
-m --masquerading
指定LVS 的工作模式为NAT 模式
-w --weight weight
真实服务器的权值
--mcast-interface interface
指定组播的同步接口
-c --connection
显示LVS 目前的连接 如:ipvsadm -L -c
--timeout
显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemon
显示同步守护进程状态
--stats
显示统计信息
--rate
显示速率信息
--sort
对虚拟服务器和真实服务器排序输出
--numeric -n
输出IP地址和端口的数字形式
OpenVPN配合WiKID实现OTP(One-Time Password)用户认证
最近公司领导对VPN的安全性提出了更高的要求,领导希望采用动态口令卡的形式,采用一次性口令。经过了解做得最好的是RSA公司的SecureID解决方案,无奈价码太高。经过Google,找到了一个开源的商业动态口令解决方案,虽然是商业软件,但是有GPL版,下面是我实际测试的经过。
本文主要讲述如何设置OpenVPN配合WiKID来进行two-factor的强认证。首先,我们将配置PAM插件来使用Radius进行认证,然后配置OpenVPN使用PAM插件和一次性口令,然后我们将在WiKID服务器上为OpenVPN创建一个客户帐号。我在这里不会详细说明如何安装这些服务器,因为他们的官方网站都有很好的howto,请自行参考。我们的重点是如何配置它们以便使它们协同工作。

Step1.配置 PAM
首先我们要安装PAM Radius,在其官方网站(https://www.doczj.com/doc/e21370419.html,/pam_radius_auth/)上有非常详细的文档来说明如何安装。另外,也可以在网上找到为不同发行版编译的二进制版本。

下载pam_radius_auth的最新版本源码,当前版本为1.3.17(ftp://https://www.doczj.com/doc/e21370419.html,/pub/radius/pam_radius-1.3.17.tar.gz)
tar xvzf pam_radius-1.3.17.tar.gz
cd pam_radius_1.3.17
make
cp pam_radius_auth.so /lib/security/
cp pam_radius_auth.conf /etc/raddb/server
修改/etc/raddb/server
vi /etc/raddb/server

找到下边这一行:
127.0.0.1 secret 1
在它的下边增加这一行:
routableIPaddress shared_secret 1
请使用你自己的WiKID服务器的IP地址来替换routableI

Paddress

创建/etc/pam.d/openvpn来允许使用Radius认证
vi /etc/pam.d/openvpn
文件内容如下:
#%PAM-1.0
auth required /lib/security/pam_radius_auth.so
account required /lib/security/pam_radius_auth.so
修改过以后:wq保存退出

使用"Required"标记来要求一个强认证,如果使用“sufficient” 标记指出如果Radius认证成功以后将不会再要求进行其他方式的认证。但是如果Radius认证失败,那么将会使用系统帐户和密码认证。具体参考The Linux-PAM System Administrators' Guide(https://www.doczj.com/doc/e21370419.html,/pub/linux/libs/pam/Linux-PAM-html/Linux-PAM_SAG.html)

Step2.配置OpenVPN使用two-factor 认证

安装好Openvpn服务器,可参考官方的文档https://www.doczj.com/doc/e21370419.html,/howto.html

在server.conf中加入下边这行

plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so openvpn

如果不在需要用户使用证书,可以加入下边两行

client-cert-not-required
username-as-common-name

注意!不使用证书不表示隧道不加密!!! 这只表示不再要求每个客户端都必须要有证书。这样可以提高OpenVPN的可扩展性。

然后在客户端一边,在配置文件client.conf 或者client.opvn中加入下边一行:

auth-user-pass

如果你在上边已经取消了客户端证书的要求,那么必须注释掉下边两行:

#cert client.crt
#key client.key

Step3.配置WiKID服务器
下面我们将要配置WiKID服务器来处理来自OpenVPN的一次性口令。我们假设你同时也需要新建一个WiKID域,如果你已经有一个域了那可以跳过这部分。
1、登陆到WiKID服务器,初始化Radius认证Module。选择Configuration标签,点击-- Enable Protocol Modules --,在接下来的页面中点击Radius,填入Radius服务器的ip地址,shared secret等必要信息,然后点击update。这时系统会提示重新启动WiKID服务器。在控制台中输入 stop,然后输入start。然后,重新登陆,选择Domains标签,点击Create a New Domain
2、输入必要的信息,Domain Server code 是用0补齐的WiKID服务器IP地址,例如服务器的地址为216.239.51.99,那么Server code就是216239051099 。点击Create(如果你已经有一个域了,那么显然你可以跳过这一步)
3、选择Network Clients标签,点击"Create a new Network Client"
4、输入必要的信息,IP地址位置填入OpenVPN服务器的地址。选择刚建立的Radius和Domain,完成以后点击"Add" 。
5、在接下来的页面输入你在/etc/raddb/server中填写的OpenVPN的shared secret 。在"Return Attributes".下边可以什么都不用输。

重要:需要在控制台或SSH中输入stop然后输入start 来让WiKID服务器载入新的配置

这样就可以了,你现在可以使用WiKID token client 来产生一次性口令来登陆OpenVPN了。可以访问WiKID的主页获得更进一步的信息https://www.doczj.com/doc/e21370419.html,/

WiKID工作机制


当用户登陆时需要选择他们想要登陆到的域(WiKID可以在单客户端上支持多个域,这点比硬件令牌强),然后输入他们的PIN。输入的PIN和一个 single-use AES symmetric key会被用客户的私钥加密。服务器接到请求后会解密OPT请求,如果PIN正确且该帐户处于激活状态,服务器产生一个一次性口令,并使用客户端的公钥和 single-use AES symmetric key来加密。用户得到服务器发回的一次性口令,然后使用这个口令登陆。无论用户使用一次性口令登陆的是哪种服务都会通过网络客户端将用户名和密码返回到WiKID服务器进行确认。
入手一个Treo 650 ,从此咱也是“胖子”了!
上个月月底在中关村入手一个Treo 650,是灰色面板三码和一的。把玩到现在已经有2周多了,越发感觉这款手机的功能强大。
头几天乱装软件重启过几次,不过慢慢摸出了合自己心意的软件组合。入手一周后耐不住跃跃欲试的心,狠心刷了网上著名的
“查无此人ROM”,过程没出什么问题,刷完后发现稳定性真是一个字:赞!
下边列出了我的650上装得软件,经过测试非常稳定的运行在我的650上:

1、KB lights Off 关闭键盘灯用的
2、LED OFF 关闭信号LED用的
3、Uninstall Manager 卸载软件用
4、CleanLST 清除短信发件人列表
5、Resco Explorer 文件管理器
6、MultiUserHack 管理破解软件注册名称的软件
7、Card Reader 将650当成优盘联到电脑的软件
8、Tibr pro 电子书阅读器
9、CallFilter 铃声分组和来电防火墙,我用的是1.3.1的版本,稳定性和功能都非常好
10、梅花输入法 好用的拼音输入法,发短信飞一般
11、PMT xl 个人财务管理软件
12、Datebk6 个人日程管理软件
13、Ptunes Mp3播放软件
14、Profiles 配置文件切换

实时统计每用户Session数
当前有个需求,就是在Linux网关上实时统计内网的用户每个ip的Session数,实现方法如下:

cat /proc/net/ip_conntrack|wc -l

上边这个命令可以统计当前的session总数,可以将它保存成文件。

cat /proc/net/ip_conntrack|awk ' { print $5 } '|grep 'src=' > tempfile

然后用下边这条命令来统计每个ip的Session数量:

awk '{count[$1]++}END{for(i in count)print i,count[i]}' tempfile|sort -g -k 2

输出的结果类似下边:

src=192.168.0.105 1
src=192.168.30.13 1
src=192.168.30.152 1
src=192.168.30.155 1
src=192.168.31.162 1
src=192.168.31.243 1
src=192.168.31.55 1
src=192.168.32.226 1
src=192.168.34.236 1
src=192.168.4.107 1
src=192.168.4.117 1
annot open /var/log/sa/sa31: No such file or directory
sar命令是用来进行系统性能分析的工具,在centos中可以用yum安装
yum install sysstat

在第一次不带参数运行sar时可能会出现下面的错误提

示,其中xx为日期数字,如22,31:
Cannot open /var/log/sa/saxx: No such file or directory

然后稍等一下再执行会发现又可以了,这个问题是由于不带刷新参数执行sar时,系统会认为你想要查询sar的历史文件,一般在/var/log/sa/下,文件名为sa31之类。但是系统默认不会建立该文件,是由root的cron进程来建立的,在CentOS下该cron文件是/etc/cron.d/sysstat
该文件会每隔十分钟来运行一次sa1建立saxx的文件。

[root@GZ-Gateway-1G-Backup cron.d]# cat sysstat
# run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib/sa/sa1 1 1
# generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib/sa/sa2 -A

[root@GZ-Gateway-1G-Backup cron.d]# cd /usr/lib/sa/sa1
-bash: cd: /usr/lib/sa/sa1: Not a directory
[root@GZ-Gateway-1G-Backup cron.d]# file /usr/lib/sa/sa1
/usr/lib/sa/sa1: Bourne shell script text executable
[root@GZ-Gateway-1G-Backup cron.d]# cat /usr/lib/sa/sa1
#!/bin/sh
# PREFIX/lib/sa/sa1.sh
# (C) 1999-2004 Sebastien Godard (sysstat wanadoo.fr)
#
umask 0022
DATE=`date +%d`
ENDIR=/usr/lib/sa
DFILE=/var/log/sa/sa${DATE}
cd ${ENDIR}
if [ $# = 0 ]
then
exec ${ENDIR}/sadc -F -L 1 1 ${DFILE}
else
exec ${ENDIR}/sadc -F -L $* ${DFILE}
fi
写了个脚本,土办法封emule 0.47c
之前一直用l7-filter封堵P2P软件,近日突然发现对emule没有作用了,经过google发现是emule自0.47c开始使用了一种叫“协议迷惑”的技术,加密了包头。下边这段引用自网上的翻译:

[协议迷惑是一个使电骡在于其他客户端或服务器通讯时迷惑或“隐藏”自身协议的特性!没有使用协议迷惑时,每一通电骡连接通讯都有一个固定的格式,该格式可以让任何服务器辨别此讯息是来自一个电骡发出的数据包。如果本特性被打开后,整个电骡通讯产生的包都会以随机数据的面目出现从而使得自动辨别很难实现。这将帮助应付目前电骡协议受到的不公待遇甚或被某些网络通过辨别其数据包对其进行的完全封锁。
需重视协议迷惑并不打算做到以下几点:它并不增加你的隐藏性,它既不能使你隐身也无法对付嗅探器。同时如果你的网管拥有合法理由封锁电骡(比如在一个严格的公司网络里),打开本特性可能会给你带来其他不想要的结果。
协议迷惑目前可用于ED2k TCP 和 UDP, Server TCP 和 UDP 还有 Kad TCP 通讯. Kad UDP的迷惑尚未被支持。]

那么如何才能再次封住它呢?可能不久会有高人写出了更好的l7-filter的pattern,但暂时还没有。因此我查了emule的原理,想了一个土办法来封住emule。emule下载的具体原理见https://www.doczj.com/doc/e21370419.html,/t262133.html。

根据该网页上说emule需要与emule服务器联系上以后才能开始下载,因此只要我们封住了emule

服务器的地址,阻止emule客户端与服务器联系就能阻止住。但是emule的服务器有那么多怎么才能封能?嘿嘿,有个老外的网站,专么发布emule的服务器,虽然不可能完全包括,但封了他的列表以后至少能封住九成。因此我写了个小脚本,自动到http://ed2k.2x4u.de/list.html这个地方取list.html这个网页,然后用shell脚本进行处理,得到那里发布的emule服务器的ip地址列表,然后呢?还用我说吗?当然使用iptables封了!嗬嗬!!!!

下载回来的list.html在linux下看到的是如下的格式:

new SI(0x6d253348,15932,"DonkeyServer No2","www.First-Load.de / quad opteron 32gb / germany",1225631,305182119,0x3867625,0xfffc5418,0),

其中的0x6d253348就是DonkeyServer No2这个服务器的ip地址的16进制格式,不过是倒的,需要处理一下。

该网站的ip从网页上看是72.51.37.109,而0x6d253348对应的是:

0x6d=109
0x25=37
0x33=51
0x48=72

正好是相反的顺序,而且有这种0x335f13e少了一位的需要在前边补上一个0,变成0x0335f13e形式。
下边是我写的一个处理的脚本,所作的工作是

1、用wget下载list.html
2、用awk和sed提出0x0335f13e这段ip地址的部分
3、然后判断长度,如果是0x335f13e这种形式的需要在前边补0
4、用echo ${string:0:4} 的方式每两位一截,存入变量中
5、用echo $(($digi4))进行16进制-〉10进制转换
6、按照正常ip地址顺序输出到一个临时文件中
7、用sort进行排序
8、最后生成serverlist文件就是得到的ip地址列表。

脚本的代码如下:(水平有限,写得很土,让高人见笑了)

#!/bin/bash
wget http://ed2k.2x4u.de/list.html
if [ "$?" -ne "0" ];then
echo "Get server list fail!"
exit
fi
cat list.html |grep SI|awk ' { print $2 } '|sed -e 's/SI(//g'|awk -F ',' ' { print $1 } ' > iplist
for string in $( (cat iplist|sort -u) )
do
length=$(expr length $string)
if [ "$length" == "9" ];then
string=$(echo $string|sed -e 's/0x/0x0/g')
fi
digi4=$( echo ${string:0:4} )
digi3=$( echo ${string:4:2} )
digi2=$( echo ${string:6:2} )
digi1=$( echo ${string:8:2} )
B104=$( echo $(($digi4)) )
B103=$( echo $((0x$digi3)) )
B102=$( echo $((0x$digi2)) )
B101=$( echo $((0x$digi1)) )
echo $B101'.'$B102'.'$B103'.'$B104 >> ipdddddd
done
sort -n ipdddddd > tmpfile
rm -f ipdddddd
mv tmpfile serverlist
echo "List convert success!"

这个是用上边的serverlist生成iptables命令的脚本:
#!/bin/bash
#Destination: insert user who is allowed to use qq,bt
#Usage: ip2rule ip_file
#Version: 0.1
if [ "$#" == "0" ];then
echo "Usage: $0 ip_file_name"
exit 0
fi
if [ "$1" == "-h" ];then
echo "Usage: $0 ip_file_name"
echo "It will create a new file \"rule\""
exit 0
fi
if [ -e "$1" ];then
cat $1 > tmpfile
cat tmpfile|sed -e 's/^/iptables -A FORWARD -s /g' > tmpfile1
cat tmpfile1|sed -e 's/$/ -j

DROP/g' > tmpfile2
if [ -e rule ];then
rm -f rule
rm -f tmpfile
rm -f tmpfile1
mv tmpfile2 rule
else
rm -f tmpfile
rm -f tmpfile1
mv tmpfile2 rule
fi
else
echo "The ip file $1 is not exist!"
fi
Maximum length of --push buffer (1024) has been exceeded
OpenVPN的日志报如下错误:
Wed Dec 13 11:26:54 2006 PUSH: Received control message: 'PUSH_REQUEST'
Wed Dec 13 11:26:54 2006 1123@https://www.doczj.com/doc/e21370419.html,/xx.xx.xx.xx:3853 Maximum length of --push buffer (1024) has been exceeded
Wed Dec 13 11:26:54 2006 1123@https://www.doczj.com/doc/e21370419.html,/xx.xx.xx.xx:3853 WARNING: Received bad push/pull message: PUSH_REQUEST

客户端的错误现象是通过了证书的认证过程,但是到了push路由部分就停滞了,经过google找到了相关的解决方法,相关连接如下:

https://www.doczj.com/doc/e21370419.html,/archive/openvpn-users/2005-10/msg00246.html
https://www.doczj.com/doc/e21370419.html,/archive/openvpn-users/2006-02/msg00194.html
https://www.doczj.com/doc/e21370419.html,/pkgsrc-bugs/2005/05/16/0001.html

方法是修改openvpn源码中的common.h文件中的
TLS_CHANNEL_BUF_SIZE 参数的值,将它增加到能够包含所有的push/pull列表中的内容。
注意:要在客户端和服务器端同时修改,然后重新编译。下边是common.h中相关内容:
* This parameter controls the TLS channel buffer size. Among
* other things, this buffer must be large enough to contain
* the full --push/--pull list. If you increase it, do so
* on both server and client.
*/
#define TLS_CHANNEL_BUF_SIZE 1024

下载openvpn源码和lzo库和开发文件:
https://www.doczj.com/doc/e21370419.html,/rpm/packages/openvpn/openvpn-2.0.7-1.rf.src.rpm
https://www.doczj.com/doc/e21370419.html,/rpm/packages/lzo/lzo-1.08-4.2.el4.rf.i386.rpm
https://www.doczj.com/doc/e21370419.html,/rpm/packages/lzo/lzo-devel-1.08-4.2.el4.rf.i386.rpm

安装:
rpm -ivh openvpn-2.0.7-1.rf.src.rpm
rpm -ivh lzo-1.08-4.2.el4.rf.i386.rpm
rpm -ivh lzo-devel-1.08-4.2.el4.rf.i386.rpm

然后:
cd /usr/src/redhat/SOURCES
tar xvzf openvpn-2.0.7.tar.gz

按照上边的提示修改common.h 改为#define TLS_CHANNEL_BUF_SIZE 4096,然后保存退出,并将修改过的源码重新打包成openvpn-2.0.7.tar.gz

然后:
rpmbuild -bb /usr/src/redhat/SPECS/openvpn.spec

然后就得到了修改过的重新编译的的rpm包了,位置在/usr/src/redhat/RPMS/i386/openvpn-debuginfo-2.0.7-1.rf.i386.rpm

用这个安装就好了。
kernel2.6下为iptables添加扩展模块(不用重新编译整个内核)
因为CENTOS4默认没有安装kernel 源代码,所以要先安装kernel源代码
本文以centOS4.3 iptables1.3.7为实验环境。

1. 安装kernel源代码和iptables源代码
从CentOS官方网站下载内核源码,这是其中一个mirror的直接连接。
https://www.doczj.com/doc/e21370419.html,/4.3/os/SRPMS/kernel-2.6.9-34.EL.src.rpm
从netfilter官方网站下在iptables源码,这是直接连接。
https://www.doczj.com/doc/e21370419.html,/projects/iptables/files/iptables-1.3.7.tar.bz2

因为c

entos 4.3是基于redhat enterprise 4的源码重新编译而来,所以包含了redhat自己的很多有用的补丁,必须在原始内核上打上这些补丁才能享受rhel的稳定性。
# rpm -ivh kernel-2.6.9-34.EL.src.rpm
# cd /usr/src/redhat/SPECS
# rpmbuild -bp --target=i686 kernel-2.6.spec
# cp -a /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9 /usr/src

上边命令中的-bp参数的作用是执行spec文件的"%prep"阶段,通常是解压缩源码并打补丁。在本文中的作用就是解压缩官方原始内核文件,并给内核打上redhat自己的补丁。

2. 初始化内核
# cd /usrs/src/linux-2.6.9
# uname –a
# vi Makefile 改EXTRAVERSION =-34.EL
保持跟uname -a 的版本一致,为何要修改呢?因为不同版本的内容是不可以使用的,当不修改时,则变成这个版本(2.6.9-prep)了,不同时是这样出错的:
/lib/modules/2.6.9-34.EL/kernel/net/ipv4/netfilter/ipt_iprange.o: kernel-module version mismatch (版本错误)
/lib/modules/2.6.9-34.EL/kernel/net/ipv4/netfilter/ipt_iprange.o was compiled for kernel version 2.4.20-8custom,while this
kernel is version 2.4.20-8.
/lib/modules/2.6.9-34.EL/kernel/net/ipv4/netfilter/ipt_iprange.o: insmod /lib/modules/2.6.9-34.EL/kernel/net/ipv4/netfilter/ipt_iprange.o failed
/lib/modules/2.6.9-34.EL/kernel/net/ipv4/netfilter/ipt_iprange.o: insmod ipt_iprange failed

# cp /boot/config-2.6.9-34.EL .config 将现在使用的内核配置文件复制成.config,可以避免漏编模块。

3. 为内核打补丁并添加模块

此处为添加Layer-7模块,L7-filter 补丁以及协议描述文件可以从官方网站下载:

https://www.doczj.com/doc/e21370419.html,

tar -xzvf l7-protocols-2006-01-22
mv l7-protocols-2006-10-18 /etc/l7-protocols
cd /usr/src/linux-2.6.9
patch –p1 < /root/netfilter-layer7-v2.6/for_older_kernels/kernel-2.6.9-2.6.10-layer7-1.2.patch
cd /usr/src/iptables-1.3.7
patch –p1 < /root/netfilter-layer7-v2.6/iptables-layer7-2.6.patch
chmod +x extensions/.layer7-test
# 添加Layer-7模块完成

4. 选中你增加的模块
cd /usr/src/linux-2.6.9
make oldconfig

在出现 Layer 7 match support (EXPERIMENTAL) (IP_NF_MATCH_LAYER7) [N/m/?] (NEW)提示后,输入m,将l7-filter编译成模块

5. 编译netfilter模块
cd /usr/src/linux-2.6.9
make modules_prepare
make M=net/ipv4/netfilter

make M=dir 指定了要编译的外部模块,当然是用旧的语法make SUBDIRS=$PWD也是可以的。

编译完成netfilter的模块后拷贝编译完成的模块
cp -f /usr/src/linux/net/ipv4/netfilter/ipt_layer7.ko /lib/modules/2.6.5-1.358/kernel/net/ipv4/netfilter/
chmod 744 /lib/modules/2.6.9-5.0.3.EL/kernel/net/ipv4/netfilter/ipt_layer7.ko
depmod –a

6. 编译iptables
原始的CentOS 4.3中的iptables是1.2.11的,版本较低,所以先卸载然后装新的。

rpm -e system-config-securitylevel-tui-1.4.19.2-1.i386
rpm -e iptstate-1.3-4.i386
rpm -e iptables-

1.2.11

vi /usr/src/linux-2.6.9/include/linux/config.h把下面的三行注释掉,否则编译不过会出错。

//#ifndef __KERNEL__
//#error including kernel header in userspace; use the glibc headers instead!
//#endif

cd /usr/src/iptables-1.3.7
make KERNEL_DIR=/usr/src/linux
make install KERNEL_DIR=/usr/src/linux

完成安装以后测试一下
# iptables -V
# modprobe ipt_layer7
# lsmod
# iptables -A FORWARD -m layer7 --l7proto bittorrent -j DROP

OK成功。

总结:真正的要点在于以下几处,这才是不用重新编译整个内核的关键。
vi Makefile 改EXTRAVERSION =-34.EL
make modules_prepare
make M=net/ipv4/netfilter

参考文章:
https://www.doczj.com/doc/e21370419.html,/html/200611/5187.html

Howto:如何定制m0n0wall镜像文件
Howto:如何定制m0n0wall镜像文件

Polygun2000翻译,转载请保留此行。
英文原文:http://jief.theroux.ca/docs/custom-m0n0wall-howto.txt

注释: 这份文档针对的是FreeBSD 4.10和m0n0wall 1.1b15。
首先你需要安装FreeBSD 4.10,可以在这里获取到ftp://https://www.doczj.com/doc/e21370419.html,/.
这份文档不会教你如何安装FreeBSD,FreeBSD官方网站有很详细的教程。
一旦你建立了工作环境,接下来你需要创建一个工作目录。
我个人比较喜欢将我的$HOME目录作为工作目录。我创建了一个~/devel目录,然后在其下创建了change和system两个子目录。
# cd $HOME
# mkdir devel
# mkdir devel/change
# mkdir devel/system
现在进入你的工作环境!
# cd devel
现在让我们首先取得m0n0wall的镜像文件才能开始定制,使用Wget获取。
# wget https://www.doczj.com/doc/e21370419.html,/download/m0n0wall/generic-pc-1.1b15.img
大多数我们感兴趣的可以定制的文件存在于镜像文件的根目录下的mfsroot.gz文件中,所以接下来的例子将演示如何修改这些文件。
重命名下载的镜像文件。
# mv generic-pc-1.1b15.img generic-pc-1.1b15.img.gz
解压缩这个镜像文件。
# gzip -d generic-pc-1.1b15.img.gz
在Linux中一般使用‘mount -o loop imagefile /mount/point’这样的命令挂载本地文件。
在FreeBSD中你需要创建一个虚拟设备,然后挂载这个虚拟设备。下边是示例:
# vnconfig -s labels -c vn0 generic-pc-1.1b15.img
# mount /dev/vn0a system/
复制mfsroot.gz文件到其它目录以便修改。
# cp system/mfsroot.gz change/
现在,我们将要卸载镜像文件。
# umount system/
然后删掉刚才生成的虚拟设备。
# vnconfig -u vn0
现在我们拿到了文件系统的一个拷贝,现在需要把它解压缩。
# gzip -d change/mfsroot.gz
因为我们不能直接编辑镜像中的文件系统,因此需要将它先挂载上来。
# vnconfig -s labels -c vn0 change/mfsroot
# mount /dev/vn0 system/
此时就可以修改m0n0wall的镜像文件了。
大部分我们感兴趣的东西在~/usr/local/www目录下,你可以在这个目录中修改你需要的文件

,当你完成了你想要的修改以后返回到
$HOME/devel目录中。
# cd $HOME/devel
*** 警告: 如果当镜像文件在文件系统中的时候卸载会产生错误,你将不得不从头开始所有的步骤! ***
现在我们卸载掉所有之前挂载的文件,然后重新打包定制过的镜像。
# umount system/
# vnconfig -u vn0
我们需要压缩我们新的mfsroot文件系统,然后把它拷回到镜像中。
# gzip -9 change/mfsroot
# vnconfig -s labels -c vn0 generic-pc-1.1b15.img
# mount /dev/vn0a system/
# cp change/mfsroot.gz system/
# umount system/
# vnconfig -u vn0
最后一步,重新压缩镜像文件。
# gzip -9 generic-pc-1.1b15.img
# mv generic-pc-1.1b15.img.gz generic-pc-1.1b15.img
现在你可以使用Firmware更新功能将你自己的镜像文件上传到m0n0wall中了。
注释:
- 如果你想要修改m0n0wall安装后的默认配置,修改mfsroot.gz中的/conf/config.xml和config.xml两个文件。
- 如果你想在NAT区域中增加更多的ports(例如SSH/HTTP/FTP)来创建规则,修改~/usr/local/www/guiconfig.inc
- 当你做了很多修改以后,我强烈推荐你使用diff作一个补丁,这样你可以更容易的制作你自己的版本,例子如下:
# diff -ur file.orig file > patch01
Netfilter优化计算方法总结
最终计算公式:
分配给conntrack的内存大小 (以bytes为单位)
CONNTRACK_MAX=HASHSIZE= ——————————————
(struct ip_conntrack+8) (以bytes为单位)

根据https://www.doczj.com/doc/e21370419.html,/misc/netfilter_conntrack_perf.txt的优化方法

默认并发连接数=内存大小*64 (内存大小以M为单位)
默认HASH表大小=内存大小*8 (内存大小以M为单位)

计算公式:
CONNTRACK_MAX = 内存大小 (以bytes记) / 16384 / (x / 32)
HASHSIZE = CONNTRACK_MAX / 8 = 内存大小 (以bytes记) / 131072 / (x / 32)
这里x是指针的bit数,(例如,32或者64bit)
-默认HASHSIZE的值不会小于16
-对于带有超过1G内存的系统,HASHSIZE的默认值会被限制在8192(但是可以手工设置成更大的值)

查看当前的Conntrack_max和HASHSIZE
# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max
# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_buckets
在系统有足够的内存并且性能真的很重要的时候,你可以试着使平均值是一个跟踪连接条目配一个哈西桶。
这意味着HASHSIZE = CONNTRACK_MAX。

修改的Conntrack_max和HASHSIZE的值
# echo $CONNTRACK_MAX > /proc/sys/net/ipv4/netfilter/ip_conntrack_max

因为数学上的原因,哈西表占有固定的大小。因此HASHSIZE必须在哈西表被创建和开始填充之前就确定。
可以使用所有的数值定义其大小,但是使用2^n次方运作的最有效。
如果netfilter的跟踪连接

是被编译进内核中的,哈西表的大小就可以在编译的时候设置,或者(2.6内核之后)可以作为一个启动选项
ip_conntrack.hashsize=$HASHSIZE。
如果netfilter的跟踪连接是编译成一个模块,哈西表的大小可以在加载模块的时候设置,使用下面的命令:
# modprobe ip_conntrack hashsize=$HASHSIZE

理想的例子:一个只做NAT的机器
在理想的例子中,你有一台机器只做包过滤和NAT(也就是说,基本上没有用户空间的使用,至少不会有象代理这样会不断的耗费内存空间的东西......)

netfilter跟踪连接使用的内核内存大小是:

Conntrack使用的内存(以bytes记) =CONNTRACK_MAX * (struct ip_conntrack)大小 +HASHSIZE * (struct list_head)大小

-sizeof(struct ip_conntrack)可以有很大的区别,依赖于机器的体系架构,内核版本和编译时间的配置。要想知道它的大小,可以查看ip_conntrack初始化时候kenel的日志信息。sizeof(struct ip_conntrack)在i386架构、 2.6.5内核上大约是300bytes,但是在2.6.10的内核上,这个值可以在352至192bytes之间变化!下边是查看方法:
dmesg|grep conntrack
ip_conntrack version 2.1 (8192 buckets, 65536 max) - 352 bytes per conntrack

-sizeof(struct list_head) = 2 * size_of_a_pointer
在i386上,size_of_a_pointer是4bytes。

如果我们使HASHSIZE = CONNTRACK_MAX,在i386架构、2.6.5内核上,Conntrack使用的内存大小是CONNTRACK_MAX * 308 bytes。
现在我们假定你使用512M的内存拿来做一个只做防火墙的机器,并且使用128MB以外的内存来做跟踪连接,对于使用终端模式只做防火墙来说应该是足够的大的,你可以同时设置CONNTRACK_MAX和HASHSIZE大致如下:

(512 - 128) * 1024^2 / 308 =~ 1307315 (用这个数值替代默认的CONNTRACK_MAX=32768,HASHSIZE=4096)。
哈西算法最好使用“2的次方”大小运作最有效。
因此在这里我们可以将CONNTRACK_MAX和HASHSIZE设置成1048576(2^20)。
# echo 1048576 > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
# modprobe ip_conntrack hashsize=1048576
Netfilter conntrack 性能调整
这篇文档说明了对netfilter conntrack(还有NAT)性能调整时你必须知道的一些事情。
------------------------------------------------------------------------------
这里我们可以调整两个参数:
-允许的最大跟踪连接条目,在这篇文档中我们叫作CONNTRACK_MAX
-存储跟踪连接条目列表的哈西表的大小,在这篇文档中我们叫做HASHSIZE(下面是这个结构的描述)
CONNTRACK_MAX是在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目)。
一个跟踪连接的条目是存储在一个链接起来的列表的一个节点上,每个列表都是一个哈西表的元素。因此每个哈西表的条目(也叫一个桶-bucket)包含了一个链接起来的跟踪连接条目。
要访

问一个特定包的跟踪连接条目,内核必须:
-针对一个包中的已经定义的一些字符计算哈西值。这是一个不间断的计算。
这个哈西值就会被当作哈西表的索引来使用,而跟踪连接条目的列表就存储在这里。
-反复的查看链接列表中的跟踪连接条目以找到匹配的那一个。
这是一个耗资源的操作,依赖于列表的大小(也依赖于列表中被操作的跟踪连接条目的位置)。
哈西表包含了HASHSIZE大小的链接条目。当条目满的时候(总的跟踪连接条目数达到了CONNTRACK_MAX),理想状态下,每个列表(在最优化的条件下)将包含大约CONNTRACK_MAX/HASHSIZE的条目数。
不管你是否有连接,哈西表都将占用一个固定大小的非交换内核内存。但是最大连接跟踪条目会检测最多可以存储多少条目(globally into the linked lists),也就是说他们最多可以占用多少的内核内存。
这篇文档将给你一些关于为了达到最好的netfilter conntracking/NAT系统性能,如何调优HASHSIZE和CONNTRACK_MAX值的提示。
CONNTRACK_MAX和HASHSIZE的默认值
============================================
一般来说,CONNTRACK_MAX和HASHSIZE都会设置在“合理”使用的值上,依据可使用的RAM的大小来计算这个值。

CONNTRACK_MAX的默认值
------------------------------
在i386架构上,CONNTRACK_MAX = RAMSIZE (以bytes记) / 16384 =RAMSIZE (以MegaBytes记) * 64,因此,一个32位的带512M内存的PC在默认情况下能够处理512*1024^2/16384 = 512*64 = 32768个并发的netfilter连接。

但是真正的公式是:
CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (x / 32)
这里x是指针的bit数,(例如,32或者64bit)
请注意:
-默认的CONNTRACK_MAX值不会低于128
-对于带有超过1G内存的系统,CONNTRACK_MAX的默认值会被限制在65536(但是可以手工设置成更大的值)

HASHSIZE的默认值
-------------------------
通常,CONNTRACK_MAX = HASHSIZE * 8。这意味着每个链接的列表平均包含8个conntrack的条目(在优化的情况并且CONNTRACK_MAX达到的情况下),每个链接的列表就是一个哈西表条目(一个桶)。

在i386架构上,HASHSIZE = CONNTRACK_MAX / 8 =RAMSIZE (以bytes记) / 131072 = RAMSIZE (以MegaBytes记) * 8。
举例来说,一个32位、带512M内存的PC可以存储512*1024^2/128/1024 =512*8 = 4096 个桶(链接表)

但是真正的公式是:
HASHSIZE = CONNTRACK_MAX / 8 = RAMSIZE (以bytes记) / 131072 / (x / 32)
这里x是指针的bit数,(例如,32或者64bit)
请注意:
-默认HASHSIZE的值不会小于16
-对于带有超过1G内存的系统,HASHSIZE的默认值会被限制在8192(但是可以手工设置成更大的值)

读取CONNTRACK_MAX和HASHSIZE
==================================
现在通过/proc文件系统我们可以在运行时读取CO

NNTRACK_MAX的值。
在Linux kernel 2.4.23版本前,使用:
# cat /proc/sys/net/ipv4/ip_conntrack_max
在Linux kernel 2.4.23版本后,使用:
# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max
(旧的 /proc/sys/net/ipv4/ip_conntrack_max是不建议使用的!)
当前的HASHSIZE总是可以在syslog信息中找到(对任何一个内核版本),桶(也就是HASHSIZE)的数目是在ip_conntrack初始化的时候显示出来的。
对于linux内核2.4.24以后,当前的HASHSIZE值可以在运行时使用下面的命令读取:
# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_buckets

修改CONNTRACK_MAX和HASHSIZE
====================================
默认的CONNTRACK_MAX和HASHSIZE的值都会因主机的不同而不同,但你可以在只做防火墙的高负载的系统上增加他们。
因此CONNTRACK_MAX和HASHSIZE值如果需要的话可以手工更改。
读取桶是一个连续性的操作(我们的兴趣在于得到一个哈西列表),请记得内核需要不停的遍历一个链接的列表去查找一个跟踪连接条目。因此一个链接列表(CONNTRACK_MAX/HASHSIZE的值在优化的状态下并且达到上限)的平均值不能设置太大。这个比值默认值是8(当值是自动计算的时候)。
在系统有足够的内存并且性能真的很重要的时候,你可以试着使平均值是一个跟踪连接条目配一个哈西桶,这意味着HASHSIZE = CONNTRACK_MAX。

设置CONNTRACK_MAX
---------------------
跟踪连接的条目是存储在链接的表中的,因此最大的跟踪链接条目(CONNTRACK_MAX)可以很容易的动态调整。
linux内核2.4.23之前,使用:
# echo $CONNTRACK_MAX > /proc/sys/net/ipv4/ip_conntrack_max
linux内核2.4.23之后,使用:
# echo $CONNTRACK_MAX > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
这里$CONNTRACK_MAX是一个整数。
设置HASHSIZE
----------------
因为数学上的原因,哈西表占有固定的大小。因此HASHSIZE必须在哈西表被创建和开始填充之前就确定。
在linux内核2.4.21之前,必须使用素数作为哈西表的大小,而且要保证这个哈西表能够有效并通用。非素数的奇数或者其他的数值都是强烈不推荐使用的,因为这样哈西的分配不能达到最优化的状态。
从linux内核2.4.21(还有2.6内核)跟踪连接使用jenkins2b算法,这样就可以使用所有的数值,但是使用2^n次方运作的最有效。

如果netfilter的跟踪连接是被编译进内核中的,哈西表的大小就可以在编译的时候设置,或者(2.6内核之后)可以作为一个启动选项ip_conntrack.hashsize=$HASHSIZE。
如果netfilter的跟踪连接是编译成一个模块,哈西表的大小可以在加载模块的时候设置,使用下面的命令:
# modprobe ip_conntrack hashsize=$HASHSIZE
这里$HASHSIZE是一个整数。
一个理想的例子:只做防火墙的机器
-----------------------------

-------
在理想的例子中,你有一台机器只做包过滤和NAT(也就是说,基本上没有用户空间的使用,至少不会有象代理这样会不断的耗费内存空间的东西......)
netfilter跟踪连接使用的内核内存大小是:
size_of_mem_used_by_conntrack (以bytes记) =CONNTRACK_MAX * sizeof(struct ip_conntrack) +
HASHSIZE * sizeof(struct list_head)
-这里:sizeof(struct ip_conntrack)可以有很大的区别,依赖于机器的体系架构,内核版本和编译时间的配置。要想知道它的大小,可以查看ip_conntrack初始化时候kenel的日志信息。sizeof(struct ip_conntrack)在i386架构、 2.6.5内核上大约是300bytes,但是在2.6.10的内核上,这个值可以在352至192bytes之间变化!
-sizeof(struct list_head) = 2 * size_of_a_pointer
在i386上,size_of_a_pointer是4bytes。

因此在i386,2.6.5内核上,size_of_mem_used_by_conntrack大约是CONNTRACK_MAX * 300 + HASHSIZE * 8 (bytes)。
如果我们使HASHSIZE = CONNTRACK_MAX(如果我们将大部分的内存用来做防火墙的工作,参见“修改 CONNTRACK_MAX和HASHSIZE”部分),在i386架构、2.6.5内核上, size_of_mem_used_by_conntrack大概是CONNTRACK_MAX * 308 bytes。
现在我们假定你使用512M的内存拿来做一个只做防火墙的机器,并且使用128MB以外的内存来做跟踪连接,对于使用终端模式只做防火墙来说应该是足够的大的,例如:
你可以同时设置CONNTRACK_MAX和HASHSIZE大致如下:
(512 - 128) * 1024^2 / 308 =~ 1307315 (instead of 32768 for CONNTRACK_MAX,
and 4096 for HASHSIZE by default)。
对于linux2.4.21(和linux2.6),哈西算法最好使用“2的次方”大小(之前是使用素数)。
因此在这里我们可以将CONNTRACK_MAX和HASHSIZE设置成1048576(2^20)。

这样,你可以存储默认值32倍的跟踪连接条目,而且可以得到更好的跟踪连接性能。

Putty与Openssh Key不兼容问题的解决
Putty是一个很小巧好用的SSH客户端,但在我使用过程中发现一个问题,Putty不支持Openssh生成的Key文件,但是我的工作中所有的服务器都需要PKI认证,经过埋头GOOGLE,发现解决方法,特记录如下:
1、 在Putty官方网站下载PUTTYGEN,双击运行
2、选择Conversions菜单,选择Import key
3、选择由Openssh生成的私钥文件,点击打开。
4、如果私钥经过加密,需要你输入私钥的密码。
5、然后Key就被导入到了其中
6、点击Save private key按钮,选择保存转换过的Key的位置。
7、然后打开Putty,在SSH选项处的Auth处选择转换过的Key文件
OK!










OpenVPN笔记
一、建立CA和PKI

PKI包括:ca,key(用于给用户签名),public key,private key
openvpn支持双向认证,意思是说在互信关系建立以前用户必须认证服务器的证书,服务器也必须认证用户

的证书。
服务器和用户首先会校验现有的证书是否经过主CA的签名,然后会测试now-authenticated的证书头,例如certificate common name or certificate type (client or server).
步骤:
1.生成主CA的证书和key
OpenVPN提供了一套证书管理脚本,linux下在/usr/share/doc/openvpn-2.0.7/easy-rsa/2.0下面,将2.0目录复制到/root,以免将来升级时覆盖掉生成的key
cp /usr/share/doc/openvpn-2.0.7/easy-rsa/2.0 -r /root
cd /root/2.0
chmod +x *
然后修改基本参数,在vars文件中,修改如下参数,并确保没有参数为空!
KEY_COUNTRY,
KEY_PROVINCE
KEY_CITY
KEY_ORG
KEY_EMAIL
接下来开始初始化PKI.
../vars
./clean-all
./build-ca
build-ca脚本会调用交互式的openssl命令生成ca和key。
[root@yyy 2.0]# ./build-ca
Generating a 1024 bit RSA private key
.......++++++
........++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:
State or Province Name (full name) [CA]:
Locality Name (eg, city) [SanFrancisco]:
Organization Name (eg, company) [Fort-Funston]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [Fort-Funston CA]:OpenVPN-CA-Master
Email Address [me@myhost.mydomain]:rwen@https://www.doczj.com/doc/e21370419.html,
过程中大部分的参数可以按回车采用在vars文件中定义的默认值,只有Common Name是最重要的,必须明确输入!!!!!!!
过程结束后会在当前目录下生成keys目录,在keys目录中生成ca.crt,ca.key两个文件。
2.生成VPN服务器端的ca和key
./build-key-server server
[root@yyy 2.0]# ./build-key-server server
Generating a 1024 bit RSA private key
.................++++++
.........++++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:
State or Province Name (full name) [CA]:
Locality Name (eg, city) [SanFrancisco]:
Organization Name (eg, company) [Fort-Funston]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [server]:server
Email Address [me@myhost.mydomain]:rwet@https://www.doczj.com/doc/e21370419.html,
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:12345678
An optional company name []:
Using configuration

from /root/2.0/https://www.doczj.com/doc/e21370419.html,f
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'US'
stateOrProvinceName :PRINTABLE:'CA'
localityName :PRINTABLE:'SanFrancisco'
organizationName :PRINTABLE:'Fort-Funston'
commonName :PRINTABLE:'server'
emailAddress :IA5STRING:'rwet@https://www.doczj.com/doc/e21370419.html,'
Certificate is to be certified until Aug 6 16:06:03 2016 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
像上一步一样大多数参数可以采用默认值,当提示输入Common Name时输入"server"。
另外两个需要明确回答的是:
Sign the certificate? [y/n]:
1 out of 1 certificate requests certified, commit? [y/n]
过程结束后会在keys目录生成server.crt,server.csr,server.key,01.pem四个文件。
3.生成VPN客户端的ca和key
./build-key client1
./build-key client2
./build-key client3
如果需要给私钥设置密码,使用build-key-pass脚本代替build-key,即:
./build-key-pass client1
./build-key-pass client2
./build-key-pass client3
[root@yyy 2.0]# ./build-key-pass client1
Generating a 1024 bit RSA private key
..++++++
..........++++++
writing new private key to 'client1.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:
State or Province Name (full name) [CA]:
Locality Name (eg, city) [SanFrancisco]:
Organization Name (eg, company) [Fort-Funston]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [client1]:client1
Email Address [me@myhost.mydomain]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /root/2.0/https://www.doczj.com/doc/e21370419.html,f
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'US'
stateOrProvinceName :PRINTABLE:'CA'
localityName :PRINTABLE:'SanFrancisco'
organizationName :PRINTABLE:'Fort-Funston'
commonName :PRINTABLE:'client1'
emailAddress :IA5STRING:'me@myhost.mydomain'
Certificate is to be certified until Aug 6 16:20:06 2016 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
像上一步一样大多数参数可以采用默认值,当提示输入Common Na

me时输入"client1",每个client的Common Name必须是唯一的,即互不相同。
另外还有两个需要明确回答的是:
Sign the certificate? [y/n]:
1 out of 1 certificate requests certified, commit? [y/n]
过程结束后会在keys目录生成client1.crt,client1.csr,client1.key,02.pem四个文件。
4.生成Diffie Hellman参数
./build-dh
[root@yyy 2.0]# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.................................................+.............+.................+..........................................................................+..................................................................+.............+.......................+.............................................................................................................................................+...........................................+...+.......+......+.+..
过程结束后会在keys目录生成dh1024.pem文件。

5.将server和client需要的文件复制到各自的机器上。keys目录中文件的用途如下:
Filename Needed By Purpose Secret
---------------------------------------------------------------------------
ca.crt server + all clients Root CA certificate NO
ca.key key signing machine only Root CA key YES
dh{n}.pem server only Diffie Hellman parameters NO
server.crt server only Server Certificate NO
server.key server only Server Key YES
client1.crt client1 only Client1 Certificate NO
client1.key client1 only Client1 Key YES
---------------------------------------------------------------------------
二、创建Server的配置文件
可以参考系统自带的示例配置文件,在其上更改。目录在:
/usr/share/doc/openvpn-2.0.7/sample-config-files
文件名分别是server.conf和client.conf
server.conf中提供一个VPN的设置,该VPN使用TUN设备,在UDP 1194端口监听,分发给客户端的地址为10.8.0.0/24。
在使用sample的配置之前,需要更改ca, cert, key, dh这几个参数为你上一步生成的那些key文件。
在修改过以上参数以后这已经是一个可用的配置文件了。当然你可以自己订制你的配置,常用的参数有如下:
1.如果使用桥模式,必须将server和dev tun这两项改为
server-bridge
dev tap
2.如果使用TCP协议监听,需要将proto udp改成proto tcp。如果需要同时监听UDP和TCP,则需要独立运行两个实例。
3.如果想更改分配给用户的地址,需要更改server选项。注意服务器地址会是10.8.0.1
server 10.8.0.0 255.255.255.0
4.如果允许多个VPN客户端通过Server互相通信,请将client-to-client前的注释去掉。默认情况下每个client只能Server通讯。
5.如果使用Linux系统,可以

相关主题
文本预览
相关文档 最新文档