今天学到一点docbook经验:

(1)一个比较全面的docbook样式指引: DocBook XSL: The Complete Guide http://www.sagehill.net/docbookxsl/index.html

(2)如果图片过大,超出PDF右边界,有时候可以简单地设置图片居中让图片显示全:

<imagedata fileref="images/status/cs_status.png" align="center" />

或者更好的办法:

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE 对任何会超过 PDF 宽度的图片都可以这样把图片限制在宽度内 :

<imagedata fileref="images/api_jbpm.png" align="center" width="100%" scalefit="1" />

 

(3)自定义表格宽度: colwidth="1*"表示此column为标准长度1倍,colwidth="4*"表示此column为标准列长度的4倍:

Xml代码 
  1. <title>状态变化表</title>  
  2. <table>  
  3.  <tgroup cols="3">  
  4.   <colspec colnum="1" colname="col1" colwidth="4*" />  
  5.   <colspec colnum="2" colname="col2" colwidth="6*" />  
  6.   <colspec colnum="3" colname="col3" colwidth="1*" />      
  7.   <thead>  
  8.    <row>  
 

 

使用Docbook发布文档,需要安装以下的工具:
*DocBook DTD
*DocBook XSL 样式单
*XSLT处理程序
*XSL-FO处理程序

下面详细介绍各个工具的安装。

1.安装DocBook DTD

Docbook DTD可以到OASIS的网站上下载(http://www.oasis-open.org/docbook/xml/),在这里你可以找到zip格式的压缩包。目前的最新版本是4.2。

事实上可以不下载Docbook DTD。如果你的文档DTD声明这样写:

<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">

根 据这样的定义,大部分XML处理器能够从网络上获取DTD。这样做的好处是编辑的Docbook文档移植性好,可以在没有安装Docbook DTD的机器上使用。不过由于Docbook DTD比较庞大,通过网络获取DTD会影响处理速度,在低速网络或者网络比较糟糕的情况下,影响尤为显著。

如果选择使用本地DTD,文档的DTD引用应该这样写:

Linux:
<!DOCTYPE book SYSTEM "/usr/share/docbook-4.2/docbookx.dtd">

Windows:
<!DOCTYPE book SYSTEM "file:///C:/xml/docbook42/docbookx.dtd">

Docbook提供了一种方式,让用户可以使用相同的DTD声明,但可以在使用网络获取DTD和使用本地DTD之间切换,同时拥有两者的优势。这就是catalog文件的作用。典型的catalog的声明如下:

<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<group id="DocbookDTD" prefer="public">
<system
systemId="http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
uri="file:///usr/share/xml/docbook42/docbookx.dtd"/>
</group>
</catalog>

这个声明把网络DTD映射到本地DTD。如果使用支持Catalog的XSLT Processor,它首先会查找本地文件,如果本地文件不存在,再查找网络。

2.安装Docbook XSL样式单

http://docbook.sourceforge.net上可以下载到Docbook XSL样式单,目前最新的版本是1.67.2。

解压之后,有几个比较主要的目录:
*common - 包含的是公用的模块,诸如语言之类的文件都在这里。
*extensions - 针对特定的XSLT Processor编写的扩展代码。
*fo - 生成XSL-FO文件所需的XSL样式单。
*html - 生成HTML文件所需的XSL样式单。
*images - 生成文档时所需要的图片。
*doc - 有关XSL样式单的文档,同样是Docbook文档。

其他还有像htmlhelp之类的目录,但不是生成HTML或XSL-FO所必须的。

3.安装XSLT Processor

目前有许多免费的XSLT Processor,最常用的是
*Saxon - 使用Java实现,http://saxon.sourceforge.net/
*Xalan - 有Java和C++版本,http://xml.apache.org/xalan-j/index.html
*xsltproc - 使用C实现,是最快的处理程序,http://xmlsoft.org/XSLT/

因为Saxon和Xalan都有Java版本,所以按照一般的Java程序的安装方式安装即可。下面介绍xsltproc的安装,因为它速度快,是我比较喜欢的处理程序。

如果你使用windows平台,那么你有两个方法可选:

*第一,直接下载为windows平台预编译的版本,可以在
ftp://ftp.zlatkovic.com/libxml/
上找到。你需要下载libxml, libxslt, 和iconv,它们都是zip格式,解压之后,在环境变量PATH中添加xsltproc.exe和.dll文件的路径。

如果你不想编辑环境变量,一个简单的办法是把下面这些文件复制到C:WindowsSystem32:
libxslt.dll
libxml2.dll
libexslt.dll
iconv.dll
xsltproc.exe

这样在命令行就可以直接找到这些文件了。完成之后,运行
xsltproc -version
打印出版本号则表明完成安装。

*第二,在Cygwin下安装,这是我选择使用的方式。Cygwin是一个在Windows下模拟Linux Shell的应用程序。如果你喜欢以Linux命令的方式来使用xsltproc,可以到
http://www.cygwin.com/
下载Cygwin安装程序。Cygwin的是通过网络安装的,首先你从它提供的包列表中选择libxslt,然后安装程序会根据依赖关系自动选择libxml2,确定之后,安装程序下载并安装xsltproc。完成安装之后,你就可以运行
xsltproc -version
来检查是否安装成功。

*第三,如果使用Linux,很有可能系统已经安装了xsltproc。运行
xsltproc -version
检查一下是否已经安装。如果运行命令失败,或者版本太老,那么访问下面两个URL获取最新的RPM包:
http://rpmfind.net/linux/rpm2html/search.php?query=libxml2
http://rpmfind.net/linux/rpm2html/search.php?query=libxslt

然后切换到root权限,安装新的包:
rpm -Uv libxml2-2.6.17-2.i386.rpm
rpm -Uv libxslt-1.1.12-4.i386.rpm

完成之后,就可以运行
xsltproc -version
检查安装是否完成。

安装之后,就可以使用xsltproc来生成HTML或者XSL-FO文件。

譬如,下面是根据Docbook文档生成HTML的例子:
xsltproc --output myfile.html docbook-xsl/html/docbook.xsl myfile.xml

或者根据docbook文档生成XSL-FO文档的例子:
xsltproc --output myfile.fo docbook-xsl/fo/docbook.xsl myfile.xml

http://xmlsoft.org/XSLT/xsltproc2.html上列出了所有xsltproc的命令行参数,或者直接运行
xsltproc也会打印出参数列表。

如果你只要发布HTML文档,那么到此为止。如果你还想发布PDF或是PS文档,那么需要安装XSL-FO处理程序。

4. 安装XSL-FO处理程序

XSL-FO处理程序根据XSLT处理程序生成的XSL-FO文件生成PDF或者PS文件。目前可供选择的XSL-FO处理程序远不如XSLT处理程序那么多,这是因为:
a. XSL-FO标准比XSLT标准的制订晚两年;
b.XSL-FO标准及其庞大而复杂,该标准的作者也发现其实现上的难度,从而将该标准分为基本、扩展和完整三个级别。

现在可用的免费的XSL-FO处理程序有:

*FOP - 来自Apache XML项目(http://xml.apache.org/fop/)。目前最新的版本是0.20.5,还在开发当中,还有很多特性不支持,不过已经可以满足一般的使用。

*PassiveTeX - 来自Sebastian Rahtz (http://www.tei-c.org.uk/Software/passivetex/)一款基于TeX的XSL-FO处理程序。同样也在开发中,较FOP要复杂的多。

另外有一些商业产品可供选择,可能生成的文档质量要比开源代码好,譬如:

*XEP(http://www.renderx.com)

*XSL Formatter(http://www.antennahouse.com)

下面介绍如何安装FOP。

4.1.首先需要安装JDK,这个不必多说。

4.2. 到http://www.apache.org/dyn/closer.cgi/xml/fop/下载FOP,可以选择tar或者zip压缩包。下载之后解压到本地。

4.3. 下载图形代码库。FOP自己不支持PNG之类的图片,如果在你的文档里会涉及到图片,那么需要下载额外的代码库。可以选择JAI(http://java.sun.com/products/java-media/jai/current.html),或者Jimi(http://java.sun.com/products/jimi/)。0.20.5之前的版本只能使用Jimi。下载之后,将jai_core.jar和jai_codec.jar(JAI),或者JimiProClasses.jar(Jimi)复制到FOP安装目录的lib目录下,然后在fop.bat(Windows平台)中添加

set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%jai_core.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%jai_codec.jar
或是
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%JimiProClasses.zip

如果使用fop.sh(Linux平台),会自动搜索。

4.4. 添加扩展代码。如果Docbook XSL样式单有针对FOP的扩展代码(目前没有),像上面一样把它们添加到FOP安装目录下lib目录。

现在就可以使用FOP来生成PDF文档了。FOP提供两个脚本fop.bat(Windows平台)和fop.sh(Unix和Linux平台)以方便使用。生成PDF的命令行如下:
Linux或Unix:
fop.sh -xsl /docbook-xsl/fo/docbook.xsl -xml myfile.xml -pdf myfile.pdf

Windows:
fop.bat -xsl /docbook-xsl/fo/docbook.xsl -xml myfile.xml -pdf myfile.pdf

在处理过程中,可能会提示某些属性不支持或尚未实现,不用理会这些提示,因为FOP仍处于开发中,这并不影响生成PDF文档。

到此,一个Docbook发布系统配置完成,并可以用来发布文档了。你完全可以在Linux上编写任务,通过该系统自动发布技术文档。
http://wiki.freebsd.org/qemu

在freebsd手册里看到的一个例子,摘录出来,以便以后查找使用。

14.11.8.1.1 加强 POP3 服务的安全

  工作时, 有一个允许外来连接的 SSH 服务器。 同一个办公网络中有一个邮件服务器提供 POP3 服务。 这个网络, 或从您家到办公室的网络可能不, 或不完全可信。 基于这样的原因, 您需要以安全的方式来查看邮件。 解决方法是创建一个到办公室 SSH 服务器的连接, 并通过这个连接来访问 POP3 服务:

% ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com
user@ssh-server.example.com's password: ******

  当这个通道连上时, 您可以把 POP3 请求发到 localhost 端口 2110。 这个连接将通过通道安全地转发到 mail.example.com

14.11.8.1.2 绕过严厉的防火墙

  一些大脑长包的网络管理员会使用一些极端的防火墙策略, 不仅过滤进入的连接, 而且也过滤连出的连接。 一些时候您可能只能连接远程机器 22 端口,以及 80 端口用来进行 SSH 和网页浏览。

  您可能希望访问一些其它的 (也许与工作无关的) 服务, 例如提供音乐的 Ogg Vorbis 流媒体服务器。 如果 Ogg Vorbis server 在 22 或 80 端口以外的端口播放音乐, 则您将无法访问它。

  解决方法是建立一个到您的网络的防火墙之外的网络上的 SSH 服务器, 并通过它提供的通道连接到 Ogg Vorbis 服务器上。

% ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org
user@unfirewalled-system.example.org's password: *******

  现在您可以把客户程序指定到 localhost 的 8888 端口, 它将把请求转发给 music.example.com 的 8000 端口, 从而绕过防火墙。

2 quilt

我们自己的项目可以用cvs或svn管理全部代码。但有时我们要使用其他开发者维护的项目。我们需要修改一些文件, 但又不能直接向版本管理工具提交代码。自己用版本管理工具重建整个项目是不合适的,因为大多数代码都是别人维护的,例如Linux内核。我们只是想管理好 自己的补丁。这时可以使用quilt。

2.1 基本概念

quilt是一个帮助我们管理补丁的程序。quilt的命令格式类似于cvs:

quilt 子命令 [参数]

0.46版的quilt有29个子命令。

掌握quilt的关键是了解使用quilt的流程。使用quilt时,我们会在一个完整的源代码树里工作。只要我们 在源代码树里使用了quilt命令,quilt就会在源代码树的根目录建立两个特殊目录:patches和.pc。quilt在patches目录保存它 管理的所有补丁。quilt用.pc目录保存自己的内部工作状态,用户不需要了解这个目录。

patches/series文件记录了quilt当前管理的补丁。补丁按照加入的顺序排列,早加入的补丁在前。quilt用堆栈的概念管理补丁的应用。

我们在应用补丁A前,必须先应用所有早于补丁A的补丁。所以,patches/series中的补丁总是从上向下应 用。例如:上图中,补丁1到补丁5是已经应用的补丁。我们可以将已应用的补丁想象成一个向下生长的堆栈,栈顶就是已应用的最新补丁。应用补丁就是将补丁入 栈,撤销补丁就是将补丁出栈。

我们在源代码树中作任何修改前,必须用"quilt add"命令将要修改的文件与一个补丁联系起来。在完成修改后,用"quilt refresh"命令将修改保存到已联系的补丁。下面我们通过一篇流程攻略来认识一下quilt的命令。

2.2 导入补丁

我们把 old-prj.tar.bz2 想象成Linux内核,我们把它解压后,进入代码树的根目录:

$ mkdir qtest; cd qtest; tar xvjf ../old-prj.tar.bz2; mv old-prj prj; cd prj

在修改代码前,我们通常要先打上官方补丁。在quilt中,可以用import命令导入补丁:

$ quilt import ../../prj.diff

Importing patch ../../prj.diff (stored as prj.diff)

执行improt命令后, prj 目录会多出一个叫 patches 的子目录:

$ find patches/ -type f

patches/prj.diff

patches/series

quilt在这个目录存放所有补丁和前面介绍的series文件。quilt的大多数命令都可以在代码树的任意子目录运行,不一定要从根目录运行。我们可以用applied命令查询当前已应用的补丁。

$ quilt applied

No patches applied

目前还没有应用任何补丁。unapplied命令查询当前还没有应用的补丁,top命令查询栈顶补丁,即已应用的最新补丁:

$ quilt unapplied

prj.diff

$ quilt top

No patches applied

我们可以使用push命令应用补丁,例如:

$ quilt push -a

Applying patch prj.diff

patching file src/drv/drv1.h

patching file src/sys/sys1.c

patching file src/sys/sys1.h

patching file src/usr/usr1.c

patching file src/usr/usr1.h

Now at patch prj.diff

push的"-a"参数表示应用所有补丁。在使用push命令后,prj 目录会多了一个叫.pc的隐含子目录。quilt用这个目录保存内部状态,用户不需要了解这个目录。应用补丁后,我们再使用applied、unapplied和top命令查看:

$ quilt applied

prj.diff

$ quilt unapplied

File series fully applied, ends at patch prj.diff

$ quilt top

prj.diff

2.3 修改文件

我们必须将对源代码树所作的任何改动都和一个补丁联系起来。add命令将文件的当前状态与补丁联系起来。add命令的格式为:

quilt add [-P 补丁名] 文件名

如果未指定补丁名,文件就与栈顶补丁联系起来。目前,我们的栈顶补丁是官方补丁。我们不想修改这个补丁,可以用new命令新建一个补丁:

$ quilt new drv_p1.diff

Patch drv_p1.diff is now on top

$ quilt top

drv_p1.diff

$ quilt applied

prj.diff

drv_p1.diff

$ quilt unapplied

File series fully applied, ends at patch drv_p1.diff

然后用add命令向栈顶补丁添加一个准备修改的文件:

$ cd src/drv; quilt add drv2.h

File src/drv/drv2.h added to patch drv_p1.diff

add命令为指定补丁保存了指定文件的当前快照,当我们执行refresh命令时,quilt就会检查文件 的变化,将差异保存到指定补丁中。使用"quilt diff -z [-P 补丁名] [文件名]"可以查看指定补丁指定文件的当前改动。省略-P参数表示查看当前补丁的改动,省略文件名表示查看所有改动。我们修改drv2.h后,执行 diff命令:

$ quilt diff -z

Index: prj/src/drv/drv2.h

===================================================================

--- prj.orig/src/drv/drv2.h 2008-03-02 13:37:34.000000000 +0800

+++ prj/src/drv/drv2.h 2008-03-02 13:38:53.000000000 +0800

@@ -1,7 +1,7 @@

-#ifndef APP1_H

-#define APP1_H

+#ifndef DRV2_H

+#define DRV2_H

 

-#include "def1.h"+#include "def2.h" #endif

 

只要文件已经与我们希望保存改动的补丁联系过了,我们就可以多次修改文件。使用"quilt files [补丁名]"命令可以查看与指定补丁关联的文件。使用"quilt files -val"可以查看所有补丁联系的所有文件。"-v"参数表示更友好的显示,"-a"参数表示显示所有补丁,"-l"参数显示补丁名。例如:

$ quilt files

src/drv/drv2.h

$ quilt files -val

[prj.diff] src/drv/drv1.h

[prj.diff] src/sys/sys1.c

[prj.diff] src/sys/sys1.h

[prj.diff] src/usr/usr1.c

[prj.diff] src/usr/usr1.h

[drv_p1.diff] src/drv/drv2.h

"quilt refresh [补丁名]"刷新补丁,即将指定补丁的文件变化保存到补丁。省略文件名表示刷新栈顶补丁。我们refresh后,查看补丁文件:

$ quilt refresh

Refreshed patch drv_p1.diff

$ cat ../../patches/drv_p1.diff

Index: prj/src/drv/drv2.h

===================================================================

--- prj.orig/src/drv/drv2.h 2008-03-02 12:42:21.000000000 +0800

+++ prj/src/drv/drv2.h 2008-03-02 12:46:25.000000000 +0800

@@ -1,7 +1,7 @@

-#ifndef APP1_H

-#define APP1_H

+#ifndef DRV2_H

+#define DRV2_H

 

-#include "def1.h"

+#include "def2.h"

 

#endif

 

"quilt diff -z"命令不会显示已经保存的差异。"quilt diff"显示所有的差异,不管是否保存过。

2.4 再做几个补丁

在增加文件前,我们要先将准备增加的文件与补丁联系起来。我们新建一个补丁,然后新增两个文件src/applet/applet1.h和src/applet/applet1.c。

$ cd ..; quilt new more_p1.diff

Patch more_p1.diff is now on top

$ quilt add applet/applet.c

File src/applet/applet.c added to patch more_p1.diff

$ quilt add applet/applet.1

File src/applet/applet.1 added to patch more_p1.diff

 

看看我们增加的文件:

$ quilt files

src/applet/applet.1

src/applet/applet.c

 

哎呀,文件名写错了。我们可以用"remove"命令从补丁中删除关联文件:

$ quilt remove applet/applet.1

rm: remove write-protected regular empty file `.pc/more_p1.diff/src/applet/applet.1'? y

File src/applet/applet.1 removed from patch more_p1.diff

$ quilt remove applet/applet.c

rm: remove write-protected regular empty file `.pc/more_p1.diff/src/applet/applet.c'? y

File src/applet/applet.c removed from patch more_p1.diff

$ quilt files

$ quilt add applet/applet1.h

File src/applet/applet1.h added to patch more_p1.diff

$ quilt add applet/applet1.c

File src/applet/applet1.c added to patch more_p1.diff

$ quilt files

src/applet/applet1.c

src/applet/applet1.h

 

好了,现在可以创建新文件:

$ mkdir applet

$ echo -e "#ifndef APPLET1_Hn#define APPLET1_Hn#include "def1.h"n#endif">applet/applet1.h

$ echo -e "#include "applet1.h"">applet/applet1.c

$ quilt refresh more_p1.diff

Refreshed patch more_p1.diff

 

刷新补丁后,我们再修改文件drv2.h。修改前一定要先将文件与准备保存改动的补丁联系起来:

$ quilt add drv/drv2.h

File src/drv/drv2.h added to patch more_p1.diff

$ vi drv/drv2.h

$ quilt diff -z drv/drv2.h

Index: prj/src/drv/drv2.h

===================================================================

--- prj.orig/src/drv/drv2.h 2008-03-02 14:19:35.000000000 +0800

+++ prj/src/drv/drv2.h 2008-03-02 14:31:28.000000000 +0800

@@ -1,7 +1,7 @@

#ifndef DRV2_H

#define DRV2_H

 

-#include "def2.h"

+#include "def1.h"

 

#endif

 

我们再新建一个补丁,然后删除两个文件。删除文件前也要先为文件建立关联:

$ quilt new more_p2.diff

Patch more_p2.diff is now on top

$ quilt add app/*

File src/app/app1.c added to patch more_p2.diff

File src/app/app1.h added to patch more_p2.diff

File src/app/app2.c added to patch more_p2.diff

File src/app/app2.h added to patch more_p2.diff

$ rm -rf app

$ quilt refresh

Refreshed patch more_p2.diff

 

我们再修改applet/applet1.h:

$ quilt edit applet/applet1.h

File src/applet/applet1.h added to patch more_p2.diff

$ quilt refresh

Refreshed patch more_p2.diff

 

"quilt edit"在调用"quilt add"后自动启动编辑器。用refresh命令刷新补丁。

对了,前面为more_p1.diff修改drv2.h后还没有刷新呢。我们查看修改并刷新:

$ quilt diff -z -P more_p1.diff

Index: prj/src/drv/drv2.h

===================================================================

--- prj.orig/src/drv/drv2.h 2008-03-02 14:19:35.000000000 +0800

+++ prj/src/drv/drv2.h 2008-03-02 14:31:28.000000000 +0800

@@ -1,7 +1,7 @@

#ifndef DRV2_H

#define DRV2_H

 

-#include "def2.h"

+#include "def1.h"

 

#endif

 

Warning: more recent patches modify files in patch more_p1.diff

$ quilt refresh more_p1.diff

More recent patches modify files in patch more_p1.diff. Enforce refresh with -f.

$ quilt refresh -f more_p1.diff

Refreshed patch more_p1.diff

quilt会抱怨更新的补丁修改了补丁more_p1.diff的文件。这是在说more_p2.diff修改了applet1.h。我们知道这和我们要刷新的drv2.h没关系,所以可以用-f参数强制刷新。

2.5 管理补丁

series命令可以查看series文件中的补丁:

$ quilt series

prj.diff

drv_p1.diff

more_p1.diff

more_p2.diff

"quilt patches 文件名"显示修改了指定文件的所有补丁,例如:

$ quilt patches drv/drv2.h

drv_p1.diff

more_p1.diff

"quilt annotate 文件名"显示指定文件的修改情况,它会指出哪个补丁修改了哪一行。例如:

$ quilt annotate drv/drv2.h

1 #ifndef DRV2_H

1 #define DRV2_H

 

2 #include "def1.h"

#endif

1 drv_p1.diff

2 more_p1.diff

我们可以使用push和pop命令应用补丁或撤销补丁,例如:

$ quilt pop -a

Removing patch more_p2.diff

Restoring src/app/app1.c

Restoring src/app/app2.c

Restoring src/app/app2.h

Restoring src/app/app1.h

Restoring src/applet/applet1.h

 

Removing patch more_p1.diff

Restoring src/drv/drv2.h

Removing src/applet/applet1.h

Removing src/applet/applet1.c

 

Removing patch drv_p1.diff

Restoring src/drv/drv2.h

 

Removing patch prj.diff

Restoring src/sys/sys1.c

Restoring src/sys/sys1.h

Restoring src/drv/drv1.h

Removing src/usr/usr1.c

Removing src/usr/usr1.h

No patches applied

$ quilt top

No patches applied

$ quilt next

prj.diff

$ quilt previous

No patches applied

"quilt pop -a"撤销所有补丁。top命令显示栈顶命令,即当前应用的最新的补丁。next命令显示下一个可以应用的补丁。previous显示上一条应用过的补丁。"push 补丁A"将从上到下依次应用所有早于补丁A的补丁,最后应用补丁A。例如:

$ quilt push more_p1.diff

Applying patch prj.diff

patching file src/drv/drv1.h

patching file src/sys/sys1.c

patching file src/sys/sys1.h

patching file src/usr/usr1.c

patching file src/usr/usr1.h

Applying patch drv_p1.diff

patching file src/drv/drv2.h

Applying patch more_p1.diff

patching file src/applet/applet1.c

patching file src/applet/applet1.h

patching file src/drv/drv2.h

Now at patch more_p1.diff

$ quilt top

more_p1.diff

$ quilt next

more_p2.diff

$ quilt previous

drv_p1.diff

"quilt push -a"应用所有补丁:

$ quilt push -a

Applying patch more_p2.diff

patching file src/app/app1.c

patching file src/app/app1.h

patching file src/app/app2.c

patching file src/app/app2.h

patching file src/applet/applet1.h

Now at patch more_p2.diff

"quilt graph -all"可以为栈顶补丁的依赖关系生成dot文件。Graphviz的dot可以根据dot文件产生图片,例如:

$ quilt graph --all > ../../more_p2.dot

$ cd ../..; dot -Tpng more_p2.dot -o more_p2.png

2.6 发布补丁

只要将patches目录打包发布就可以了。例如:

$ cd prj; tar cvjf prj-0.1-patches.tar.bz2 patches; mv prj-0.1-patches.tar.bz2 ../..

用户先下载、解压补丁包对应的源代码树:

$ cd ../..; mkdir user; cd user; tar xvjf ../old-prj.tar.bz2; mv old-prj/ prj

然后下载、解压补丁:

$ cd ../..; tar xvjf prj-0.1-patches.tar.bz2; cd user/prj

最后把补丁目录链接到源代码树的patches目录,然后应用所有补丁:

$ ln -sfn ../../patches/ patches

$ quilt push -a

Applying patch prj.diff

patching file src/drv/drv1.h

patching file src/sys/sys1.c

patching file src/sys/sys1.h

patching file src/usr/usr1.c

patching file src/usr/usr1.h Applying patch drv_p1.diff

patching file src/drv/drv2.h

Applying patch more_p1.diff

patching file src/applet/applet1.c

patching file src/applet/applet1.h

patching file src/drv/drv2.h

Applying patch more_p2.diff

patching file src/app/app1.c

patching file src/app/app1.h

patching file src/app/app2.c

patching file src/app/app2.h

patching file src/applet/applet1.h

Now at patch more_p2.diff

3 结束语

在上面的流程攻略中,我们演示了19个quilt命令:add, annotate, applied, diff, edit, files, graph, import, new, next, patches, pop, previous, push, refresh, remove, series, top, unapplied。

本次Linux之旅到此结束,欢迎您再次参加Linux之旅,一起探索浩瀚的Linux世界。

diff和patch是在Linux环境为源代码制作和应用补丁的标准工具。diff可以比较文件或目录的差异,并 将差异记录到补丁文件。patch可以将补丁文件应用到源代码上。quilt也是一个制作和应用补丁的工具,它适合于管理较多补丁。quilt有自己的特 有的工作方式。本文通过简单的例子介绍这三个常用的工具。

0 示例工程

我们先准备一个用来做实验的工程,它包含若干子目录和文件。可以用find命令列出文件清单:

$ find old-prj/ -type f
old-prj/inc/def1.h
old-prj/inc/def2.h
old-prj/src/sys/sys1.c
old-prj/src/sys/sys1.h
old-prj/src/app/app1.c
old-prj/src/app/app2.c
old-prj/src/app/app2.h
old-prj/src/app/app1.h
old-prj/src/drv/drv1.h
old-prj/src/drv/drv2.c
old-prj/src/drv/drv1.c
old-prj/src/drv/drv2.h
old-prj/build/Makefile

find命令的"-type f"参数选择普通文件,可以省略掉目录。希望自己操作的读者可以下载这个示例工程

1 diff和patch

1.1 比较一个文件

将old-prj.tar.bz2放到我们的工作目录,然后建立一个子目录,进入后解压示例工程:

$ mkdir test1; cd test1; tar xvjf ../old-prj.tar.bz2

用分号分隔多个命令可以节省篇幅。将old-prj复制到new-prj:

$ cp -a old-prj/ new-prj

让我们编辑一个文件。src/drv/drv1.h的内容本来是:

$ cat -n old-prj/src/drv/drv1.h
     1  #ifndef DRV1_H
     2  #define DRV1_H
     3
     4  #include "def1.h"
     5
     6  typedef struct {
     7    int p1;
     8    int p2;
     9    int p3;
    10  } App1;
    11
    12  void do_app1(void);
    13
    14  #endif

cat命令的"-n"参数可以增加行号。我们用vi将它修改成:

$ cat -n new-prj/src/drv/drv1.h
     1  #ifndef DRV1_H
     2  #define DRV1_H
     3
     4  #include "def1.h"
     5
     6  typedef struct {
     7    int a;
     8    int b;
     9  } App1;
    10
    11  void do_app1(void);
    12
    13  #endif

现在可以用diff命令比较文件了:

$ diff -u old-prj/src/drv/drv1.h new-prj/src/drv/drv1.h
--- old-prj/src/drv/drv1.h      2008-03-01 12:59:46.000000000 +0800
+++ new-prj/src/drv/drv1.h      2008-03-01 13:07:14.000000000 +0800
@@ -4,9 +4,8 @@
 #include "def1.h"
 
 typedef struct {
-  int p1;
-  int p2;
-  int p3;
+  int a;
+  int b;
 } App1;
 
 void do_app1(void);

diff程序按行比较文本文件。比较文件的diff命令格式是:

$ diff -u 旧文件 新文件

"-u"参数指定diff命令使用 unified 格式,这是一种最常用的格式,我们来看看它的含义。

1.2 diff的 unified 格式

以"---"开头的行是旧文件信息,以"+++"开头的行是新文件信息:

--- old-prj/src/drv/drv1.h      2008-03-01 12:59:46.000000000 +0800
+++ new-prj/src/drv/drv1.h      2008-03-01 13:07:14.000000000 +0800

unified 格式默认在变化部分的前后各显示三行上下文。在上例中,旧文件的7、8、9行被替换成新文件的7、8行。旧文件的变化部分是7-9行,前后多显示3行,因 此显示4-12行。新文件的变化部分是7-8行,前后多显示3行,因此显示4-11行。以"@@"包围的行指示补丁的范围:

@@ -4,9 +4,8 @@

'-4,9'中,'-'表示旧文件,'4,9'表示从第4行开始,显示9行,即显示4-12行。'+4,8' 中,'+'表示新文件,'4,8'表示从第4行开始,显示8行,即显示4-11行。"@@"行之后是上下文和变化的文本,其中'-'开头的行是旧文件特有 的,'+'开头的行是新文件特有的,其它行是两个文件都有的,即补丁的上下文。例如:

 #include "def1.h"
 
 typedef struct {
-  int p1;
-  int p2;
-  int p3;
+  int a;
+  int b;
 } App1;
 
 void do_app1(void);

1.3 制作和应用补丁

所谓制作补丁就是diff的输出重定向到一个文件,这个文件就是补丁文件。例如:

$ diff -u old-prj/src/drv/drv1.h new-prj/src/drv/drv1.h>../drv1.diff

我们将old-prj解压到另一个目录,准备应用这个补丁:

$ cd ..; mkdir test2; cd test2; tar xvjf ../old-prj.tar.bz2; mv old-prj myprj; cd myprj

在真实场景中,test2目录通常是在用户2的电脑上。用户2可能不使用 old-prj 作为第一级目录的名字。例如:用户1的第一级目录名是 linux-2.6.23.14, 用户2的第一级目录名是linux。所以我们将 old-prj 改为 myprj 以模拟这种情况。

我们在 myprj 目录使用patch命令应用补丁:

$ patch -p1 < ../../drv1.diff
patching file src/drv/drv1.h

patch命令行中为什么没有出现要打补丁的文件?这是因为patch命令可以使用补丁文件中的文件信息:

--- old-prj/src/drv/drv1.h      2008-03-01 12:59:46.000000000 +0800

"-pn"参数(上例中n=1)中的n表示要从补丁文件的文件路径中去掉几层目录,可以理解为去掉几个'/'。例 如:p1表示去掉一层目录,"old-prj/src/drv/drv1.h"去掉一层就成为"src/drv/drv1.h"。patch命令在 myprj 目录找到"src/drv/drv1.h"后应用补丁。

我们通常都在代码树的上一层目录制作补丁,在代码树的根目录应用补丁。因此,最常用的patch命令格式是:

$ patch -p1 < 补丁文件

1.4 比较目录

我们回到test1目录,再对 new_prj 做一些改动。这次我们删除掉src/sys目录及其中的文件。再建立src/usr目录,并在该目录增加两个文件usr1.h和usr1.c。

$ cd ../../test1; rm -rf new-prj/src/sys; mkdir new-prj/src/usr
$ echo -e "#ifndef USR1_Hn#define USR1_Hn#include "def1.h"n#endif">new-prj/src/usr/usr1.h
$ echo -e "#include "usr1.h"">new-prj/src/usr/usr1.c

echo命令的"-e"参数打开对转义符的支持,bash默认是不支持转义符的。

现在我们比较目录并制作补丁:

$ diff -Nur old-prj/ new-prj/ > ../prj.diff

读者可以cat这个补丁文件的内容。根据前面的介绍,读者应该能看懂补丁文件了吧。

比较目录的常用命令是:

$ diff -Nur 旧目录 新目录 > 补丁文件

$ diff -Naur 旧目录 新目录 > 补丁文件

"-u"参数前面已经介绍过了。"-N"参数将不存在的文件当作空文件。如果没有这个参数,补丁就不会包含孤儿文件(即另一方没有的文件)。"-r"参数表示比较子目录。"-a"参数表示将所有文件当作文本文件。

我们再准备一个目录来应用补丁:

$ cd ..; mkdir test3; cd test3; tar xvjf ../old-prj.tar.bz2; mv old-prj myprj; cd myprj

在源代码树的根目录应用补丁:

$ patch -p1 < ../../prj.diff
patching file src/drv/drv1.h
patching file src/sys/sys1.c
patching file src/sys/sys1.h
patching file src/usr/usr1.c
patching file src/usr/usr1.h

好了,读者可以用"diff -Nur"比较一下"test1/new_prj"和"test3/myprj",没有输出就表示完全相同。

$ cd ../..; diff -Nur test1/new-prj test3/myprj

1.5 很多的补丁...

一个大项目可能有不同开发者提供很多补丁。这些补丁可能还存在依赖关系,例如补丁B必须打在补丁A上。我们当然可以凭着程序员的“心细如发”去管理好这些补丁,不过有一个叫quilt的工具可以使我们轻松一些。当然,即使有工具的帮助,细心和认真也是必需的。 

附录

为了简单起见,前面只介绍了一个"diff -Nur 老目录 新目录"的用法。有时候,新目录里只放了修改过的文件。这时可以不使用-N参数以忽略孤儿文件,即"diff -ur 老目录 新目录"。diff会输出孤儿文件的提示,我们可以删除或保留这些提示,它们对patch没有影响。

使用diff时可以用--exclude排除文件和目录,例如:

diff -ur -exclude=.* --exclude=CVS prj_old prj_new

上例排除了源代码树中以'.'开头的文件和所有CVS目录。其实对于CVS项目,可以直接在源代码树根目录中执行:

cvs diff -u3 > 补丁文件名

u3表示输出3行上下文的unified 格式。打补丁时在源代码树根目录中执行:

patch -p0 < 补丁文件名

"cvs diff"会自动忽略CVS项目外的文件。通过CVS的tag和补丁文件,我们可以方便地保存工作快照。

  大家应该都知道通过webshell 可以提权,这里简单的讲述一个怎么能够防止别人利用webshell进行提权,也就是说就算恶意用户取得了某个服务器某站点的webshell,也是没办法进行提升权限的。

  防止webshell运行cmd命令

 

  这里讲述一个简单的方法,那就是把默认的CMD名称改成其他任何复杂名称。自己需要使用的时候可以更改回来。这个是最简单的,当然也存 在安全隐患,当恶意用户上传一个CMD到任意目录下,就可以执行了,这里可以找到很安全的设置方法,比如设置CMD 运行的权限,把所有权限都删除掉,当使用的时候在把权限加上去,wscript.shell 相信大家都比较了解它,Wscript.Shell可以调用系统内核运行DOS基本命令,这里可以通过修改注册表,将此组件改名或删除(建议改名),方法 如下:

 

  HKEY_CLASSES_ROOTWscript.Shell

 

  HKEY_CLASSES_ROOTWscript.Shell.1

 

  这个样子几个简单的步骤就可以达到webshell无法运行cmd命令的效果。

 

  修改系统默认文件夹漏洞

 

  也就是最常见的 C:Documents and SettingsAll Users,虽然大部分人都知道这里可以进程上传,但管理员一般很少注意到这个目录的权限问题,从而产生安全隐患。在这里我们吧此文件夹的阅读权限设置只 允许管理员用户和system用户完全控制,其他的屏蔽掉即可。

 

  Serv-U提权

 

  Serv-U 作为一款精典的FTP服务器软件,一直被大部分管理员所使用,它简单的安装和配置以及强大的管理功能的人性化也一直被管理员们称颂。但是随着使用者越来越 多,该软件的安全问题也逐渐显露出来。Serv-U 提升权限 ASP版 6.2 ,我们怎么能够防止它进行提权呢?那么只需更改默认端口和默认FTP软件的 账户和密码,默认管理员:LocalAdministrator,默认密码:#l@$ak#.lk;0@P,其修改方法如下:

 

  首先利用Ultraedit修改文件ServUDaemon.exe和ServUAdmin.exe两个程序,将默认密码修改成同等长 度的其它字符,然后用Ultraedit打开ServUAdmin.exe查找最后一个B6AB(43958的16进制),替换成自定义的端口比如 3930(12345)即可。

 

  当然也希望各各管理员能够及时更新自己的Serv-U 因为这个漏洞只有一些Serv-U的老版本存在的漏洞!最新的Serv-U已经不存在此漏洞和加入了 管理员密码的功能!让我们使用起来更加安全!

 

  安全设置IIS用户

 

  重新建立一个用户然后把用户所在组删除,让其独立,然后在IIS中指派给其网站,然后在网站跟目录指派其用户读取、运行,即可,此时即使WEBSHELL上传成功也只能在网站文件夹内活动,涉及不到其他文件夹。

 

  总结:以上介绍主要是一些常规的防范方式,不同的环境有着不同的设置,如果计算机中安装了其他软件,那就需要相对应的设置了。

14.1 Red Hat Linux and "clones"(小紅帽和它的弟兄娣妹)

自從我開始寫 [33]IPv6 & Linux - HowTo.我打算設定一個持久的IPv6配置,包
含: host-only, router-only, dual-homed-host, router with second stub
network, normal tunnels, 6to4 tunnels 和其它.現在我寫了一
個configuration and script files 這個script有自己的HOWTO:

[34]IPv6-HOWTO/scripts/current. 夠運的是, Red Hat Linux 從 7.1 開始就
包含了這個script.多虧了Pekka Savola的幫助.

14.2 Mandrake(曼德萊克)Linux

從8.0後也包含了 IPv6-enabled initscript package但是有點小問
題("ifconfig" misses "inet6" before "add").

支持IPv6的網路設定 scripts 測試

script library應該存在:
______________________________________________________________

/etc/sysconfig/network-scripts/network-functions-ipv6
______________________________________________________________

自動測試:
______________________________________________________________

# test -f /etc/sysconfig/network-scripts/network-functions
-ipv6 && echo "Main
? IPv6 script library exists"
______________________________________________________________

library的版本很重要, 更高的版本包含了更多的功能.您可以通過這個檢視它:
______________________________________________________________

# source /etc/sysconfig/network-scripts/network-functions-
ipv6 &&
? getversion_ipv6_functions
20011124
______________________________________________________________

Short hint for enabling IPv6 on current RHL 7.1, 7.2, 7.3, ...(一些小提示)

* 檢視IPv6模組是否已經掛進系統.
______________________________________________________________

# modprobe -c | grep net-pf-10
alias net-pf-10 off
______________________________________________________________

* 如果是"off" 在 /etc/sysconfig/network 中加入IPv6的支持.
______________________________________________________________

NETWORKING_IPV6=yes
______________________________________________________________

* 重新初始網路:
______________________________________________________________

# service network restart
______________________________________________________________

* IPv6模組應該掛進來了:
______________________________________________________________

# modprobe -c | grep ipv6
alias net-pf-10 ipv6
______________________________________________________________

如果您提供路由廣告autoconfiguration 會自動為您設定, 更多的資訊請看
/usr/share/doc/initscripts-$version/sysconfig.txt.

14.3 SuSE(蘇澤斯)Linux

7.x 以上, 支持IPv6. 在/etc/rc.config 裡有更多的資訊. 因為不同的設定方
法和scripts結構, 所以不能將Red Hat Linux 當中的方法照搬過來.

更詳盡的資訊請看:

[35]How to setup 6to4 IPv6 with SuSE 7.3

14.4 Debian(迪比安)Linux

參照: [36]IPv6 on Debian Linux

15. 防火牆

15.1 使用 netfilter6防火牆

netfilter6防火牆只支持2.4以上的核心.早期的2.2核心您只能用41號協議過
濾IPv6-in-IPv4.

警告: 按照例子那樣設定並不能真正地保護您的作業系統.

15.2 更多的資訊:

* [37]Netfilter project
* [38]maillist archive of netfilter users
* [39]maillist archive of netfilter developers
* [40]Unofficial status informations

15.3 準備

下載最新的核心:
[41]http://www.kernel.org/

下載最新的iptables:

tar:
[42]http://www.netfilter.org/

Source RPM for rebuild of binary (for RedHat systems):
[43]ftp://ftp.redhat.com/redhat/linux/rawhide/SRPMS/SRPMS/

解開源代碼

解開源代碼與更名
______________________________________________________________

# tar z|jxf kernel-version.tar.gz|bz2
# mv linux linux-version-iptables-version+IPv6
______________________________________________________________

解開 iptables 源代碼
______________________________________________________________

# tar z|jxf iptables-version.tar.gz|bz2
______________________________________________________________

Apply pending patches
______________________________________________________________

# make pending-patches KERNEL_DIR=/path/to/src/linux-version-iptables-
version/
______________________________________________________________

Apply additional IPv6 related patches (still not in the vanilla kernel
included)
______________________________________________________________

# make patch-o-matic KERNEL_DIR=/path/to/src/linux-version-iptables-ve
rsion/
______________________________________________________________

在下面的選單中回答yes:
* ah-esp.patch
* masq-dynaddr.patch (only needed for systems with dynamic IP
assigned WAN connections like PPP or PPPoE)
* ipv6-agr.patch.ipv6
* ipv6-ports.patch.ipv6
* LOG.patch.ipv6
* REJECT.patch.ipv6

檢視IPv6括展:
______________________________________________________________

# make print-extensions
Extensions found: IPv6:owner IPv6:limit IPv6:mac IPv6:multiport
______________________________________________________________

Configure, build and install new kernel(設定,編譯,安裝新的核心)

進入代碼目錄:
______________________________________________________________

# cd /path/to/src/linux-version-iptables-version/
______________________________________________________________

改變Makefile
______________________________________________________________

- EXTRAVERSION =
+ EXTRAVERSION = -iptables-version+IPv6-try
______________________________________________________________

運行相關的設定:Run configure, enable IPv6 related
______________________________________________________________

Code maturity level options
Prompt for development and/or incomplete code/drivers : yes
Networking options
Network packet filtering: yes
The IPv6 protocol: module
IPv6: Netfilter Configuration
IP6 tables support: module
All new options like following:
limit match support: module
MAC address match support: module
Multiple port match support: module
Owner match support: module
netfilter MARK match support: module
Aggregated address check: module
Packet filtering: module
REJECT target support: module
LOG target support: module
Packet mangling: module
MARK target support: module
______________________________________________________________

在系統的其它方面進行相應的修改.

Rebuild and install binaries of iptables (打造一個新的iptables)

確定您的核心源代碼存在於: /usr/src/linux/

Rename older directory
______________________________________________________________

# mv /usr/src/linux /usr/src/linux.old
______________________________________________________________

Create a new softlink
______________________________________________________________

# ln /path/to/src/linux-version-iptables-version /usr/src/linux
______________________________________________________________

Rebuild SRPMS
______________________________________________________________

# rpm --rebuild /path/to/SRPMS/iptables-version-release.src.rpm
______________________________________________________________

Install new iptables packages (iptables + iptables-ipv6) 安裝新
的iptables
* On RH 7.1 systems, 通常已經有一個更早的版本, therefore use
"freshen"
______________________________________________________________

# rpm -Fhv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm
______________________________________________________________

* 如果沒有安裝,您就親自來吧:
______________________________________________________________

# rpm -ihv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm
______________________________________________________________

* 如果在RH6.2上安裝,要加上"--nodep":
______________________________________________________________

# rpm -ihv --nodep /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm

______________________________________________________________

* 可能要為iptables加上一個softlink:
______________________________________________________________

# ln -s /lib/iptables/ /usr/lib/iptables
______________________________________________________________

15.4 使用方法

檢視

將模組掛進來:
______________________________________________________________

# modprobe ip6_tables
______________________________________________________________

檢視
______________________________________________________________

# [ ! -f /proc/net/ip6_tables_names ] && echo "Current kernel doesn't
support
? 'ip6tables' firewalling (IPv6)!"
______________________________________________________________

15.5 使用ip6tables

16.3.2.1. List all IPv6 netfilter entries

Short

# ip6tables -L



Extended

# ip6tables -n -v --line-numbers -L


List specified filter
# ip6tables -n -v --line-numbers -L INPUT


加入一個日誌:
# ip6tables --table filter --append INPUT -j LOG --log-prefix "INPUT:"
? --log-level 7


加入一個入站丟棄的條件:
# ip6tables --table filter --append INPUT -j DROP


移除一個條件:
# ip6tables --table filter --delete INPUT 1


允許 ICMPv6:
Using older kernels (unpatched kernel 2.4.5 and iptables-1.2.2) no type can be
specified


允許入站 ICMPv6 經過 tunnels

# ip6tables -A INPUT -i sit+ -p icmpv6 -j ACCEPT



允許出站 ICMPv6 經過 tunnels
# ip6tables -A OUTPUT -o sit+ -p icmpv6 -j ACCEPT


Newer kernels allow specifying of ICMPv6 types:

# ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT


限制Rate-limiting
Because it can happen (author already saw it to times) that an ICMPv6 storm wil
l raise up, you should use available rate limiting for at least ICMPv6 ruleset.
In addition logging rules should also get rate limiting to prevent DoS attacks
against syslog and storage of log file partition. An example for a rate limite
d ICMPv6 looks like:

# ip6tables -A INPUT --protocol icmpv6 --icmpv6-type echo-request -j ACCEPT --m
atch limit --limit 30/minute


允許入站的 SSH
Here an example is shown for a ruleset which allows incoming SSH connection fro
m a specified IPv6 address


允許來自 3ffe:ffff:100::1/128 的 SSH 入站

# ip6tables -A INPUT -i sit+ -p tcp -s 3ffe:ffff:100::1/128 --sport 512:65535
? --dport 22 -j ACCEPT



允許回應包Allow response packets (此刻 IPv6 連結追蹤不在 mainstream netfilter6
implemented 當中)

# ip6tables -A OUTPUT -o sit+ -p tcp -d 3ffe:ffff:100::1/128 --dport 512:65535
? --sport 22 ! --syn j ACCEPT


充許 tunneled IPv6-in-IPv4
Tto accept tunneled IPv6-in-IPv4 packets, 在IPv4 防火牆做相應的設定 firewall se
tup relating to such packets, for example


充許 interface ppp0 的 IPv6-in-IPv4 入站

# iptables -A INPUT -i ppp0 -p ipv6 -j ACCEPT



充許 interface ppp0 的 IPv6-in-IPv4 出站

# iptables -A OUTPUT -o ppp0 -p ipv6 -j ACCEPT


If you have only a static tunnel, you can specify the IPv4 addresses, too, like



充許來自 endpoint 1.2.3.4 的 IPv6-in-IPv4 通過 interface ppp0 入站

# iptables -A INPUT -i ppp0 -p ipv6 -s 1.2.3.4 -j ACCEPT



充許來自 endpoint 1.2.3.4 的 IPv6-in-IPv4 通過 interface ppp0 入站

# iptables -A OUTPUT -o ppp0 -p ipv6 -d 1.2.3.4 -j ACCEPT


16.3.2.10. Protection against incoming TCP connection requests
極力推薦! 出於安全考慮 您應當加入一個阻止TCP 連結請求入站的條件 . Adapt "-i" op
tion, if other interface names are in use!


阻止入站的 TCP 連結請求

# ip6tables -I INPUT -i sit+ -p tcp --syn -j DROP


在路由器後面 阻止入站的 TCP 連結請求

# ip6tables -I FORWARD -i sit+ -p tcp --syn -j DROP


可能這些條件以經存在其它地方,但這是您想當然的想法.最好建一個包含很多條件的 scri
pt 然後執行.

16.3.2.11.阻止入站的 UDP 連結請求

極力推薦! 提起過我的防火牆資訊可以控制出站 UDP/TCP 會話的端口. 所以如果您的本地
IPv6系統使用本地端口 比如:從 32768 至 60999 您也可以像這樣過濾UDP連結 (直到連結
跟蹤正常工作) like:


阻止入站的 UDP 數據包 , 斬斷請求出站的回應數據包

# ip6tables -I INPUT -i sit+ -p udp ! --dport 32768:60999 -j DROP



在路由器上面阻止入站的 UDP 數據包轉寄到路由器後面的主機

ip6tables -I FORWARD -i sit+ -p udp ! --dport 32768:60999 -j DROP


實例:

下面這個實例是一個經典, 由 Happy netfilter6 ruleset 生成:
______________________________________________________________

# ip6tables -n -v -L
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 extIN all sit+ * ::/0 ::/0
4 384 intIN all eth0 * ::/0 ::/0
0 0 ACCEPT all * * ::1/128 ::1/128
0 0 ACCEPT all lo * ::/0 ::/0
0 0 LOG all * * ::/0 ::/0
? LOG flags 0 level 7 prefix `INPUT-default:'
0 0 DROP all * * ::/0 ::/0

Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
?
0 0 int2ext all eth0 sit+ ::/0 ::/0
0 0 ext2int all sit+ eth0 ::/0 ::/0
0 0 LOG all * * ::/0 ::/0
? LOG flags 0 level 7 prefix `FORWARD-default:'
0 0 DROP all * * ::/0 ::/0

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
?
0 0 extOUT all * sit+ ::/0 ::/0
4 384 intOUT all * eth0 ::/0 ::/0
0 0 ACCEPT all * * ::1/128 ::1/128
0 0 ACCEPT all * lo ::/0 ::/0
0 0 LOG all * * ::/0 ::/0
? LOG flags 0 level 7 prefix `OUTPUT-default:'
0 0 DROP all * * ::/0 ::/0

Chain ext2int (1 references)
pkts bytes target prot opt in out source destination
?
0 0 ACCEPT icmpv6 * * ::/0 ::/0
0 0 ACCEPT tcp * * ::/0 ::/0
? tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02
0 0 LOG all * * ::/0 ::/0
? LOG flags 0 level 7 prefix `ext2int-default:'
0 0 DROP tcp * * ::/0 ::/0
0 0 DROP udp * * ::/0 ::/0
0 0 DROP all * * ::/0 ::/0

Chain extIN (1 references)
pkts bytes target prot opt in out source destination
?
0 0 ACCEPT tcp * * 3ffe:400:100::1/128 ::/0
? tcp spts:512:65535 dpt:22
0 0 ACCEPT tcp * * 3ffe:400:100::2/128 ::/0
? tcp spts:512:65535 dpt:22
0 0 ACCEPT icmpv6 * * ::/0 ::/0
0 0 ACCEPT tcp * * ::/0 ::/0
? tcp spts:1:65535 dpts:1024:65535 flags:!0x16/0x02
0 0 ACCEPT udp * * ::/0 ::/0
? udp spts:1:65535 dpts:1024:65535
0 0 LOG all * * ::/0 ::/0
? limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `extIN-default:'
0 0 DROP all * * ::/0 ::/0

Chain extOUT (1 references)
pkts bytes target prot opt in out source destination
?
0 0 ACCEPT tcp * * ::/0
? 3ffe:ffff:100::1/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02
0 0 ACCEPT tcp * * ::/0
? 3ffe:ffff:100::2/128tcp spt:22 dpts:512:65535 flags:!0x16/0x02
0 0 ACCEPT icmpv6 * * ::/0 ::/0
0 0 ACCEPT tcp * * ::/0 ::/0
? tcp spts:1024:65535 dpts:1:65535
0 0 ACCEPT udp * * ::/0 ::/0
? udp spts:1024:65535 dpts:1:65535
0 0 LOG all * * ::/0 ::/0
? LOG flags 0 level 7 prefix `extOUT-default:'
0 0 DROP all * * ::/0 ::/0

Chain int2ext (1 references)
pkts bytes target prot opt in out source destination
?
0 0 ACCEPT icmpv6 * * ::/0 ::/0
0 0 ACCEPT tcp * * ::/0 ::/0
? tcp spts:1024:65535 dpts:1:65535
0 0 LOG all * * ::/0 ::/0
? LOG flags 0 level 7 prefix `int2ext:'
0 0 DROP all * * ::/0 ::/0
0 0 LOG all * * ::/0 ::/0
? LOG flags 0 level 7 prefix `int2ext-default:'
0 0 DROP tcp * * ::/0 ::/0
0 0 DROP udp * * ::/0 ::/0
0 0 DROP all * * ::/0 ::/0

Chain intIN (1 references)
pkts bytes target prot opt in out source destination
?
0 0 ACCEPT all * * ::/0
? fe80::/ffc0::
4 384 ACCEPT all * * ::/0 ff02::/16

Chain intOUT (1 references)
pkts bytes target prot opt in out source destination
?
0 0 ACCEPT all * * ::/0
? fe80::/ffc0::
4 384 ACCEPT all * * ::/0 ff02::/16
0 0 LOG all * * ::/0 ::/0
? LOG flags 0 level 7 prefix `intOUT-default:'
0 0 DROP all * * ::/0 ::/0
______________________________________________________________

16. 安全

16.1 Access limitations

有許多服務使用 tcp_wrapper library 控制訪問.Below is described the use
of tcp_wrapper

內容有待增加...

16.2 IPv6安全審核

目前沒有什麼較好的商業工具來進行

Legal issues

警告:您只能掃瞄自己的系統,不然,可能會觸及法律.開始之前,請檢察您要掃瞄
的IPv6目標地址兩次!.

16.3 Security auditing using IPv6-enabled netcat(使用適應IPv6的netcat)

關於IPv6-enabled netcat的詳細資訊請參照: [44]
IPv6?status-apps/security-auditing

例子:
______________________________________________________________

# nc6 ::1 daytime
13 JUL 2002 11:22:22 CEST
______________________________________________________________

16.4 Security auditing using IPv6-enabled nmap

全世界最為優秀的掃瞄程式之一.它的首頁: [45]
http://www.insecure.org/nmap/ 從 3.10ALPHA1 的版本開始支持IPv6. 例子:
______________________________________________________________

# nmap -6 -sT ::1
Starting nmap V. 3.10ALPHA3 ( www.insecure.org/nmap/ )
Interesting ports on localhost6 (::1):
(The 1600 ports scanned but not shown below are in state: closed)
Port State Service
22/tcp open ssh
53/tcp open domain
515/tcp open printer
2401/tcp open cvspserver
Nmap run completed -- 1 IP address (1 host up) scanned in 0.525 second
s
______________________________________________________________

16.5 Security auditing using IPv6-enabled strobe

Strobe 同 NMap相比更不具靈活性,但已經有 IPv6-enabling patch (see
IPv6?status-apps/security-auditing for more). Usage example:
______________________________________________________________

# ./strobe ::1 strobe 1.05 (c) 1995-1999 Julian Assange <proff@iq.org>
.
::1 2401 unassigned unknown
::1 22 ssh Secure Shell - RSA encrypted rsh
::1 515 printer spooler (lpd)
::1 6010 unassigned unknown
::1 53 domain Domain Name Server
______________________________________________________________

16.6 審核結果

如果審核結果同您的IPv6安全策略有出入, 請堵上檢測出的漏洞.

17. Encryption and Authentication(加密和認證)

Support in kernel

Currently missing in 2.4, perhaps in 2.5 (see below). There is an
issue about keeping the Linux kernel source free of
export/import-control-laws regarding encryption code. This is also one
case why [46]FreeS/WAN project (IPv4 only IPsec) isn't still contained
in vanilla source.

Support in USAGI kernel

The USAGI project has taken over in July 2001 the IPv6 enabled
FreeS/WAN code from the [47]IABG / IPv6 Project and included in their
kernel extensions, but still work in progress, means that not all IABG
features are already working in USAGI extension.

17.1 用法

參照: [48]FreeS/WAN / Online documentation

18. 線上測試工具

內容有待增加... 歡迎提建議!
* finger, nslookup, ping, traceroute, whois: [49]UK IPv6 Resource
Centre / The test page
* ping, traceroute, tracepath, 6bone registry, DNS: [50]JOIN /
Testtools (German language only, but should be no problem for non
German speakers)
* traceroute6, whois: [51]IPng.nl

19. 其它資訊

19.1 線上資訊

加入IPv6 backbone骨幹網路
IPv6 test backbone: [52]6bone, [53]How to join 6bone

主要的註冊區域

* America: [54]ARIN [55]Ripe
* Asia/Pacific: [56]APNIC
* Latin America and Caribbea: [57]LACNIC

Also a list of major (prefix length 35) allocations per local registry
is available here:
[58]Ripe NCC / IPv6 allocations

Tunnel brokers

* [59]Freenet6 Canada
* [60]Hurricane Electric US backbone
* [61]Centro Studi e Laboratory Telecomunicazioni Italy
* [62]Wanadoo Belgium
* [63]CERTNET-Nokia China
* [64]Tunnelbroker Leipzig Germany - DialupUsers with dynamic IP's
can get a fix IPv6 IP...
* [65]Internet Initiative Japan Japan - with IPv6 native line
service and IPv6 tunneling Service
* [66]XS26 - Access to SixNetherland - with POPs in Slovak Republic,
Czech Republic, Netherlands, Germany and Hungary.
* [67]IPng Netherland Netherland - Intouch, SurfNet, AMS-IX, UUNet,
Cistron, RIPE NCC and AT& T are connected at the AMS-IX. It is
possible (there are requirements...) to get an static tunnel.
* [68]UNINETT Norway - Pilot IPv6 Service (for Customers):
tunnelbroker & address allocation
* [69]NTT Europe [70]NTT Euroope United Kingdom - IPv6 Trial. IPv4
Tunnel and native IPv6 leased Line connections. POPs are located
in London, UK Dusseldorf, Germany New Jersey, USA (East Coast)
Cupertino, USA (West Coast) Tokyo, Japan
* [71]ESnet USA - Energy Sciences Network: Tunnel Registry & Address
Delegation for directly connected ESnet sites and ESnet
collaborators.
* [72]6REN USA - The 6ren initiative is being coordinated by the
Energy Sciences Network (ESnet), the network for the Energy
Research program of the US Dept. of Energy, located at the
University of California's Lawrence Berkeley National Laboratory

更多的IPv6資訊: [73]ipv6-net.org

6to4

* [74]NSayer's 6to4 information
* [75]RFC 3068 / An Anycast Prefix for 6to4 Relay Routers

Latest news

* [76]http://hs247.com/ name="hs247 / IPv6 news and information">
also homepage for #ipv6 channel on EFnet
* [77]bofh.st / latest IPv6 news but currently Jan 2002 outdated...,
also homepage for IPv6 channel on IRCnet
* [78]ipv6-net.org German forum

有關協議的參考

* [79]HS247 / IPv6 RFC list Publishing the list of IPv6-related RFCs
is beyond the scope of this document, but given URLs will lead you
to such lists:
* [80]IPng Standardization Status a little bit out-of-sync at the
moment
* [81]IPv6 Related Specifications on IPv6.org

目前與IPv6有關的草案:

* [82]IP Version 6 ipv6
* [83]Next Generation Transitition
* [84]Dynamic Host Configuration
* [85]Domain Name System Extension
* [86]Mobile IP mobileip

其它

* [87]Network Sorcery / IPv6, Internet Protocol version 6 IPv6
protocol header
* [88]SWITCH IPv6 Pilot / References big list of IPv6 references
maintained by Simon Leinen
* [89]Advanced Network Management Laboratory / IPv6 Address Oracle
shows you IPv6 addresses in detail

統計

* [90]IPv6 routing table history created by Gert Ding

19.2 更多的資訊

期待加入更多的內容,歡迎提建議!

Linux related

* [91]IPv6-HowTo for Linux by Peter Bieringer - Germany, and his
* [92]Bieringer / IPv6 - software archive
* [93]Linux+IPv6 status by Peter Bieringer Germany
* [94]USAGI project Japan, and their
* [95]USAGI project - software archive
* [96]Gav's Linux IPv6 Page
* [97]Project6 - IPv6 Networking For Linux Italy, and their
* [98]Project6 - software archive

19.3 通信論壇

+------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------+
|

|
| Focus Request e-mail address What to subscribe
Maillist e-mail address Language Access through
WWW |
+------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------+
| Linux kernel majordomo (at) oss.sgi.com netdev
netdev (at) oss.sgi.com English http://oss.sgi.com/proj
ects/netdev/archive/ |
| networking

|
| including

|
| IPv6

|
+------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------+
| Linux and majordomo (at) linux-ipv6
linux-ipv6 (at) list.f00f.org English
|
| list.f00f.org

|
| IPv6 in
(moderated)
|
| general (1)

|
+------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------+
| Mobile IP majordomo (at)
mipl (at) list.mipl. English http://www.mipl.mediapo
li.com/mailinglist.html |
| (v6) for list.mipl.mediapoli.com mipl
mediapoli.com http://www.mipl.mediapo
li.com/mail-archive/ |
| Linux

|
|

|
+------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------+
|Linux IPv6 usagi-users-ctl
usagi-users English http://www.mipl.mediapo
li.com/mailinglist.html |
|users using (at) linux-ipv6.org
(at) linux-ipv6.org http://www.mipl.mediapo
li.com/mail-archive/ |
|USAGI

|
|extension

|
+------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------+
|

|
|IPv6 on Debian
debian-ipv6 (at) English http://lists.debian.org
/debian-ipv6/ |
|Linux Web-based, see URL
lists.debian.org
|
|Web-based

|
|

|
+------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------+
|

|
|IPv6/6bone in majordomo (at)
ipv6 (at) German/English http://www.join.uni-mue
nster.de/JOIN/ipv6/texte-englisch/mailingliste.html |
| Germany atlan.uni-muenster.de ipv6
uni-muenster.de http://www.join.uni-mue
nster.de/local/majordomo/ipv6/ |
|

|
+------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------+
|

|
| 6bone majordomo (at) 6bone
6bone (at) English http://www.6bone.net/6b
one_email.html |
| isi.edu
isi.edu http://ryouko.dgim.crc.
ca/ipv6/ |
|
http://www.wcug.wwu.edu
/lists/6bone/ |
|

|
+------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------+
|

|
|IPv6 majordomo (at) ipng
ipng (at) English http://playground.sun.c
om/pub/ipng/html/instructions.html |
|discussions sunroof.eng.sun.com
sunroof.eng.sun.com ftp://playground.sun.co
m/pub/ipng/mail-archive/ |
|
http://www.wcug.wwu.edu
/lists/ipng/ |
+------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------+
|

|
| IPv6 users majordomo (at) users
users (at) ipv6.org English http://www.ipv6.org/mai
ling-lists.html |
| in general ipv6.org

|
|

|
+------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------+
|

|
| Bugtracking of bugtraq-subscribe (at)
bugtraq (at) English http://online.securityf
ocus.com/popups/forums/bugtraq/intro.shtml |
| Internet securityfocus.com
securityfocus.com (moderated) http://online.securityf
ocus.com/archive/1 |
| applications (2)

|
|

|
+------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------+
|

|
| IPv6 in general Web-based, see URL
ipv6 (at) ipng.nl English http://mailman.ipng.nl/m
ailman/listinfo/ipv6/ |
|
http://mailman.ipng.nl/p
ipermail/ipv6/ |
|

|
+------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------+


|

|

|

|
|

|
|

|
| majordomo (at) majordomo (at) ipv6
ipv6 (at) mfa.eti.br Portuguese http://www.mfa.eti.br/li
stas.html |
| mfa.eti.br mfa.eti.br

|
|

|
+------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------+





(1) recommended for common Linux & IPv6 issues.

(2) very recommended if you provide server applications.

是不是有什麼遺漏? 歡迎你的建議!

這裡還有另一份清單: http://www.join.uni-muenster.de/JOIN/ipv6/texte-eng
lisch/ipv6.infoquellen.html

有關的發行版

* [99]Polish(ed) Linux Distribution ("market leader" in containing
IPv6 enabled packages)
* [100]Red Hat Linux
* [101]Pekka Savola's IPv6 packages Germany
* [102]Debian Linux
* [103]Craig Small's IPv6 information and status
* [104]SuSE Linux
* [105]Linux Mandrake

20. 歷史

x.y版本 發佈在Internet上.
x.y.z 表示正在進行的版本and only published as LyX file on CVS.

Releases 0.x

0.31
2002-09-29/PB: Extend information in proc-filesystem entries

0.30
2002-09-27/PB: Add some maillists

0.29
2002-09-18/PB: Update statement about nmap (triggered by Fyodor)

0.28.1
2002-09-16/PB: Add note about ping6 to multicast addresses, add some labels

0.28
2002-08-17/PB: Fix broken LDP/CVS links, add info about Polish translation, add
URL of the IPv6 Address Oracle

0.27
2002-08-10/PB: Some minor updates

0.26.2
2002-07-15/PB: Add information neighbor discovery, split of firewalling (got so
me updates) and security into extra chapters

0.26.1
2002-07-13/PB: Update nmap/IPv6 information

0.26
2002-07-13/PB: Fill /proc-filesystem chapter, update DNS information about depr
icated A6/DNAME, change P-t-P tunnel setup to use of "ip" only

0.25.2
2002-07-11/PB: Minor spelling fixes

0.25.1
2002-06-23/PB: Minor spelling and other fixes

0.25
2002-05-16/PB: Cosmetic fix for 2^{ }128, thanks to Jos□ Ab□lio Oliveira Mat
os for help with LyX

0.24
2002-05-02/PB: Add entries in URL list, minor spelling fixes

0.23
2002-03-27/PB: Add entries in URL list and at maillists, add a label and minor
information about IPv6 on RHL

0.22
2002-03-04/PB: Add info about 6to4 support in kernel series 2.2.x and add an en
try in URL list and at maillists

0.21
2002-02-26/PB: Migrate next grammar checks submitted by John Ronan

0.20.4
2002-02-21/PB: Migrate more grammar checks submitted by John Ronan, add some ad
ditional hints at DNS section

0.20.3
2002-02-12/PB: Migrate a minor grammar check patch submitted by John Ronan

0.20.2
2002-02-05/PB: Add mipl to maillist table

0.20.1
2002-01-31/PB: Add a hint how to generate 6to4 addresses

0.20
2002-01-30/PB: Add a hint about default route problem, some minor updates

0.19.2
2002-01-29/PB: Add many new URLs

0.19.1
2002-01-27/PB: Add some forgotten URLs

0.19
2002-01-25/PB: Add two German books, fix quote entinities in exported SGML code

0.18.2
2002-01-23/PB: Add a FAQ on the program chapter

0.18.1
2002-01-23/PB: Move "the end" to the end, add USAGI to maillists

0.18
2002-01-22/PB: Fix bugs in explanation of multicast address types

0.17.2
2002-01-22/PB: Cosmetic fix double existing text in history (at 0.16), move all
credits to the end of the document

0.17.1
2002-01-20/PB: Add a reference, fix URL text in online-test-tools

0.17
2002-01-19/PB: Add some forgotten information and URLs about global IPv6 addres
ses

0.16
2002-01-19/PB: Minor fixes, remove "bold" and "emphasize" formats on code lines
, fix "too long unwrapped code lines" using selfmade utility, extend list of UR
Ls.

0.15
2002-01-15/PB: Fix bug in addresstype/anycast, move content related credits to
end of document

0.14
2002-01-14/PB: Minor review at all, new chapter "debugging", review "addresses"
, spell checking, grammar checking (from beginning to 3.4.1) by Martin Krafft,
add tcpdump examples, copy firewalling/netfilter6 from IPv6+Linux-HowTo, minor
enhancements

0.13
2002-01-05/PB: Add example BIND9/host, move revision history to end of document
, minor extensions

0.12
2002-01-03/PB: Merge review of David Ranch

0.11
2002-01-02/PB: Spell checking and merge review of Pekka Savola

0.10
2002-01-02/PB: First public release of chapter 1

References

1. http://www.bieringer.de/pb/
2. http://www.linuxports.com/howto/intro_to_networking/
3. http://rfc.net/rfc1884.html
4. http://rfc.net/rfc3056.html/
5. http://rfc.net/rfc2893.html
6. http://rfc.net/rfc2373.html
7. http://standards.ieee.org/regauth/oui/tutorials/EUI64.html
8. http://rfc.net/rfc3041.html
9. ftp://ftp.ietf.org/internet-drafts/
10. http://rfc.net/rfc1519.html
11. http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-distributions.html
12. http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-distributions.html
13. http://www.linuxdoc.org/HOWTO/Kernel-HOWTO.html
14. ftp://ftp.bieringer.de/pub/linux/IPv6/kernel
15. http://www.linux-ipv6.org/faq.html
16. http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-kernel.html#transport
17. http://rfc.net/rfc1055.html
18. ftp://ftp.inr.ac.ru/ip-routing/
19. http://rpmfind.net/linux/rpm2html/search.php?query=iproute
20. http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-distributions.html
21. file://localhost/tmp/zh-sgmltools.21666/IPv6&Linux-CurrentStatus-Applications
22. http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-3.html
23. http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/IPv6-HOWTO-4.html
24. http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-apps.html#HTTP
25. http://[3ffe:400:100::1]/
26. http://www.kame.net/
27. http://rfc.net/rfc2893.html
28. http://rfc.net/rfc3056.html
29. http://rfc.net/rfc3056.html
30. http://www.kfu.com/~nsayer/6to4/
31. http://www.faqs.org/rfcs/rfc3068.html
32. http://rfc.net/rfc2473.html
33. http://www.bieringer.de/linux/IPv6/
34. http://www.bieringer.de/linux/IPv6/IPv6-HOWTO/scripts/current/
35. http://www.feyrer.de/IPv6/SuSE73-IPv6+6to4-setup.html
36. http://people.debian.org/~csmall/ipv6/
37. http://www.netfilter.org/
38. http://lists.samba.org/pipermail/netfilter/
39. http://lists.samba.org/pipermail/netfilter-devel/
40. http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-kernel.html#