HardBirch

移植带有openvpn的httpd服务器(作者:CalmArrow(lqm))

时间:09-12-05 栏目:系统技术篇 作者:鲁智森也有文化 评论:0 点击: 2,098 次

移植httpd和openvpn,完成后可以在浏览器中查看ARM9板上设置的网页
 
1、开发环境的建立
包括嵌入式移植交叉编译工具链(2.95.3),tftp,nfs,gdb环境的完全搭建。前面的工作使得这些都已经完成,具体看前面的总结文章。下面集中精力移植应用程序
 
2、移植openvpn
 
openvpn需要用到lzo库和openssl库的支持,同时采用基于TLS加密方式,使用CA验证VPN
client的身份。在Linux下已经搭建好了openvpn server,在win
xp下有一个client。现在要移植openvpn到arm9板子里,作为第二个client。关于在Linux、win
xp等X86架构下面搭建openvpn的工作请参考ELM的文章,这里不再叙述http://elm.blog.edu.cn/user1/4123/index.shtml


 
(1)交叉编译lzo
 

先,选择版本。可以多尝试几个版本,但是对于移植来说,我觉得最好不要使用最新的版本,因为最新版本首先在X86架构上测试,并不保证在ARM架构上成
功,甚至光编译就不通过。我测试了lzo-2.02,在Linux下面可以,但是交叉编译失败。所以降低版本,选择同样稳定的lzo-1.08版本。

 
[armlinux@lqm lzo-1.08]$ ./configure --host=arm-linux --prefix=/home/armlinux/lzo
正常执行。。。
configure: WARNING: If you wanted to set the --build type, don't use --host.
    If a cross compiler is detected then cross compile mode will be used.
checking build system type... i686-pc-linux-gnu
checking host system type... arm-unknown-linux-gnu
checking target system type... arm-unknown-linux-gnu
checking for arm-linux-gcc... arm-linux-gcc/
...
configure: creating ./config.status
config.status: creating Makefile
config.status: creating examples/Makefile
config.status: creating include/Makefile
config.status: creating ltest/Makefile
config.status: creating minilzo/Makefile
config.status: creating src/Makefile
config.status: creating tests/Makefile
config.status: creating config.h
config.status: executing depfiles commands

 
完成后,然后进行编译安装。
 
[armlinux@lqm lzo-1.08]$make
make[2]: Leaving directory `/home/armlinux/openvpn/lzo-1.08/minilzo'
make[2]: Entering directory `/home/armlinux/openvpn/lzo-1.08'
make[2]: Nothing to be done for `all-am'.
make[2]: Leaving directory `/home/armlinux/openvpn/lzo-1.08'
make[1]: Leaving directory `/home/armlinux/openvpn/lzo-1.08'

[armlinux@lqm lzo-1.08]$ make install
Making install in include
make[1]: Entering directory `/home/armlinux/openvpn/lzo-1.08/include'
make[2]: Entering directory `/home/armlinux/openvpn/lzo-1.08/include'
make[2]: Nothing to be done for `install-exec-am'.
/bin/sh ../acconfig/mkinstalldirs /home/armlinux/lzo/include
mkdir -p -- /home/armlinux/lzo/include
...
make[2]: Leaving directory `/home/armlinux/openvpn/lzo-1.08'
make[1]: Leaving directory `/home/armlinux/openvpn/lzo-1.08'

 
在lzo的交叉编译过程中,我遇到的唯一问题就是版本问题。如果选择lzo-1.08,则一切顺利。
 
(2)openssl的交叉编译
 
选择版本为openssl-0.9.7e
注意此版本的安装,先看README,后看INSTALL。
 
------------------------
     Pick a suitable name from the list that matches your system. For most
     operating systems there is a choice between using "cc" or "gcc".  When
     you have identified your system (and if necessary compiler) use this name
     as the argument to ./Configure. For example, a "linux-elf" user would
     run:

       $ ./Configure linux-elf [options]
------------------------
 
就是说,要交叉编译,首先加上参数linux-elf-arm。
 
[armlinux@lqm openssl-0.9.7e]$ ./Configure linux-elf-arm --prefix=/home/armlinux/openssl/
Configuring for linux-elf-arm
IsWindows=0
CC            =gcc
CFLAG         =-DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DOPENSSL_NO_KRB5 -DL_ENDIAN -DTERMIO -O3 -fomit-

frame-pointer -Wall
EX_LIBS       =-ldl
BN_ASM        =bn_asm.o
DES_ENC       =des_enc.o fcrypt_b.o
BF_ENC        =bf_enc.o
CAST_ENC      =c_enc.o
RC4_ENC       =rc4_enc.o
RC5_ENC       =rc5_enc.o
MD5_OBJ_ASM   =
SHA1_OBJ_ASM  =
RMD160_OBJ_ASM=
PROCESSOR     =
RANLIB        =/usr/bin/ranlib
ARFLAGS       =
PERL          =/usr/bin/perl
THIRTY_TWO_BIT mode
BN_LLONG mode
RC4_CHUNK is undefined
[armlinux@lqm openssl-0.9.7e]$ make

[armlinux@lqm openssl-0.9.7e]$ make install
 
(3)openvpn的交叉编译
 

面两步顺利通过之后,如果版本选择没有问题,则该步也不会有问题。这里开始时遇到大量的问题,不是说lzo库找不到,就是说openssl库找不到。最终
发现问题在与configure配置的参数问题。它有固定的模式,比如说,--with-ssl-headers=/home/armlinux
/openssl/include可以,但是你不能写成,--with-ssl-headers=/home/armlinux/openssl
/include/openssl。本来应该一样,但是如果写成后者就会报错。这算不算bug,我也不知道,读mailing
list时发现这样的问题很多。如果不想出错,就按照如下配置。

 
[armlinux@lqm openvpn-2.0.7]$ ./configure --host=arm-linux --prefix=/home/armlinux/target/ --with-lzo-
headers=/home/armlinux/lzo/include/ --with-lzo-lib=/home/armlinux/lzo/lib/ --with-ssl-headers=/home/armlinux/openssl/include/
--with-ssl-lib=/home/armlinux/openssl/lib/
checking openssl/ssl.h usability... yes
checking openssl/ssl.h presence... yes
checking for openssl/ssl.h... yes
checking for SSL_CTX_new in -lssl... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating openvpn.spec
config.status: creating config-win32.h
config.status: creating install-win32/openvpn.nsi
config.status: creating config.h
config.status: executing depfiles commands



因为我想选择静态编译,不想要把lzo库和openssl库都移植过去,所以在arm-linux-gcc的配置选项中加入-static。
 
[armlinux@lqm openvpn-2.0.7]$make;make install


 
生成的openvpn很大,arm-linux-strip处理一下,还接近1.5M。


 
3、原来移植过httpd,它的方法和上面差不多。这里也不再叙述怎样制作ramdisk盘。而只是利用原来已经移植好httpd的ramdisk盘来加入openvpn。


 
3.1  首先把ramdisk的扩展名改为.gz。

#mv ramdisk ramdisk.gz

3.2  解压,正好前面做了个小的解压脚本,还比较好用。

#autounzip ramdisk.gz

OK

3.3  挂载,选择挂载点为tmp

#mount -o loop ramdisk ./tmp

#cd tmp

#ls

这时你就会看到ramdisk盘的内容了。可以在这里修改,它与你的ramdisk是同步修改的。

3.4  在根文件系统etc下建立openvpn项目。


建立conf文件夹,放client.conf。然后建立keys,log,sbin文件夹,把相应的内容移过来,跟Linux下一样。注意在这里移植的openvpn是交叉编译之后的ELF可执行文件。


然后在root下放openvpn-control。把前面写得脚本又纠正了一下,现在好多了。

3.5  完成之后,重新压缩生成ramdisk映象。

#umount tmp

#gzip -c -v9 > /var/ftp/pub/ramdisk


 
4、时间同步问题的解决。


 

为openvpn需要与主机时间同步,否则handshake会失败。所以选择了ntpd服务。在Host上配置ntpd服务器,然后交叉编译
ntpdate,放到arm9板子上。只需要ntpdate与Host同步就可以了。这个也综合到openvpn-control脚本上了。



 
5、大功告成。下面就是完整的输出后的信息。


 
[root@lqm /root]$./openvpn-control start
/etc/openvpn/log/client.pid: No such file or directory
30 Aug 09:39:30 ntpdate[118]: adjust time server 192.168.1.216 offset -0.035283 sec
[root@lqm /root]$ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0D:85:64:23:10 
          inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:128 errors:0 dropped:0 overruns:0 frame:0
          TX packets:79 errors:0 dropped:0 overruns:0 carrier:0
          collisions:11 txqueuelen:1000
          Interrupt:24 Base address:0xc000


lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0


tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
          inet addr:10.8.0.10  P-t-P:10.8.0.9  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100


[root@lqm /root]$ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1): 56 data bytes
64 bytes from 10.8.0.1: icmp_seq=0 ttl=64 time=4.5 ms
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=3.3 ms
64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=4.3 ms


--- 10.8.0.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 3.3/4.0/4.5 ms
[root@lqm /root]$ping 10.8.0.6
PING 10.8.0.6 (10.8.0.6): 56 data bytes
64 bytes from 10.8.0.6: icmp_seq=0 ttl=128 time=6.6 ms
64 bytes from 10.8.0.6: icmp_seq=1 ttl=128 time=6.6 ms
64 bytes from 10.8.0.6: icmp_seq=2 ttl=128 time=4.5 ms


--- 10.8.0.6 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 4.5/5.9/6.6 ms
[root@lqm /root]$



 
在Linux下输入
http://192.168.1.100

或者
http://10.8.0.10

都可以看到网页。在win下,如果不开启openvpn,则
http://10.8.0.10

无法看到网页,开启之后,可以看到。这正是openvpn的作用。

移植带有openvpn的httpd服务器(作者:CalmArrow(lqm)):等您坐沙发呢!

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐