Ubuntu 源安装Oracle JAVA

1、增加源

sudo add-apt-repository “deb http://archive.canonical.com/ lucid partner”

2、更新源

sudo apt-get update
3、下载安装

sudo apt-get install sun-java6-bin sun-java6-jre

4、配置环境

4.1写入系统变量:
$sudo gedit /etc/environment

在文本编辑器里写入下面两行内容:
CLASSPATH=.:/usr/lib/jvm/java-6-sun/lib
JAVA_HOME=/usr/lib/jvm/java-6-sun

4.2将系统虚拟机的优先顺序也调整一下:
$sudo gedit /etc/jvm
在文本编辑器里将下面一句写在最顶部:
/usr/lib/jvm/java-6-sun

GraniteDS、Spring、Toplink集成的配置

配置的目的是集成granite data service ,Spring,Toplink,JPA,flex,依托adobe AMF协议进行RIA开发,测试集成的难度与开发的速度。

先贴上granite data service的配置文件,关于spring的配置请参考

springtoplink集成显式事务配置

/WEB-INF/Granite/granite-config.xml

 

XML/HTML代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE granite-config PUBLIC "-//Granite Data Services//DTD granite-config internal//EN"  
  3.     "http://www.graniteds.org/public/dtd/1.2.0/granite-config.dtd">  
  4. <granite-config>  
  5.     <classgetter type="org.granite.toplink.TopLinkClassGetter"/>  
  6.     <externalizers>  
  7.         <externalizer type="org.granite.toplink.TopLinkExternalizer">  
  8.                
  9.             <include annotatedwith="javax.persistence.Entity" />  
  10.             <include annotatedwith="javax.persistence.MappedSuperclass" />  
  11.             <include annotatedwith="javax.persistence.Embeddable" />  
  12.             <!– 
  13.             <include type="org.test.model.Post"/> 
  14.             –>  
  15.         </externalizer>  
  16.     </externalizers>  
  17. </granite-config>  

/WEB-INF/flex/services-config.xml

 

XML/HTML代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <services-config>  
  4.   
  5.     <services>  
  6.         <service  
  7.             id="granite-service"  
  8.             class="flex.messaging.services.RemotingService"  
  9.             messageTypes="flex.messaging.messages.RemotingMessage">  
  10.             <destination id="postService">  
  11.                 <channels>  
  12.                     <channel ref="my-graniteamf"/>  
  13.                 </channels>  
  14.                 <properties>  
  15.                     <factory>springFactory</factory>  
  16.                     <source>postService</source>  
  17.                 </properties>  
  18.             </destination>  
  19.         </service>  
  20.     </services>  
  21.     <factories>  
  22.         <factory id="springFactory" class="org.granite.messaging.service.SpringServiceFactory"/>  
  23.     </factories>  
  24.     <channels>  
  25.         <channel-definition id="my-graniteamf" class="mx.messaging.channels.AMFChannel">  
  26.             <endpoint  
  27.                 uri="http://{server.name}:{server.port}/{context.root}/graniteamf/amf"  
  28.                 class="flex.messaging.endpoints.AMFEndpoint"/>  
  29.         </channel-definition>  
  30.     </channels>  
  31.   
  32. </services-config>  

/META-INF/granite-config.properties

#for toplink

classGetter=org.granite.toplink.TopLinkClassGetter

/WEB-INF/web.xml

 

XML/HTML代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  5.     <description>  
  6.         my first Granite Data Service and Spring framework  
  7.     </description>  
  8.     <display-name>GraniteDS Spring</display-name>  
  9.     <context-param>  
  10.         <description>Path to spring config</description>  
  11.         <param-name>contextConfigLocation</param-name>  
  12.         <param-value>  
  13.             /WEB-INF/classes/applicationContext.xml  
  14.         </param-value>  
  15.     </context-param>  
  16.     <context-param>  
  17.         <param-name>graniteConfigPath</param-name>  
  18.         <param-value>/WEB-INF/granite/granite-config.xml</param-value>  
  19.     </context-param>  
  20.     <context-param>  
  21.         <param-name>servicesConfigPath</param-name>  
  22.         <param-value>/WEB-INF/flex/services-config.xml</param-value>  
  23.     </context-param>  
  24.     <filter>  
  25.         <filter-name>AMFMessageFilter</filter-name>  
  26.         <filter-class>  
  27.             org.granite.messaging.webapp.AMFMessageFilter  
  28.         </filter-class>  
  29.     </filter>  
  30.     <filter-mapping>  
  31.         <filter-name>AMFMessageFilter</filter-name>  
  32.         <url-pattern>/graniteamf/*</url-pattern>  
  33.     </filter-mapping>  
  34.     <listener>  
  35.         <listener-class>  
  36.             org.springframework.web.context.ContextLoaderListener  
  37.         </listener-class>  
  38.     </listener>  
  39.     <listener>  
  40.         <listener-class>  
  41.             org.springframework.web.context.request.RequestContextListener  
  42.         </listener-class>  
  43.     </listener>  
  44.     <listener>  
  45.         <listener-class>  
  46.             org.granite.config.GraniteConfigListener  
  47.         </listener-class>  
  48.     </listener>  
  49.     <servlet>  
  50.         <servlet-name>AMFMessageServlet</servlet-name>  
  51.         <servlet-class>  
  52.             org.granite.messaging.webapp.AMFMessageServlet  
  53.         </servlet-class>  
  54.         <load-on-startup>1</load-on-startup>  
  55.     </servlet>  
  56.     <servlet-mapping>  
  57.         <servlet-name>AMFMessageServlet</servlet-name>  
  58.         <url-pattern>/graniteamf/*</url-pattern>  
  59.     </servlet-mapping>  
  60.     <welcome-file-list>  
  61.         <welcome-file>index.jsp</welcome-file>  
  62.     </welcome-file-list>  
  63.     <login-config>  
  64.         <auth-method>BASIC</auth-method>  
  65.     </login-config>  
  66. </web-app>  

 案例代码下载:点击下载此文件

spring和toplink集成显式事务配置

最近在学习granite data service 与Spring、toplink、JPA,flex集成,关于Spring事务的配置折腾了我一天,刚找到对我有用的配置例子,详细见spring事务配置方法(TransactionProxyFactoryBean)。现将配置文件放上来便于以后整理。

applicationContext.xml

 

XML/HTML代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"  
  5.     xmlns:tx="http://www.springframework.org/schema/tx">  
  6.   
  7.     <bean  
  8.         class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />  
  9.   
  10.     <bean id="entityManagerFactory"  
  11.         class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">  
  12.         <property name="persistenceUnitName" value="GDSSpringDemoPU" />  
  13.         <property name="jpaVendorAdapter">  
  14.             <bean  
  15.                 class="org.springframework.orm.jpa.vendor.TopLinkJpaVendorAdapter">  
  16.                 <property name="showSql" value="true" />  
  17.                 <property name="generateDdl" value="true" />  
  18.             </bean>  
  19.         </property>  
  20.     </bean>  
  21.   
  22.     <bean id="transactionManager"  
  23.         class="org.springframework.orm.jpa.JpaTransactionManager">  
  24.         <property name="entityManagerFactory"  
  25.             ref="entityManagerFactory" />  
  26.         <!– 
  27.             <property name="dataSource" ref="dataSource" /> 
  28.         –>  
  29.     </bean>  
  30.     <bean id="postService"  
  31.         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
  32.         <property name="transactionManager" ref="transactionManager" />  
  33.         <property name="target">  
  34.             <bean class="org.test.PostService">  
  35.                 <property name="pdao" ref="PostDAO" />  
  36.             </bean>  
  37.         </property>  
  38.         <property name="transactionAttributes">  
  39.             <props>  
  40.                 <prop key="save*">PROPAGATION_REQUIRED</prop>  
  41.                 <prop key="create*">PROPAGATION_REQUIRED</prop>  
  42.                 <prop key="delete*">PROPAGATION_REQUIRED</prop>  
  43.                 <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>  
  44.             </props>  
  45.         </property>  
  46.     </bean>  
  47.   
  48.     <tx:annotation-driven transaction-manager="transactionManager" />  
  49.     <bean id="PostDAO" class="org.test.model.PostDAO">  
  50.         <property name="entityManagerFactory"  
  51.             ref="entityManagerFactory" />  
  52.     </bean>  
  53.      
  54.     <!–  
  55.         <bean id="postService" class="org.test.PostService">  
  56.         <property name="pdao" ref="PostDAO" />  
  57.         </bean>  
  58.     –>  
  59. </beans>  

persistence.xml

 

XML/HTML代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persistence xmlns="http://java.sun.com/xml/ns/persistence"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence  
  5.     http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">  
  6.       
  7.     <persistence-unit name="GDSSpringDemoPU"  
  8.         transaction-type="RESOURCE_LOCAL">  
  9.         <provider>  
  10.             oracle.toplink.essentials.PersistenceProvider  
  11.         </provider>  
  12.         <class>org.test.model.Post</class>  
  13.         <properties>  
  14.             <property name="toplink.jdbc.driver"  
  15.                 value="org.apache.derby.jdbc.ClientDriver" />  
  16.             <property name="toplink.jdbc.url"  
  17.                 value="jdbc:derby://localhost:1527/myeclipse" />  
  18.             <property name="toplink.jdbc.user" value="classiccars" />  
  19.             <property name="toplink.jdbc.password" value="myeclipse" />  
  20.         </properties>  
  21.     </persistence-unit>  
  22.   
  23. </persistence>  

 

spring事务配置方法(TransactionProxyFactoryBean)

采用这种方式的配置时候,配置文件的增加非常快,每个bean有需要两个bean配置,一个目标,另外还需要使用TransactionProxyFactoryBean配置一个代理bean。
这是一种最原始的配置方式,下面是使用TransactionProxyFactoryBean的配置文件:

Xml代码
  1. <?xml version="1.0" encoding="gb2312"?>
  2. <!– Spring配置文件的文件头,包含DTD等信息–>
  3. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
  4. "http://www.springframework.org/dtd/spring-beans.dtd">
  5. <beans>
  6. <!–定义数据源–>
  7. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  8. <!– 定义数据库驱动–>
  9. <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
  10. <!– 定义数据库url–>
  11. <property name="url"><value>jdbc:mysql://localhost:3306/spring</value></property>
  12. <!– 定义数据库用户名–>
  13. <property name="username"><value>root</value></property>
  14. <!– 定义数据库密码–>
  15. <property name="password"><value>32147</value></property>
  16. </bean>
  17. <!–定义一个hibernate的SessionFactory–>
  18. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  19. <!– 定义SessionFactory必须注入DataSource–>
  20. <property name="dataSource"><ref local="dataSource"/></property>
  21. <property name="mappingResources">
  22. <list>
  23. <!–以下用来列出所有的PO映射文件–>
  24. <value>Person.hbm.xml</value>
  25. </list>
  26. </property>
  27. <property name="hibernateProperties">
  28. <props>
  29. <!–此处用来定义hibernate的SessionFactory的属性:
  30. 不同数据库连接,启动时选择create,update,create-drop–>
  31. <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
  32. <prop key="hibernate.hbm2ddl.auto">update</prop>
  33. </props>
  34. </property>
  35. </bean>
  36. <!– 定义事务管理器,使用适用于Hibernte的事务管理器–>
  37. <bean id="transactionManager"
  38. class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  39. <!– HibernateTransactionManager bean需要依赖注入一个SessionFactory bean的引用–>
  40. <property name="sessionFactory"><ref local="sessionFactory"/></property>
  41. </bean>
  42. <!–定义DAO Bean , 作为事务代理的目标–>
  43. <bean id="personDaoTarget" class="lee.PersonDaoHibernate">
  44. <!– 为DAO bean注入SessionFactory引用–>
  45. <property name="sessionFactory"><ref local="sessionFactory"/></property>
  46. </bean>
  47. <!– 定义DAO bean的事务代理–>
  48. <bean id="personDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  49. <!– 为事务代理bean注入事务管理器–>
  50. <property name="transactionManager"><ref bean="transactionManager"/></property>
  51. <!– 设置事务属性–>
  52. <property name="transactionAttributes">
  53. <props>
  54. <!– 所有以find开头的方法,采用required的事务策略,并且只读–>
  55. <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
  56. <!– 其他方法,采用required的事务策略 ->
  57. <prop key="*">PROPAGATION_REQUIRED</prop>
  58. </props>
  59. </property>
  60. <!– 为事务代理bean设置目标bean –>
  61. <property name="target">
  62. <ref local="personDaoTarget"/>
  63. </property>
  64. </bean>
  65. </beans>
     

在上面的配置文件中,personDao需要配置两个部分,一个是personDao的目标bean,该目标bean是实际DAO bean,以实际的DAO bean为目标,建立事务代理。一个组件,需要来个bean组成,一个目标bean,一个事务代理。
这种配置方式还有一个坏处:目标bean直接暴露在Spring容器中,可以直接引用,如果目标bean被误引用,将导致业务操作不具备事务性。
为了避免这种现象,可将目标bean配置成嵌套bean,下面是目标bean和事务代理的配置片段:

Xml代码
  1. <!– 定义DAO bean的事务代理–>
  2. <bean id="personDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  3. <!– 为事务代理bean注入事务管理器–>
  4. <property name="transactionManager"><ref bean="transactionManager"/></property>
  5. <!– 设置事务属性–>
  6. <property name="transactionAttributes">
  7. <props>
  8. <!– 所有以find开头的方法,采用required的事务策略,并且只读–>
  9. <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
  10. <!– 其他方法,采用required的事务策略 ->
  11. <prop key="*">PROPAGATION_REQUIRED</prop>
  12. </props>
  13. </property>
  14. <!– 为事务代理bean设置目标bean –>
  15. <property name="target">
  16. <!– 采用嵌套bean配置目标bean–>
  17. <bean class="lee.PersonDaoHibernate">
  18. <!– 为DAO bean注入SessionFactory引用–>
  19. <property name="sessionFactory"><ref local="sessionFactory"/></property>
  20. </bean>
  21. </property>
  22. </bean>

手把手教你配置Windows2003集群

集群是在一组计算机上运行相同的软件并虚拟成一台主机系统为客户端与应用提供服务;计算机通过缆线物理连接并通过集群软件实现程序上的连接,可以使计算机实现单机无法实现的容错和负载均衡。集群技术在企业组织部署关键业务、电子商务与商务流程应用等领域,具有举足轻重的作用。

    本文主要带领大家一起,参与到基于Windows2003操作系统的集群配置中来,从以下的配置过程中,希望读者朋友能切实了解到Windows2003集群技术在Windows2003中的具体应用。

一、总体情况

Windows Server 2003的企业版和Datacenter版都可以支持最大达8个节点的集群配置;其典型的特征是可为数据库、消息系统、文件与打印服务这些关键业务应用,提供高可用性和可扩展性,在集群中的多个服务器(节点)保持不间断的联系。即是说如果在集群中的某一节点因出错或维护不可用时,另一节点会立刻提供服务,以实现容错。正在访问服务的用户可以继续访问,而不会察觉到服务已经由另一台服务器(节点)提供。

二、安装前准备

集群服务作为Windows Server 2003 操作系统的一个主要部分,不再是一个可选的组件。以下配置过程主要分为“安装前准备”、“服务安装”以及“创建集群”三方面进行。

    在这一步中,主要明白在软、硬件方面都应作怎样的准备,才能让集群服务正常安装并运行起来。首先在软件方面,要求群集中的所有计算机上均安装有 Windows Server 2003操作系统;需要有一个域名解析系统;所有的节点必须是同一个域的成员,需要一个域级账户,而且要是每个节点上的本地管理员组的成员。

    硬件方面,要求群集中的每个节点拥有两块网卡;每个节点上的所有网络界面均拥有静态IP地址;一个唯一的NetBIOS名称;群集磁盘上的所有分区必须格式化为NTFS等等。

三、服务安装

在第一个节点上开始安装群集服务前,必须先在每一个群集节点上执行以下步骤:

  • 在每个节点上安装 Windows Server 2003操作系统。
  • 设置网络。
  • 设置磁盘。

    提示:要配置群集服务,您必须以一个具有所有节点管理权限的账户登录。每个节点都必须是同一个域的成员。如果您选择将其中一个节点作为域控制器,则应在相同的子网上再设置一个域控制器,以便消除单点故障,并对该节点进行维护。

    关于Windows 2003操作系统的具体安装过程,这里不再详述,大家可以参考Microsoft相关技术文档。这里主要介绍余下两步。

1:设置网络

每个群集节点要求至少要有两块网卡用于两个或多个独立网络,以避免单点故障。其中一个网络适配器用于连接到公用网络,而另一个则用于连接到仅由群集节点组成的专用网络。拥有多个网络适配器的服务器被称为“多宿主”。在这部分的网络配置中,可从以下几方面进行。

  • 规划好两块网卡的名称
    依次在“控制面板/网络连接”中,右击本地连接的网卡图标,选择“重命名”命令,将此连接命名为“专用”;然后将另一个网卡连接图标命名为“公用”。新的连接名称将出现在“群集管理器”中,并将在联机时自动复制到其他所有的群集节点。
  • 确定绑定的顺序网络
    在“网络连接”窗口内,依次单击主菜单上的“高级/高级设置”命令,在弹出的窗口中确定顺序为公用、专用和远程访问连接,如图1所示。

    图1

  • 配置专用连接属性
    步骤1:在网络连接窗口中,右键单击专用连接图标,选择属性命令。
    步骤2:在“常规选”项卡下,清除所有其他客户端、服务和协议的复选框,确认只勾选了“Internet 协议 (TCP/IP)” 复选框,如图 2 所示。

    图2

    步骤3:在图3中单击右上角“配置”按钮,打开如图3所示界面后,在“高级”选项卡下,为网卡选择一个合适的传输速度值;建议将同一路径上的所有设备设定为 10 兆字节每秒 (Mbps) 和半双工,即保证集群环境内所有网卡速率保持一致。

    图3

    步 骤4:配置专用网络网卡地址。在图2所示界面中双击“Internet 协议 (TCP/IP)”,在打开的如图4所示IP地址配置界面中,为专用网络的网卡配置唯一的IP地址。比如可将10.0.0.0 到 10.255.255.255 (A 类)的地址段作为集群环境的专用IP地址段。

    图4

    步骤5:然后单击IP地址配置界面右下角的“高级”按钮。确保清除了在 DNS 中注册此连接的地址和在 DNS 注册中使用此连接的 DNS 后缀复选框;然后切换到“WINS”选项卡,勾选“禁用TCP/IP上的NetBIOS”选项,如图5所示。

    图5

    提示:以上三方面的内容在群集中的所有其他节点上,都应进行同样的设置。

  • 设置群集用户账户
    群集服务需要一个域用户账户,该账户应为每个可运行群集服务的节点上的“本地管理员”组成员。因为安装需要用户名和密码,所以该用户账户必须在配置群集服务前予以创建。该用户账户只能专门用于运行群集服务,而不能属于个人。
    依 次单击“开始/程序/管理工具/ Active Directory 用户和计算机”后,即可开始创建过程。注意最后在“Active Directory 用户和计算机”管理单元的左侧窗格中,右击群集后选择将成员添加到组;然后单击管理员,这样将给予新用户账户在该计算机上的管理特权。

2:设置磁盘

设置磁盘时注意,为了避免破坏群集磁盘,在其他节点上启动操作系统前,确认至少在一个节点上安装、配置并运行了 Windows Server 2003 和群集服务。在完成群集服务配置之前,所开启的节点数不要超过一个,这一点至关重要。

  • 创建仲裁磁盘
    仲裁磁盘用于存储群集配置数据库检查点和日志文件,日志文件可协助管理群集和维护一致性。一般情况下应创建一个最小 50 MB 的逻辑驱动器用来作为仲裁磁盘。
  • 配置共享磁盘
  • 共 享磁盘的配置,主要是从硬盘空余空间中分配一个仲裁磁盘和最少一个数据磁盘出来,用于集群管理(最好再加装一块硬盘,专用于集群);然后右击磁盘分区,选 择“格式化”命令;接着在如图6所示窗口中,在卷标框中,键入该磁盘的名称;然后选择“NTFS”文件系统;最后单击“确定”按钮即可。

    图6

    提示:为共享磁盘分配驱动器卷标至关重要,因为在还原磁盘时这会大大减少故障排除时间。

四、创建集群

    通过以上准备工作后,即可开始集群的创建。操作步骤如下所示:

    步骤1:依次单击“开始/程序/管理工具/群集管理器”选项,然后打开如图7所示对话框;从下拉列表中选择“创建新群集”。

图7

    步骤2:然后会弹出群集创建的向导,单击“下一步”后,在如图8所示设置窗口中,输入域名及集群名后单击“下一步”按钮。

图8

    步骤3:然后输入将要作为第一个节点创建群集的服务器的名称,如图9所示。

    提示:如果在本地使用一个不属于具有本地管理特权的域帐户的账户登录,向导将提示您指定一个新账户。这不是启动群集服务所用的帐户。

图9

    步骤4:接着会弹出如图10所示界面。这里是在查找可能导致安装出现问题的硬件或软件问题。检
查所有警告或错误信息。您还可以单击详细信息按钮,了解有关每个警告或提示的详细信息。  

图10

    步骤5:接着会提示输入唯一的群集 IP 地址。创建向导在这当中通过使用子网掩码选择正确的网络,自动与其中一个公用网络关联群集 IP 地址。这里提醒大家注意:群集 IP 地址只能用于管理,而不能用于客户端连接。 

    步骤6:然后输入在预安装时创建的群集服务账户的用户名和密码,并选择好域名;此时群集配置向导将验证用户账户和密码。

    步骤7:然后是一些确认页面,一切无误后,即可在最后的窗口中单击“完成”按钮;最后的群集管理器配置完成窗口如图11所示。

图11

五、后记

Windows Server 2003 家族提供了两种类型的集群服务:服务器集群和网络负载均衡。在以上部分中,重点给大家介绍了服务器集群从准备到安装的全过程,而网络负载均衡却并没有过多的涉及,其实该服务的功能也是强大且实有的,它有效增强了Web服务器、流媒体服务器、终端服务器等Internet服务器程序的可用性和扩展性;可与现存Web服务器群结构无缝集成。

OpenVPN 建置方案

版本:v0.01
日期:2005-09-12

* 版本歷程:
1) 2005-09-12 v0.01
- 初版

—————————————

一, 功能介紹

* SSL vpn 方案
* 可完整支援 L2 及 L3 連線
* 使用 CA 簽章確認及加密, 也可使用單一鍵值對稱加密
* 同時支援 Linux, FreeBSD, OS X 與 Windows
* 支援 tunnel 及 TAP 連線方式
* GPL 授權方式

二, 實作環境

2.1 server
OS: CentOS 4.1 Linux
real IP: 192.168.100.151
vpn IP: 10.8.0.1

2.2 client
OS: Windows XP(home)
real IP: 192.168.100.x(dhcp)
vpn IP: 10.8.0.x(server assigned)

三, 安裝

3.1 server

# 安裝 lzo (source rpm)
rpmbuild –rebuild http://openvpn.net/release/lzo-1.08-4.rf.src.rpm
rpm -ivh /usr/src/redhat/RPMS/i386/lzo-*.rpm

# 安裝 openvpn
mkdir /usr/src/pkgs
cd /usr/src/pkgs
wget http://openvpn.net/release/openvpn-2.0.2.tar.gz
rpmbuild -tb openvpn-1.6.0.tar.gz
rpm -ivh  /usr/src/redhat/RPMS/i386/openvpn-2.0.2-1.i386.rpm

# 複制設定範例
cp -r /usr/share/doc/openvpn-2.0.2/easy-rsa/ /etc/openvpn/
cp /usr/share/doc/openvpn-2.0.2/sample-config-files/server.conf /etc/openvpn/

# 設定 CA 環境
cd /etc/openvpn/easy-rsa/
vi vars
export KEY_COUNTRY=TW
export KEY_PROVINCE=Taiwan
export KEY_CITY=Tainan
export KEY_ORG="Study-Area"
export KEY_EMAIL="netman@study-area.org"
. ./vars
./clean-all

# 建置 root CA
./build-ca
Generating a 1024 bit RSA private key
……++++++
…………….++++++
writing new private key to ‘ca.key’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [TW]:
State or Province Name (full name) [Taiwan]:
Locality Name (eg, city) [Tainan]:
organization Name (eg, company) [Study-Area]:
organizational Unit Name (eg, section) []:test
Common Name (eg, your name or your server’s hostname) []:CA
Email Address [netman@study-area.org]:

# 建置 server key 及 crt
./build-key-server ovpnsrv1
Generating a 1024 bit RSA private key
……………………….++++++
….++++++
writing new private key to ‘ovpnsrv1.key’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [TW]:
State or Province Name (full name) [Taiwan]:
Locality Name (eg, city) [Tainan]:
organization Name (eg, company) [Study-Area]:
organizational Unit Name (eg, section) []:test
Common Name (eg, your name or your server’s hostname) []:ovpnsrv1
Email Address [netman@study-area.org]:

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName           :P RINTABLE:’TW’
stateOrProvinceName   :P RINTABLE:’Taiwan’
localityName          :P RINTABLE:’Tainan’
organizationName      :P RINTABLE:’Study-Area’
organizationalUnitName:PRINTABLE:’test’
commonName            :P RINTABLE:’ovpnsrv1′
emailAddress          :IA5STRING:’netman@study-area.org’
Certificate is to be certified until Sep  7 20:36:58 2015 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

# 建置 Diffie Hellman 參數
./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
…………………………….+……………………………………..
..+………………………………………………………………….
……………….+………………………………+………………….
…………………..+…

# 安裝 server 所需的 CA 文件
cp keys/ca.crt ../
cp keys/dh1024.pem ../
cp keys/ovpnsrv1.key ../
cp keys/ovpnsrv1.crt ../

# 配置 server 設定檔(沒提及的請保持原樣)
cd ../
vi server.conf
dev tap
;dev tun
ca ca.crt
cert ovpnsrv1.crt
key ovpnsrv1.key  # This file should be kept secret

# 啟動 server
service openvpn restart
chkconfig openvpn on

————————–
3.2 Client

# 下載並安裝 openvpn (GUI 版本)
http://openvpn.se/files/install_packages/openvpn-2.0.2-gui-1.0.3-install.exe

# 設定環境
cmd.exe
cd "c:\Program Files\OpenVPN\easy-rsa"
edit vars.bat
(內容必需與 server 一至, 尤其 KEY_ORG 項目.)

# 建置 CA環境
vars

# 建置 client key 與 crs
build-key ovpnclt1
….
Common Name (eg, your name or your server’s hostname) []:ovpnclt1
….

# 提交 crs (請使用安全方式, 本例用 pscp.exe .)
pscp keys/ovpnclt1.csr root@192.168.100.151:/etc/openvpn/easy-rsa/keys

# 轉至 server, 簽署 client crt
————————
cd /etc/openvpn/easy-rsa/
./sign-req ovpnclt1
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName           :P RINTABLE:’TW’
stateOrProvinceName   :P RINTABLE:’Taiwan’
localityName          :P RINTABLE:’Tainan’
organizationName      :P RINTABLE:’Study-Area’
organizationalUnitName:PRINTABLE:’test’
commonName            :P RINTABLE:’ovpnclt1′
emailAddress          :IA5STRING:’netman@study-area.org’
Certificate is to be certified until Sep  7 21:07:33 2015 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
————————

# 安裝 CA 文件
cd ..\config
pscp root@192.168.100.151:/etc/openvpn/easy-rsa/keys/ovpnclt1.crt  .\
pscp root@192.168.100.151:/etc/openvpn/easy-rsa/keys/ca.crt  .\
copy ..\easy-rsa\keys\ovpnclt1.key .\

# 複制 sample 設定檔:
copy ..\sample-config\client.ovpn .\

# 配置 client 端設定檔
右下角(OpenVPN GUI)
右鍵–> Edit Config (沒提及的, 請保持原貌)
dev tap
;dev tun
dev-node OpenVPN_Tap
remote 192.168.100.151 1194
ca ca.crt
cert ovpnclt1.crt
key ovpnclt1.key
ns-cert-type server

# 設定 openvpn TAP 界面
控制台–>網路連線–>TAP-Win32#(#)
右鍵–>重新命名–>OpenVPN_Tap

# 啟動 openvpn client
右下角(OpenVPN GUI)
右鍵–> Connect

# 測試
ping 10.8.0.1

四, 注意:

4.1 要允許多個 client 相互連線, 須在 server 端打開:
client-to-client

4.2 若想隱藏 server IP, 但純作 bridge 來用:
;server 10.3.0.0 255.255.255.0
server-bridge 10.8.0.1 255.255.255.0 10.8.0.129 10.8.0.246

4.3 若由其它 CA 建的 csr , organization(KEY_ORG=)必需要一至.
否則, 不能簽署.

4.4 CA 文件分佈:
server:
ca.crt
dh1024.pem
server.crt
server.key # 必須保密
client:
ca.crt
client.crt
client.key # 必須保密
CA server:
ca.crt
ca.key # 必須保密

4.5 Windows XP + SP2 與某些安全套件一併運行可能會導至 windows client 端不能成功.
目前除了移除 SP2 或衝突套件外, 暫無更好方法.
參考: http://openvpn.se/xpsp2_problem.html

五, 官方網站及文件:

http://openvpn.net/
http://openvpn.net/howto.html