猪头猪尾 http://blog.donews.com/pigandpig 猪也疯狂了 Tue, 08 Apr 2008 07:13:00 +0000 http://wordpress.org/?v=2.9.2 en hourly 1 HTTP 会话复制失败 http://blog.donews.com/pigandpig/archive/2008/04/08/1274896.aspx http://blog.donews.com/pigandpig/archive/2008/04/08/1274896.aspx#comments Tue, 08 Apr 2008 07:13:00 +0000 猪头&猪尾 http://blog.donews.com/pigandpig/archive/2008/04/08/1274896.aspx 问题描述
Http 会话状态没有从 Primary 服务器复制到 Secondary 服务器。下面是一些故障症状:
  • 使用 http 会话的应用程序没有按设计运行,并且会话数据有所丢失
  • 即使在会话仍未超时的情况下,系统也可能提示您重新登录到应用程序中
  • 您在服务器的日志文件中看到与 Http 会话失败相关的错误和警告 问题描述
    Http 会话状态没有从 Primary 服务器复制到 Secondary 服务器。下面是一些故障症状:

    • 使用 http 会话的应用程序没有按设计运行,并且会话数据有所丢失
    • 即使在会话仍未超时的情况下,系统也可能提示您重新登录到应用程序中
    • 您在服务器的日志文件中看到与 Http 会话失败相关的错误和警告
    • 没有正确地将请求 Failover 到另一个服务器
    故障排除
    请注意,并非下面所有任务都需要完成。有些问题仅通过执行几项任务就可以解决。

    快速链接

    为什么发生此问题?
    会话复制失败通常是因为组播/网络问题引起的。有时候,配置问题也会导致失败(请查看“验证 Weblogic.xml 条目”一节)。此外,请确保输入到会话中的数据必须是可序列化的,否则复制可能会失败。使用下列检查清单检查配置或可能导致会话复制失败的其它潜在问题。

    返回页首

    Http 会话复制有什么类型?
    有五种不同的会话持久性实现方式:

    1. 内存(单个服务器,不复制)

    当您使用基于内存的存储方式时,所有会话信息都存储在内存中,并且当您停止和重新启动 WebLogic Server 时,这些信息将会丢失。

    1. 文件系统持久性

    会话信息存储在指定的 PersistentStoreDir 中的一个文件中。

    1. JDBC 持久性

    会话信息存储在数据库表中。

    1. 基于 cookie 的会话持久性

    会话信息存储在 cookie 中。

    1. 内存中复制(在群集内)

    会话数据从一个服务器实例复制到内存中的另一个实例。

    返回页首

    当会话复制失败时如何诊断此问题?
    考虑一个群集中有两个服务器(MyServer-1,MyServer-2)的情况。当您启用调试标志后,如果从某个客户端发送了一个请求,您将会立即看到下面的消息(请参阅启用调试标志跟踪会话复制失败

    在 MyServer-1 上:

    <Oct 9, 2003 12:38:21 PM PDT> <Debug> <Cluster> <000000> <Creating primary 5165892837402719733>

    <Oct 9, 2003 12:38:21 PM PDT> <Debug> <Cluster> <000000> <Created secondary for 5165892837402719733 on -7957889153726652135S: 210.23.23.1: [9001,9001, -1, -1,9001, -1, -1]: mydomain: MyServer-2>

    上面的记录消息意味着 Primary 服务器是 MyServer-1,并且在 Myserver-2 上创建了一个 Secondary 服务器,而且您将看到在 MyServer-2 中记录了类似下面的确认消息。

    在 MyServer-2 上:

    ExecuteThread: ‘1′ for queue: ‘Replication’> <kernel identity> <> <000000> <Creating secondary 5165892837402719733> 

    ####<Oct 9, 2003 12:38:21 PM PDT> <Debug> <Cluster> <machine1-c840> <MyServer-2> <ExecuteThread: ‘1′ for queue: ‘Replication’> <kernel identity> <> <000000> <Updated local secondary of 5165892837402719733>

    如果您检查 JsessionId,其形式如下:

      JSESSIONID=1E9Xwn7nLYfOsc1obgRZIwW5s72an7HPPvSD7iaWHMXzpHga5cQj!-1587343083!-1587348922

    JSESSIONID 是缺省的 cookie 名称,可以在 weblogic.xml 中将其更改为任何内容。

    JSESSIONID 的格式为:

      SessionId!PrimaryServer JVM Hash!SecondaryServer JVMHash

    Every time data is changed (either set/get or removed) in the session you’ll see the logging message.

    在 MyServer-1 上:

    <Oct 9, 2003 12:38:21 PM PDT> <Debug> <Cluster> <000000> <Updated remote secondary for 5165892837402719733>

    在 MyServer-2 上:

    ####<Oct 9, 2003 12:38:21 PM PDT> <Debug> <Cluster> <machine1-c840> <MyServer-2> <ExecuteThread: ‘1′ for queue: ‘Replication’> <kernel identity> <> <000000> <Updated local secondary of 5165892837402719733>

    如果因为任何原因而导致会话复制失败,您将在 MyServer-1 日志中看到下面的消息。

    <Nov 6, 2003 12:59:12 PM EST> <Debug> <Cluster> <000000> <Unable to create secondary for -5165892837402719733> 

    <Nov 6, 2003 12:59:12 PM EST> <Debug> <Cluster> <000000> <Error creating secondary 5165892837402719733 on -7957889153726652135S: 210.23.23.1:[9001,9001,-1,-1,9001,-1,-1]:mydomain:MyServer-2>

    上面的消息意味着会话复制已失败。

    JSESSIONID 也会显示为如下形式:

      JSESSIONID=1E9Xwn7nLYfOsc1obgRZIwW5s72an7HPPvSD7iaWHMXzpHga5cQj!-1587343083!NONE

    Secondary 服务器散列信息将变为 NONE。

    返回页首

    启用调试标志跟踪会话复制失败:
    您可以启用 DebugCluster、DebugClusterAnnouncements、DebugFailOver、DebugReplication、DebugReplicationDetails 标志。  

    若要启用:

    1. 可以使用 weblogic.Admin 命令行实用程序来动态地启用或关闭调试选项。
      例如,若要在 ServerDebug Mbean 的所有管理实例(即管理服务器或托管服务器)上启用 DebugCluster

      java weblogic.Admin -url t3://localhost:6151 -username system -password weblogic SET -type ServerDebug -property DebugCluster true

    1. 另外,对于要调试的每个服务器,可以编辑 <ServerDebug/> 节中的 config.xmlMbean 要素,将值设置为“true”表示启用,或设置为“false”表示禁用。然后必须重新启动管理服务器。托管服务器将重新连接到管理服务器,然后调试标志将动态生效。示例:

      <ServerDebug DebugCluster="true" Name="myserver"/>

    1. 在设置了所有标志后,在 config.xml 的末尾处,ServerDebug 标记将类似于如下形式:

      <ServerDebug ClassFinder="true" DebugCluster="true" DebugClusterAnnouncements="true" DebugFailOver="true" DebugReplication="true" DebugReplicationDetails="true" Name="MyServer1"/>

      确保服务器的 stdOutSeverity 级别为 INFO,且 StdoutDebugEnabled 被设置为“true”。调试信息将被记录到服务器日志以及标准输出中。

    返回页首

    所使用的每个会话持久性类型的检查清单:

    内存(单个服务器,不复制)  

    1. 当您使用基于内存的存储方式时,所有会话信息都存储在内存中,并且当您停止和重新启动 WebLogic Server 时,这些信息将会丢失。
    2. 确保您在运行 WebLogic Server 时已分配足够的堆大小;否则,您的服务器可能在大量负载情况下用尽内存。
    3. 不是群集配置的推荐类型(因为数据保存在堆中,且不可用于任何其它服务器)。

    文件系统持久性

    1. 确认已在 weblogic.xml 中正确指定了 WebLogic Server 存储会话的目录。您还必须自行创建此目录,并确保已分配访问此目录的适当权限。
    2. 确保拥有足够的磁盘空间。

    JDBC 持久性

    1. 确保连接到数据库的连接池拥有对所用数据库表的读/写权限。

    基于 Cookie 的持久性

    1. 确保在 http 会话中没有存储 java.lang.String 以外的任何内容。
    2. 不要刷新您的应用程序代码中的 Http 响应对象。
    3. 确保响应的信息长度超过所设置的缓冲区大小(缺省值为 8192 字节)。
    4. 确保在浏览器中启用了 cookie。
    5. 确保在使用基于 cookie 的会话持久性时,没有在字符串中使用逗号 (,)。

    内存中复制

    1. 确保仅通过代理服务器或硬件负载平衡器来访问 Weblogic Server。
    2. 硬件负载平衡器应支持兼容的被动或主动 cookie 持久性机制以及 SSL 持久性。
    3. 群集中的推荐类型。

    返回页首

    验证 Weblogic.xml 条目:
    确保 weblogic.xml 含有需要为每个“会话复制”类型设置的所有参数。 例如,当使用内存中复制时,样本 weblogic.xml 将类似于如下形式:

            <session-descriptor>
              <session-param>
                 <param-name>
                       PersistentStoreType
                 </param-name>
                 <param-value>
                       replicated
                 </param-value>
              </session-param>
            </session-descriptor>

    返回页首

    会话数据必须可序列化
    为了支持 HTTP 会话状态的内存中复制,所有 servlet 和 JSP 会话数据都必须是可序列化的,否则会话复制将会失败。当启用了调试标志时,Weblogic Server 将在下面输出警告消息,指示会话仍未被复制。您必须使该对象变为可序列化的对象,这样才能复制它。其它对象的会话复制将会正常进行。

    调试消息:

     <Oct 8, 2003 2:10:45 PM PDT> <Error> <Cluster> <000126> <All session objects should be serializable to replicate. Please check the objects in your session. Failed to replicate non-serializable object>

    解决办法:找到从中抛出错误的页面,并确保输入会话中的所有数据是可序列化的。

    返回页首

    检查网络/组播问题:
    确保网络是完好的,且没有组播问题。您可以执行组播测试来确保组播 IP 工作正常。

    1. 运行 utils.MulticastTest 实用程序
      语法形式类似于:

      java utils.MulticastTest -n name -a address [-p portnumber] [-t timeout] [-s send]

    1. 您也可以参阅 http://e-docs.bea.com/wls/docs81/admin_ref/utils.html#1199798

    返回页首

    验证群集配置:
    从群集列表中选择 Primary 服务器和 Secondary 服务器。在一个由两个服务器组成的群集中,如果该群集没有包含所有服务器,则不能选择 Secondary 服务器,从而导致会话数据不能被复制。

    若要验证,可执行下列命令:

    1. 确保 weblogic.jar 在类路径中。
    1. 若要获得群集中的所有服务器:

      java weblogic.Admin -username weblogic -password weblogic -url http://oneofthemanagedserverurlinthecluster:6151/ GET -type ClusterRuntime .pretty

    这样将列出群集中的所有服务器。可以将 URL 改变为群集中的每个服务器,以确保他们拥有相同的条目。

    返回页首

    应用程序代码诊断:
    确保仅在应用程序代码中使用 HttpSession 中的 setAttribute/removeAttribute 方法来更新 Http 会话。如果您使用其它设置方法来更改会话内的对象,WebLogic Server 将不复制这些更改。

    请不要使用 http 会话的 putValueremoveValue 方法,因为它们不受支持,并且当您在应用程序中使用这些方法时,可能会出现会话数据复制问题。相反,请仅使用 HttpSession 的setAttribute/removeAttribute 方法。

    返回页首

    Cookie 与 URL Rewriting :
    在某些情况下,浏览器或无线设备可能不接受 cookie,这样会使利用 cookie 的会话跟踪不能进行。当 WebLogic Server 检测到浏览器不接受 cookie 时,URL Rewriting 是对这种情况的一个可自动替换的解决方法。

    通过设置 WebLogic-specific 部署描述符 weblogic.xml 中、<session-param> 元素下的 URLRewritingEnabled 属性,在 WebLogic Server 中启用 URL Rewriting。此属性的缺省值为 true。

    返回页首

    性能问题:

    考虑序列化系统开销
    序列化会话数据会给复制会话状态带来一些系统开销。系统开销随序列化对象大小的增大而增加。如果您想在会话中创建很大的对象,请测试您的 servlet 的性能,以确保性能是可接受的。

    控制对会话数据的帧访问
    如果您正在设计使用多帧的 Web 应用程序,请记住给定帧集中的帧无法执行任何请求同步。

    例如,尽管在逻辑上客户端应当仅创建单个会话,但帧集中的多个帧可以代表客户端应用程序创建多个会话。

    为了避免意外的应用程序行为,您应认真规划如何利用帧访问会话数据。可以应用下列其中一个一般规则来避免常见问题:

    • 在一个给定帧集中,确保只有一个帧创建和修改会话数据。
    • 始终在应用程序使用的第一个帧集内的某个帧中创建会话(例如,在所访问的第一个 HTML 页面中创建会话)。
    • 在创建会话后,仅在除第一个帧集外的其它帧集中访问会话数据。

    在会话中存储更大量的数据
    JDBC 持久性和文件持久性的速度将不会更快,因为会话数据必须存储在外部资源中并从中检索,并且也会因为 JDBC 访问每个会话的更新信息而存在性能开销。如果您想在会话中存储大型对象,则应考虑 JDBC 或文件持久性。

    在会话中存储小量的数据
    当您不需要在会话中存储大量数据时,基于 cookie 的会话持久性是最有用的。基于 cookie 的会话持久性可以使 WebLogic Server 安装的管理更加容易,因为不需要群集 Failover 逻辑。

    ]]>
    http://blog.donews.com/pigandpig/archive/2008/04/08/1274896.aspx/feed 0 转一篇老千的文章 http://blog.donews.com/pigandpig/archive/2008/03/06/1259254.aspx http://blog.donews.com/pigandpig/archive/2008/03/06/1259254.aspx#comments Thu, 06 Mar 2008 05:55:00 +0000 猪头&猪尾 http://blog.donews.com/pigandpig/archive/2008/03/06/1259254.aspx http://hkmsn.kblcw.com/bbs/link/48726.html]]> http://hkmsn.kblcw.com/bbs/link/48726.html

    ]]>
    http://blog.donews.com/pigandpig/archive/2008/03/06/1259254.aspx/feed 1
    中国传统节日的英文表达 http://blog.donews.com/pigandpig/archive/2007/12/01/1233178.aspx http://blog.donews.com/pigandpig/archive/2007/12/01/1233178.aspx#comments Sat, 01 Dec 2007 03:16:00 +0000 猪头&猪尾 http://blog.donews.com/pigandpig/archive/2007/12/01/1233178.aspx 元旦(1月1日)   New Year's Day

    春节(农历一月一日) The Spring Festival

    元宵节(农历一月十五日) The Lantern Festival

    国际劳动妇女节(3月8日) International  Working Women's Day

    植树节(3月12日) Arbor Day

    清明节(4月5日) ChingMing Festival 或 Tomb-sweeping Festival

    国际劳动节(5月1日) International Labour Day

    中国青年节(5月4日) Chinese Youth Day

    护士节(5月12日) Nurses' Day

    端午节(农历五月初五) The Dragon Boat Festival

    国际儿童节(6月1日) International Chind]]> 元旦(1月1日)   New Year’s Day

    春节(农历一月一日) The Spring Festival

    元宵节(农历一月十五日) The Lantern Festival

    国际劳动妇女节(3月8日) International  Working Women’s Day

    植树节(3月12日) Arbor Day

    清明节(4月5日) ChingMing Festival 或 Tomb-sweeping Festival

    国际劳动节(5月1日) International Labour Day

    中国青年节(5月4日) Chinese Youth Day

    护士节(5月12日) Nurses’ Day

    端午节(农历五月初五) The Dragon Boat Festival

    国际儿童节(6月1日) International Chindren’s Day

    中国共产党成立纪念日(7月1日) The Party’s Birthday

    建军节(8月1日) The Army’s Day

    中秋节(农历八月十五) Mid-autumn(Moon) Festival

    教师节(9月10日) Teachers’ Day

    重阳节(农历九月九日) Double-Ninth Day

    国庆节(10月1日) National Day

    除夕(农历十二月三十日) New Year’s Eve

    ]]> http://blog.donews.com/pigandpig/archive/2007/12/01/1233178.aspx/feed 0
    crontab使用祥解 http://blog.donews.com/pigandpig/archive/2007/09/15/1210539.aspx http://blog.donews.com/pigandpig/archive/2007/09/15/1210539.aspx#comments Sat, 15 Sep 2007 07:37:00 +0000 猪头&猪尾 http://blog.donews.com/pigandpig/archive/2007/09/15/1210539.aspx 名称 : crontab
    使用权限 : 所有使用者
    使用方式 :
    crontab [ -u user ] file
    crontab [ -u user ] { -l | -r | -e }
    说明 :
    crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

    参数 :
    crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
    crontab -r : 删除目前的时程表
    crontab -l : 列出目前的时程表
    crontab file [-u user]-用指定的文]]>
    名称 : crontab
    使用权限 : 所有使用者
    使用方式 :
    crontab [ -u user ] file
    crontab [ -u user ] { -l | -r | -e }
    说明 :
    crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

    参数 :
    crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
    crontab -r : 删除目前的时程表
    crontab -l : 列出目前的时程表
    crontab file [-u user]-用指定的文件替代目前的crontab。
    时程表的格式如下 :
    f1 f2 f3 f4 f5 program
    其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
    当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
    当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
    当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
    当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其馀类推
    使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。

    例子 :
    #每天早上7点执行一次 /bin/ls :
    0 7 * * * /bin/ls
    在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :
    0 6-12/3 * 12 * /usr/bin/backup
    周一到周五每天下午 5:00 寄一封信给 alex@domain.name :
    0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
    每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分….执行 echo "haha"
    20 0-23/2 * * * echo "haha"
    注意 :
    当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 > /dev/null 2>&1 即可

    例子2 :
    #每天早上6点10分
    10 6 * * * date
    #每两个小时
    0 */2 * * * date
    #晚上11点到早上8点之间每两个小时,早上8点
    0 23-7/2,8 * * * date
    #每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
    0 11 4 * mon-wed date
    #1月份日早上4点
    0 4 1 jan * date
    范例
    $crontab -l 列出用户目前的crontab.

     crontab命令的功能是在一定的时间间隔调度一些命令的执行。在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab。

    crontab命令有三种形式的命令行结构:

    crontab [-u user] [file]

    crontab [-u user] [-e|-l|-r]

    crontab -l -u [-e|-l|-r] 第一个命令行中,file是命令文件的名字。如果在命令行中指定了这个文件,那么执行crontab命令,则将这个文件拷贝到crontabs目录下;如果在命令行中没有制定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将他们也存放在crontab目录下。

    命令行中-r选项的作用是从/usr/spool/cron/crontabs目录下删除用户定义的文件crontab;

    命令行中-l选项的作用是显示用户crontab文件的内容。

    使用命令crontab -u user -e命令编辑用户user的cron(c)作业。用户通过编辑文件来增加或修改任何作业请求。

    执行命令crontab -u user -r即可删除当前用户的所有的cron作业。

    作业与它们预定的时间储存在文件/usr/spool/cron/crontabs/username里。username使用户名,在相应的文件中存放着该用户所要运行的命令。命令执行的结果,无论是标准输出还是错误输出,都将以邮件形式发给用户。文件里的每一个请求必须包含以spaces和tabs分割的六个域。前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,称为命令字段,其中包括了crontab调度执行的命令。

    第一道第五个字段的整数取值范围及意义是:

    0~59 表示分

    1~23 表示小时

    1~31 表示日

    1~12 表示月份

    0~6 表示星期(其中0表示星期日)

    /usr/lib/cron/cron.allow表示谁能使用crontab命令。如果它是一个空文件表明没有一个用户能安排作业。如果这个文件不存在,而有另外一个文件/usr/lib/cron/cron.deny,则只有不包括在这个文件中的用户才可以使用crontab命令。如果它是一个空文件表明任何用户都可安排作业。两个文件同时存在时cron.allow优先,如果都不存在,只有超级用户可以安排作业。

    ]]>
    http://blog.donews.com/pigandpig/archive/2007/09/15/1210539.aspx/feed 0
    用iptables设置有状态防火墙 http://blog.donews.com/pigandpig/archive/2007/09/15/1210534.aspx http://blog.donews.com/pigandpig/archive/2007/09/15/1210534.aspx#comments Sat, 15 Sep 2007 07:07:00 +0000 猪头&猪尾 http://blog.donews.com/pigandpig/archive/2007/09/15/1210534.aspx 如果你是新手,请先看我写的《用iptables设置静太防火墙》 ,本文在此基础上写的,很多细节上的问题用它作参考。


    ########################

    版权所有,转载请注明来自www.linuxsir.org 并写明作者

    ########################

    在这里我必须要解]]>
    如果你是新手,请先看我写的《用iptables设置静太防火墙》 ,本文在此基础上写的,很多细节上的问题用它作参考。

    ########################

    版权所有,转载请注明来自www.linuxsir.org 并写明作者

    ########################

    在这里我必须要解释一下防火墙的状态(state)

    比如,你用ssh远程访问,你的主机和远程主机会进行通信。
    静态的防火墙会这样处理:
    检查时入机器的数据包,发现数据是来源是22端口,当允许时入,连接之后相互通信的数据也一样,检查每个数据,发现数据来源于22端口,允许通过!

    如果用有状态的防火墙如何处理呢?
    当你连接远程主机成功之后,你的主机会把这个连接记录下来,当有数据从远程ssh服务器再进入你的机器时
    检查自己连接状态表,发现这个数据来源于一个已经建立的连接,允许这个数据包进入。

    以上两种处理,我们明显的发现static firewall比较生硬,而有状态的防火墙则显得要智能一些!

    现在我们来解释一下状态
    NEW:如果你的主机向远程机器发时一个连接请求,这个数据包状态是NEW.
    ESTABLISHED:当联接建立之后,远程主机和你主机通信数据状态为ESTABLISHED
    RELATED: 像ftp这样的服务,用21端口传送命令,而用20端口(port模式)或其他端口(PASV模式)传送数据。在已有21端口上建立好连接后发送命令,用20传送的数据,状态是RELATED

    有了以上知识后,接下来时行我们的step by step 吧
    首先,我们还是来设置默认规则
    iptables -P INPUT DROP
    这样你的机器将对所有进入你主机的数据都丢弃

    如果你有一台主机只是用于个人桌面应用,那么你的主机不提供任何服务,那么,我们就禁止其他的机器向你的机器发送任何连接请求
    iptables -A INPUT -m state –state NEW -j DROP

    这个规则将所有发送到你的机器数据包,状态是NEW的包丢弃。这样,也就是不允许其他的机器主动发起对你机器的连接,但是你却可以主动的连接其他的机器,不过仅仅只是连接而已,连接之后的数据就是ESTABLISHED状态的了,我们再加上一条。

    iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
    所有已经建立联接,或者与之相关的数据允许通过

    好了,们们来总结一下三条语句,因为它是一个很好的个人桌面主机的防火墙。
    iptables -P INPUT DROP
    #iptables -A INPUT -m state –state NEW -j DROP
    iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
    我们看到,第二条被注释掉了,因为那一规则完全可以省去,让默认规则处理就行了。
    是不是显得很简单呢,对于个人桌面应用来说,只用刚才那两条语句,就能让你接入internet网的主机足够安全。而且你随意访问internet,但是外部却不能主动发起对你机器的连接,真是爽啊!
    当然,如是你的IE有漏洞的话,iptables还是无济于事的,这也不是iptables的工作范围。
    我们可看到有状态的防火墙比静态防火墙要"智能"一些,当然规则容易设置一些。

    如果你的主机是服务器,接下来的问题就简单了。这里假如我们开了www 和ftp服务。注意ftp的pasv模式,会使用动态的端口来传送数据,而并非20端口。这些对有状态的防火墙来说,轻易做到,甚至不用知道pasv模式的ftp用哪些端口,因为你的主机会认识到ftp给别人主机传送文件时,认识到这些数据是RELATED

    在后面加下
    iptables -A INPUT -i ppp0 -p tcp -dport 21 -j ACCEPT
    iptables -A INPUT -i ppp0 -p udp -dport 21 -j ACCEPT
    iptables -A INPUT -i ppp0 -p tcp -dport 80 -j ACCEPT
    iptables -A INPUT -i ppp0 -p udp -dport 80 -j ACCEPT
    好了,至此我们的工作就全部完成了,仿照我上一文的方法,最后给出一个脚本,有详细的注释

     
    !/bin/bash
    #define const here
    Accept_Ports="80 20 21" #允许internet访问的自己服务端口

    # init
    iptables -F
    iptables -X
    iptables -t nat -F
    iptables -t nat -X

    # set default ruler here
    iptables -P INPUT DROP

    # Allow inner Network access
    iptables -A INPUT -i !ppp0 -j ACCEPT

    # set stated ruler here,this is the most important ruler
    iptables -A INPUT -i ppp0 -m state –state ESTABLISHED,RELATED -j ACCEPT

    # set ruler so that other can access service on your server
    for Port in "$Accept_Ports" ; do
    iptables -A INPUT -i ppp0 -p udp –dport ${Port} -j ACCEPT
    iptables -A INPUT -i ppp0 -p tpc –dport ${Port} -j ACCEPT
    done

    # the ruler can make you firewall betterd
    iptables -A INPUT -i ppp0 -p tcp -j REJECT –reject-with tcp-reset
    iptables -A INPUT -i ppp0 -p udp -j REJECT –reject-with icmp-port-unreachable

    注:
    有状态防火墙需要内核的支持,幸好,多数的发行版都支持这一特征

    ]]>
    http://blog.donews.com/pigandpig/archive/2007/09/15/1210534.aspx/feed 0
    rsync配置与应用 http://blog.donews.com/pigandpig/archive/2007/09/14/1210084.aspx http://blog.donews.com/pigandpig/archive/2007/09/14/1210084.aspx#comments Fri, 14 Sep 2007 09:25:00 +0000 猪头&猪尾 http://blog.donews.com/pigandpig/archive/2007/09/14/1210084.aspx rsync配置与应用