存档

文章标签 ‘linux’

Puppet笔记:介绍及基本用法

2009年6月5日

Puppet是一个可以管理大量linux主机的系统,它的中心思想是让主机上的某个资源与配置文件(manifest)对该资源的设计一致,这里资源可以指一个文件、一个用户、一个软件包、一条cron中的任务等实体。例如下面的一段manifest:

 

file { “/etc/sudoers”:
    owner => root,
    group => root,
    mode => 440
}

它的作用就是指明了:/etc/sudoers这个文件,其owner应为root,group应为root,mod应为440。执行的时候,客户端会判断这三点是否符合,如果不符合,它会去设置user、group、mode等的值为设置的值。

安装

Puppet的结构也是一个唯一(以后会有failover冗余)的中心Server与所有的Client组成。

Puppet是基于Ruby写成的,所以安装前要准备好Ruby环境,并且需要安装RubyGems以用来安装。Server与Client的安装没有区别,都在相同的包内,只是中心的server上运行的是puppetmasterd,被管理机上运行的是puppetd。另外,每台主机上一定要配置好自己的hostname,之后每台机器要以hostname区分。

如果ruby环境和gems都装好了,执行下面几句就可以安装好puppet了:

wget puppet.proximic.cnpuppet/facter-1.5.5.gem
gem install facter-1.5.5.gem
wget puppet.proximic.cn/puppet/puppet-0.24.8.gem
gem install puppet-0.24.8.gem

使被管理机与中心机连接

server端首次运行前,编辑/etc/puppet/manifests/site.pp文件,内容可以用最基本的:

 

# site.pp
file { "/etc/sudoers":
    owner => root, group => root, mode => 440
}

 

启动server,执行:puppetmasterd –mkusers,这个参数是为了生成puppet运行所用用户,以后执行就不需要了。

然后在客户机上执行:puppetd –server <你的服务器地址> –waitforcert 60 –test,这时客户机会去连server,但是由于连接是在ssl上的,而Server还没有sign过客户的cert,这时客户机被被断开。到server上执行:puppetca –list,会显示出刚才这个客户的hostname为等待签名的客户,执行:puppetca –sign <客户hostname> 即可为其签名。这时再到客户机上执行上面的puppetd命令,即可看到客户在正常地连接server,并且检测上面关于sudoers文件的策略了。

向被管理机分发文件

通过puppet可以向被管理机上推送文件,方法是使用file类型的source属性,例如:

file {
    ”/etc/profile.d/java.sh”:
    source => “puppet://puppet.domain.com/profiles/javaprofile.sh”,
    owner => root,
    group => root,
    mode => 755
}

这里的文件来源是什么呢?puppetmasterd自带一个简易的文件服务器,配置方法是创建并编辑/etc/puppet/fileserver.conf ,其中每个section是一个module,module就是指上述puppet://路径中域名之后的第一段(即“profiles”),下面可以配置该module对应的server上的物理路径以及acl等,例如:

[profiles]
    path /home/misc/profiles
    allow *

这样如果客户端上该文件不存在,或者内容不同(通过checksum),就会从server上把这个文件拉过去。

执行脚本

很复杂的部署任务肯定不能完全靠puppet完成,这时我会写一个部署用的脚本。Puppet有一种“资源”叫exec,通过它可以执行程序,还可以设置执行时的path,环境变量,user/group,是否记录output等,很方便,例如:

exec { “/root/puppet/nagiosclient/nrpe.sh”:
    cwd => “/root/puppet”,
    timeout => 7200,
    logoutput => on_failure,
    user => root,
    path => ["/sbin", "/usr/sbin", "/usr/local/sbin", "/root/bin", "/usr/local/bin", "/usr/bin", "/bin", "/usr/lib64/jvm/jre/bin"],
    require => File["/root/puppet/nagiosclient/nrpe.sh"]
}

想在各客户机上执行时,我一般就是先用上述file资源的配置把该脚本推送到客户机上,然后用空上exec资源去执行它,注意exec中要配置好require 该file,否则无法保证exec在file之类在客户上执行。

运维 ,

OpenSUSE下安装VMWare Server遇到的问题

2009年4月10日

今天准备在一台OpenSUSE 11.0的服务器上安装VMWare Server 2。VMWare Server 2的全binary版其实是支持OpenSUSE的,不过目前只支持到10.1版,所以还是用一般linux上的安装过程。

由于非binary支持,有关网络设备及server的核心的部分需要编译,结果安装程序提示:

Your kernel was built with “gcc” version “4.3.1″, while you are trying to use ”/usr/bin/gcc” version “4.3″. This configuration is not recommended and VMware Server may crash if you’ll continue. Please try to use exactly same compiler as one used for building your kernel. Do you want to go with compiler ”/usr/bin/gcc” version “4.3″ anyway? [no] 

网上查了一下,这个是vmware安装程序的bug,可以直接yes继续。之后的步骤会问kernel源码的位置:

What is the location of the directory of C header files that match your 
running
kernel? [/usr/src/linux/include]

在OpenSUSE上默认是不安装kernel源码的,如果上面这个默认目录不存在,就可以去yast中装一下,包的名字叫“kernel-source”,不过版本不一定是对的,例如我的系统内核是2.6.25.5-1.1,而今天yast中要装的是2.6.25.20.0.1,这样就不能用,需要上网去找到与实际内核版本号完全相同的kernel-source的rpm包。(PS.如果装的时候/usr/src/linux已经是其它版本的kernel source了,还是要先进yast把kernel-source御掉再装rpm)。

多数人遇到的问题是下面这个提示:

The path “/usr/src/linux/include” is a kernel header file directory, but it
does not contain the file “linux/version.h” as expected. This can happen if
the kernel has never been built, or if you have invoked the “make mrproper”
command in your kernel directory. In any case, you may want to rebuild your
kernel
What is the location of the directory of C header files that match your 
running
kernel? [/usr/src/linux/include]

这是因为只是装了kernel源码却没用过它,有些文件是没有生成的,当然不是说你必须用自己编译的内核才能装vmware。只要做过以下几步操作就可以了:

cd /usr/src/linux
make cloneconfig (当然如果你是想自己编个内核,这步就是通常的make config)
make scripts
make prepare

技术

原来mount的时候还能用硬盘id来mount

2009年3月5日

不知道是不是我土了。。。

原来mount硬盘的时候都写成/dev/sda,/dev/hda1之类的型式,solaris下面也不过是硬盘的编号。这样的缺点就是如果你添减硬盘(最典型的例子是装系统时接着光驱,装完后拨了它编号就变了)编号变了会出问题

今天才发现mount的dev的名字原来可以写成这样:

/dev/disk/by-id/ata-ST3250820NS_9QE68B2F
/dev/disk/by-id/scsi-SAdaptec_RAIDNAME_2244073F-part1

然后fstab里也用这种格式写,一下子就少了很多麻烦了嘛

运维

tc pfifio_fast及PRIO对没有filter的包的处理

2009年1月15日

看好多网站上的讲tc的教程都有类似下面的例子:
tc filter add dev eth0 protocol ip parent 2: prio 1 u32 match ip sport 23 0xffff flowid 2:1
tc filter add dev eth0 protocol ip parent 2: prio 2 flowid 2:2
后一句的本意是不符号上面各种filter的默认分到classid 2:2中去,可是实际我用的时候发现后一句被告知不能用(tc竟然没有–version参数,我也不知道是啥版本的)
看了一下文档,说不符合任何filter的包按classifier的root的默认分类发送,那这个“默认分类”是什么呢?
对于CBQ来说,它本身就是在搞复杂的分类,就不说了;这里只说简单的以频道分类的classifier:pfifo_fast的PRIO,默认来说这两个classifier建立的时候会生成3个band,然后也会有一个默认的priomap,形如:1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
这些数字是干什么用的呢,它们与IP包头的TOS字段有关,TOS字段一共4个bit,每个bit代表不同的特性,如果最高位是表示最小延迟,最低位是表示最小成本等。这4个bit一共能组合成16种TOS值,linux内核会根据这4个bit的TOS值给该包判定一个priority值(从0开始),这个priority值对应了priomap中相应位置的数字,每个数字就表示该TOS值将被默认地送往这个classifier的哪个band。
例如:对于什么标志都不带的包,TOS=0000b=0,linux会给它分配priority值0,对应priomap中的第1个数字――1,也就是说什么标志都没有的包装被送往band 1;对于telnet包,一般TOS=1000b=8,linux会给它分配priority值6对应priomap中第9个数字――0,就是说telnet包默认会被送到band0
对上述两个Classifier,band号越小,优先级越高,所以telnet包的优先级高于普通包,合理,嗯
下面列出linux内核会给各种TOS值分配什么样的priority,选自tc手册。
TOS     Bits  Means                    Linux Priority    Band
————————————————————
0×0     0     Normal Service           0 Best Effort     1
0×2     1     Minimize Monetary Cost   1 Filler          2
0×4     2     Maximize Reliability     0 Best Effort     1
0×6     3     mmc+mr                   0 Best Effort     1
0×8     4     Maximize Throughput      2 Bulk            2
0xa     5     mmc+mt                   2 Bulk            2
0xc     6     mr+mt                    2 Bulk            2
0xe     7     mmc+mr+mt                2 Bulk            2
0×10    8     Minimize Delay           6 Interactive     0
0×12    9     mmc+md                   6 Interactive     0
0×14    10    mr+md                    6 Interactive     0
0×16    11    mmc+mr+md                6 Interactive     0
0×18    12    mt+md                    4 Int. Bulk       1
0x1a    13    mmc+mt+md                4 Int. Bulk       1
0x1c    14    mr+mt+md                 4 Int. Bulk       1
0x1e    15    mmc+mr+mt+md             4 Int. Bulk       1
还有常见的协议的TOS值:
TELNET                   1000           (minimize delay)
FTP
        Control          1000           (minimize delay)
        Data             0100           (maximize throughput)
TFTP                     1000           (minimize delay)
SMTP
        Command phase    1000           (minimize delay)
        DATA phase       0100           (maximize throughput)
Domain Name Service
        UDP Query        1000           (minimize delay)
        TCP Query        0000
        Zone Transfer    0100           (maximize throughput)
NNTP                     0001           (minimize monetary cost)
ICMP
        Errors           0000
        Requests         0000 (mostly)
        Responses        <same as request> (mostly)
Classes
另,IP头中,TOS这4个bit再往高处3个bit的定义也叫priority,但是好像linux是根据tos的4个bit分配priority值,不是直接以这3个bit为准。(priomap是16个数字,如果是以这3个bit为准,就是8个了,呵呵)

技术 , ,

关于用到mysql的应用,注意检查编码问题

2008年5月9日

对于集成了mysql的一些应用,比如proftpd的用户认证(已经栽在它上面两次了!!),用的时候一定要检查my.cnf里关于client端默认编码的事。
因为它没有地方让你执行什么set names=XXX这种语句,所以只能靠my.cnf里的默认设置

切记在与mysql有关的应用遇到问题要养成检查my.cnf的习惯,否则真是不知道怎么死的。。。

技术 , ,

记一次网站紧急维护过程

2008年2月25日

学院自己设计的选课系统,今年初次启用,用于一个年级约150人的同时选课。选课开始之后很快网站便失去响应。重启服务器之后重新开启选课系统,但是又迅速停止服务。于是选课宣布推迟。

 


二次选课安排在某日下午。于第二次选课前一天接手站点维护,对站点的结构和程序性能进行分析。该站点由两台服务器分别负责数据库和Web服务。采用10个
并发用户模拟选课过程时,210个事务操作需要10分钟左右。期间Web服务器基本没有负载,而数据库服务器CPU满载。站点数据表尺寸在1M的级别,程
序代码中仅有一次锁表操作,但是有若干处在循环中查询数据库。因此推测性能问题是由于对数据库访问次数过多而导致的。

 

开启
数据库的日志并访问课程列表页面,发现仅此一个页面就有200余次数据库查询操作。对课程列表页面进行压力测试发现,数据库服务器每秒可处理近800次查
询请求。而一次完整的选课过程则会导致900余次数据库查询。这说明程序结构存在着严重的问题,因此对程序进行重构,消除循环中对于数据库的访问。共将三
处循环中对于数据库的访问改为存储过程,另外修改了一些查询语句。同时对数据表项目进行了小的调整,添加了几个表项作为缓存,消除了几处多余查询和重复查
询。撤销了两个被频繁调用的且结果稳定的函数中对于数据库的调用,将部分结果暂时硬编码至程序中。另有一处被频繁调用的函数因程序结构原因无法进行快速重
构,故而放弃对其的修改。经过上述重构,显示课程列表页面所需的访问数据库次数降低至20次左右,同时由于数据库和程序客户端的问题增加了三次额外的数据
库连接操作。应当说这个数据库访问次数仍是偏多的,但是与原先的情况相比有了明显的改进,同时由于程序结构的限制,在短时间内无法进行进一步的优化,因此
对程序的优化到此为止告一段落。整个重构过程耗时约12小时。在程序重构的同时,根据网站页面的功能对于部分网页暂时采取了转为静态页面和不显示的方法以
降低重构的工作量。优化结束后对课程列表页面进行压力测试,10个客户端连续刷新时Web服务器的CPU占用在40%左右,而数据库服务器的CPU占用在
30%附近。

 

程序重构结束之后,对数据库以及两台服务器的操作系统继续进行优化。根据程序中的查询语句为数据库增添了一些
索引,从而使得10个客户端连续刷新课程列表页面时数据库服务器的CPU占用降低至10%以下。此时Web服务器的CPU占用相对较高,同时使用压力测试
软件进行测试时响应时间有明显的周期性分布。检查Web服务器的网络连接情况,发现Web服务器端访问数据库的网络连接在程序结束之后没有及时关闭,猜测
这可能导致网络连接数过多,从而导致响应时间周期性的分布。因此调整Web服务器的部分网络参数以消除此现象。另外为Web服务器安装了程序脚本的预编译
模块以避免重复的脚本编译操作。经过这些优化之后,25个客户端连续刷新课程列表页面时Web服务器的CPU占用降低至20%以下,数据库服务器的CPU
占用在15%左右。

 

分析维护前后系统的性能,对于程序的重构使响应速度提高了近10倍;添加新的数据库索引以及Web程序脚本预编译又各自使得Web服务器和数据库服务器的响应速度翻倍。因此总的来看,维护之后站点的性能提高了近20倍。

 


日上午对于网站的内容以及程序逻辑进行进一步的检查,更正了几处数据和逻辑错误。下午选课时,网站负载在选课开始3分钟后达到峰值。Web服务器的峰值
CPU占用在15%,而数据库服务器的峰值CPU占用在10%。选课开始10分钟后两服务器已没有明显负载。根据数据库内容的监测,此时大部分学生的选课
已基本结束。

运维 , ,

用PHP通过LDAP操作活动目录(AD)的笔记

2007年11月12日

最近一周一直在研究AD这方面的问题,主要难题就是用跑在Linux上的PHP通过LDAP来读写Windows上的活动目录中用户的信息。一般来说需要这么做的情况不常见,因为既然是用AD了就可以用很多现在的LDAP模块,但是我现在要做的是把已有的一个非标准的用户/密码的库转换到AD里去,所以必须亲自来完成一些底层的工作。这方面的文章网上不多见,所以这里综述一下。

首先,是安装配置AD本身的这部分工作:
主要包括:装Win2k3(或2008哈),建立域控制器,建DNS服务,把要加入域的几个机器加进域来,然后建设OU(放用户的OU及放计算机的OU),建立安全组(我用它来限制哪些用户可以登录哪些计算机),设立组策略并应用到各OU等。
这部分内容的文章很多,微软给的文档就足够详细了,比如这个Step by Step的教程:http://www.microsoft.com/china/technet/prodtechnol/windowsserver2003/technologies/directory/activedirectory/stepbystep/default.mspx
(ps.这中间在密码策略上浪费了大量时间,后来才弄清一个域中只能在根下设置密码策略,就算把带有密码策略的组策略应用在OU上,也是无效的。2008里已经可以针对安全组甚至用户设置独立的密码策略了,期待~~)

然后是一些为了就乎linux的准备工作:
先去http://www.microsoft.com/windowsserversystem/sfu/downloads/default.mspx下载一套Windows Services for UNIX,这个装上以后AD里用户的属性页里会出现一个UNIX属于页,有uid,gid什么的,这是为了让linux能结合AD验证用户登录的(比如pam),我目前没用上,不过装它没坏处。
还有是要建立一个proxyuser,这个user是ldap客户端连AD时登录用的,想让PHP实现对AD的什么操作,就给这个proxyuser赋予什么权限。
这里推荐一套很好的文档,是微软的Windows Security and Directory Services for UNIX Guide(还是要pf一下m$,文档就是全,这里对linux中安全体系的介绍比专方介绍的文档都详细。。。)

下面就是资料不好找的工作啦,一步一步来:

1.关于AD与ldap的符合性。AD被做成基本符合ldap的模式,每个用户和计算机或是组什么的都有一个DN,形如CN=loudly,OU=bbs,DC=bdwm,DC=net这样子,而用户的每个属性就是这条记录里的一个attribute,所以可以用ldap_search(),ldap_add()这些标准的函数来操作AD。一个特殊但是关键的地方就是用户的密码,很不易地找到这两个文档介绍这个事情:
How To Change a Windows 2000 User’s Password Through LDAP
User Management with Active Directory―LDAP Password Modification
文章中的核心内容就是:用户的密码是一个叫unicodePwd的属性表示的,这个属于只能写不能读,写的时候的格式是用一对双引号括起密码原文,再编码为unicode传给它,还有,要想改用户密码,必须是通过SSL方式连接LDAP(636端口,而不是普通的389端口)。因为如上要求,就要有以下步骤的工作了。

2.生成根证书
用SSL的话嘛,就需要证书。可以在域控制器上开启认证服务来创建企业的CA(注意这个服务开启后域的设置就不能改了,包括域名,这个机器的名等,所以要在进行这步之前设置好)。这里要做的就是创建CA,然后验证一下是不是ok的。其实这部分内容我也不懂,主要就是照着下面两篇参考着做的,具体步骤怎么回事(尤其是验证的时候)我也不知道是在做什么。
a.Install an enterprise root certification authority
b.就是上面提到的Windows Security and Directory Services for UNIX Guide第二卷的第Chapter4的Build a Certification Authority那一节
如果不自己建CA,而是从别处获得CA,那就看下面这篇:
c.How to enable LDAP over SSL with a third-party certification authority
下面这篇也可以参考,不过该文的主题是别的
d.如何在 Windows 2000 域控制器中配置数字证书来确保 LDAP 和 SMTP 复制的安全
上面的工作做好后,如果正常,那么域控制器就会开始listen 636端口,也就可以通过SSL连AD了(一般ldap客户端的规矩是:连的时候直接写DC地址就是用非加密方法连,连的时候如果写ldaps://地址,就是用SSL方法连接DC)

3.LDAP客户端的配置
客户端,就是要去连AD的机器,也就是本文中跑着PHP的那个机器,要做的工作主要是把DC上的CA导出成.cer,然后拷到客户端上来,然后转化为.pem(可是我的.cer和.pem文件是一样的)放到某个位置,然后再修改一下/etc/openldap/ldap.conf,这样连DC的时候系统就可以去查相应的证书。主要参考的文档是这篇:
Communicating between OpenLDAP and Active Directory over SSL
下面两篇也可以参考:
Configuring Microsoft Active Directory for SSL access
LDAP over SSL – Modifying Active Directory with PHP
上面的文章里最后都要用linux下的ldapsearch命令来测试连接是否可以进行,不过语法不同,我最后成功地连上DC用的语句是:
ldapsearch -x -H “ldaps://theDC.yourdomain.net” -s base -D “cn=proxyuser,cn=users,dc=yourdomain,dc=net” -W -b “dc=yourdomain,dc=net”(回车后提示输proxyuser的密码)
还有,要强调的是,连DC一定要用它的域名,不要用IP或是NetBIOS名,因为CA里写的是域名,要匹配
另,上面说的是linux的ldap客户端,win下也有啊,比如说win2k和2k3的support-tools里的ldp.exe,可是我还没搞清楚它应该怎么才能以SSL连AD。。。

4.用PHP来操作活动目录
这步算是最轻松的了,就是学一学PHP的相关函数的语法就好了。不过大概是没几个人用到ldap这方面的功能吧,PHP manual中ldap这部分的说明很简略,特别是用TLS的文档里写着这部分没有文档。。。所以最好的办法还是看一些源代码,这里推荐的是我在SourceForge上找到一个的PHP连AD的类:http://adldap.sourceforge.net/
这个类写的并不是特别好,比如添用户时非要求填几个没用的属性,还有至少在一层的OU里的样子,所以推荐它主要是为了看它的原码(30k左右,不是很多)学习用ldap来添加、查询、修改、加组等操作应该怎么写,如果你的应用比较复杂,建议还是自己来写,不直接用它的类。
下面几个地址也列出来考虑吧,它们都是我google到的别人问的问题,本身没有确切解答,不过还是有功劳的,比如我认识到了没有验证一个用户的密码对不对的函数,要做的就是用那个用户名和密码去bind一下,bind上
就是对,否则就是错。
http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/Q_21296510.html?qid=21296510
http://topic.csdn.net/t/20060524/10/4774581.html
http://www.ideawu.net/ideablog/category6/article238.html
http://topic.csdn.net/t/20030520/15/1809327.html#

上面列出的文章链接真的不是那么好挑选出来,真怕他们哪天没了,回头我下载完打包传上来吧

编程, 技术 , , ,

关于linux下的编程,不禁发些牢骚

2007年8月13日

虽说是以开源为基础的,而且在简单的程序上写起来是比较方便,不过有些时候确实让人头痛,让人想念微软的.Net或是MFC。

首先是标准不统一,最近在写一个基于线程池的服务器程序,用到了semaphore,还是存在mmap中的无名semaphore,调试得很愉快,于是高兴地把程序分发往各服务器,没料到在第一个服务器上装的时候就郁闷掉了,发现进程会永远地阻塞在sem_wait()上。后来一调查才意识到,我开发的环境是FC6(用的2.6内核),人家是支持整套Posix IPC的,结果分发到的服务器以Rhel3甚至Rh7为主,内核很老(老到不是问题,主要是发行版编译时不开posix支持),我用的Posix的ipc函数就不支持。没办法,只好返工重写,这下改用System V的semaphore,这个东西比Posix的功能强,却也复杂了不少。Posix说是明日这标准,不过System V还是比较老,被支持广,这下写完,到是没啥问题了。这还只是在linux平台上呢,还没提什么solaris,bsd之流的,现在明白了为什么APUE一上来就介绍各种linux/unix版的区别了哎。
然后就是库版本什么的挑剔性啦,我写的这个程序要部署在实验室的20多台服务器上。这个工程很大,因为要首先给每台机器装上要用到的库(比如Xercesc),然后把源码拷过去,然后编译,只能写脚本来做这些工作,不过仍然是很麻烦,因为意外情况还是很多的。不能拷二进制程序吗?没戏。发行版各种各样,glibc版本各种各样,直接拷二进制的话,20台机器里有6、7台能正常就不错了。试想这些服务器要都是Windows 2003呢,直接分发二进制就是理所当然的啦,分发源代码再编译才是多此一举。

还有文档,一直在linux下写东西,能看的也就是man page加上google一些东西,偶尔在win下写程序时看MSDN时确实觉得是享受啊。。。man page,纯文字的不说,里面有各种各样的地方让你参见某某某,却又没个方便的链接过去的方法,影响编程心情啊。。。

编程

关于open-wrt下实现vpn客户端以及带动电脑从vpn上网的笔记

2007年6月3日

以下内容我是在Linksys WRT54G v2.0上实践的
安装open-wrt的主要文字可以看http://wiki.openwrt.org/OpenWrtDocs
首先当然是把它本来带的firmware刷成open-wrt,我用的是openwrt-wrt54g-squashfs.bin
我刷的方法是在他本来的web页面上上传的,其实保险起见应该把boot_wait开启,再这样做,但是web界面版本太新,我用了各种方法也没成功,就直接刷了,好在没失败。
然后要装一个webif^2(webif_latest_stable.ipk),因为本来自带的web页面功能太弱了。
基本设置我就不提了,然后就是安装一些与vpn有关的包,如下:

kmod-crypto_2.4.30-brcm-5_mipsel.ipk
kmod-mppe_2.4.30-brcm-5_mipsel.ipk
kmod-tun_2.4.30-brcm-5_mipsel.ipk
liblzo_2.02-1_mipsel.ipk
libopenssl_0.9.8d-1_mipsel.ipk
openvpn_2.0.9-1_mipsel.ipk
pptpd_1.3.0-1_mipsel.ipk

这些包我是装了cygwin,用scp命令传到路由上的。open-wrt默认是不带sftp的
pptp本身和普通电脑没什么区别,这里先介绍一open-wrt中与这部分相关的配置文件及脚本

在/etc/ppp/目录下,有peers.pptp和users.pptp两个文件,这是web界面下对pptp进行设置时保存的文件。
在/etc/init.d/
目录就下就启动时的脚本啦,有关的包括S35firewall, S90pptp,
S95custom-user-startup.其中S35firewall里就是很多iptables的命令,路由的设置主要就是由它决定的啦,
S35firewall还会调用到/etc/firewall.user,这里是由用户自行添加iptables命令的地方,不过我还是直接改动
S35firewall本身。
S90pptp则是启动VPN客户端的地方啦,它会按/etc/ppp/peers.pptp中的列表依次启动
VPN,这里有个功能让我耽误了好久。就是路由在启动的时候会根据上面提到的peers.pptp和users.pptp自动生成/etc/chap-
secrets和/etc/ppp/peers下的各文件,所以说你如果直接改动这些文件,下次启动时就又会被自动生成的文件内容覆盖,所以我只得把自己
编辑的上述配置文件存在/jffs下,然后在S90pptp启动VPN语句之前将他们cp到他们本应在的位置。路由自动生成的配置文件里要求mppe,我
把这一点给去掉了,我的pptp:XXXX如下:

pty “pptp 162.105.123.123 –nolaunchpppd”
#mppe required,stateless
name loudly
remotename vpn123
#file /etc/ppp/options.pptp
ipparam pptp:XXXX

usepeerdns

# do not require the server to authenticate to our client
noauth

lock
#noauth
refuse-eap
#refuse-chap
#refuse-mschap
nobsdcomp
#nodeflate

persist

另外,由于我要指定客户端的IP,还要改一下S90pptp中启动vpn的命令,也就是第一个循环中的runppp $peer那句,我改成了只针对XXXX的:

if [ $peer = BDWM ]; then
    pppd call pptp:XXXX 192.168.123.66: updetach
else
    runppp $peer
fi

至此,与vpn有关的部分就写完了

再说一下关于iptables的设置。
首先要设好路由,确定路由上接的电脑访问哪些地址直接走WAN口,哪些走vpn,这些设置可以写在S95custom-user-startup中,这里就不用帖出例子了。路由设好后,先在路由的shell下用wget试试对不对。
然后就是改S35firewall文件:
首先,为了允许转发从vpn走的包,在### FORWARDING段加入下面这行:

iptables -A FORWARD -i $LAN -o ppp0 -j ACCEPT

然后,再设置一下在vpn这条路径上的nat,在### MASQ段添加如下:

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

最后的问题就是vpn是在S90中才建立的,S35执行时还没有ppp0呢,所以我把S35firewall改成S91firewall,就OK了。

然后把路由电源拔掉,再插上,让他全自动地执行一下上面的操作,看看能不能正常,bless~~~~
PS:vpn连不上时看log很重要,客户端及服务器端都要看,open-wrt的syslogd默认情况下是不写/var/log/messages文件的,要在www界面下的log页面中设一下让它这样做。

网络 , ,

Linu下不输入密码连接远程主机的方法

2007年4月22日

zz from http://blog.csdn.net/colin719/archive/2007/01/16/1484469.aspx

SSH不输入密码连接远程Linux主机

机 理:公/私密钥验证。公钥(public key)用于加密,私钥(private key)用于对使用其匹配的公钥加密的数据进行解密。在本地机器生成一个密钥对,把公钥放到远程主机,然后从本地机器发起ssh连接,远程主机的sshd 产生一个随机数并用此公钥进行加密后发给本地机器,本地机器使用私钥进行解密并将结果发回,远程主机验证结果无误后准予登陆。

步骤:
注:密钥需要与远程Linux主机上的SSH系统相匹配。openSSH是Linux上默认的SSH系统,因此这里的内容只适用于openSSH。
1. 生成密钥对。

$ ssh-keygen -t rsa
这 个命令生成一个密钥对:id_rsa和id_rsa.pub。他们默认被保存在~/.ssh/目录下。可以将id_rsa.pub改为一个易于辨识这是谁的密钥的名字。在生成过程中会要求输入pass phrase,这个是用来保护私钥的使用的,即每次你使用私钥的时候需要先输入这个密码,因此这里不要输入任何字符,直接回车。

2. 上传公钥。
将生成的公钥,如test.pub,上传到远程主机的~/.ssh目录下,将test.pub的内容附加到authorized_keys文件末尾。

3. 远程主机SSH的设置
authorized_keys必须只有所有者才能访问:
$ chmod 600 ~/.ssh/authorized_keys
(下面两条语句我并没有用到)
另外,为了不在每次发起连接时输入pass phrase:
$ ssh-agent $SHELL
$ ssh-add
(注:这个是参照MPICH的SSH设置,我还不确定如果不使用MPICH的话这个是不是必需的。)

4. 连接

在Linux终端下,直接输入ssh remote_machine_name然后即可发起ssh连接,远程系统将进行公钥认证。

运维