MartianZ!

CentOS 6配置Cisco IPSec VPN服务器记录

KxxxWaxx买的VPN过期了,100元一年,自己主要是在iOS设备上用一下,流量完全用不完,实在是觉得没必要继续续费,正好VPS换到的新地方,网络环境相比之前的VPS好太多了,于是果断在VPS上搭建自用的VPN服务器。

参考网络的几个文章,记录下过程。

  1. 安装IPSec-Tools / Racoon

    wget ftp://ftp.pbone.net/mirror/ftp.pramberger.at/systems/linux/contrib/rhel5/i386/ipsec-tools-0.8.0-1.el5.pp.i386.rpm
    wget ftp://ftp.pbone.net/mirror/ftp.pramberger.at/systems/linux/contrib/rhel5/i386/ipsec-tools-libs-0.8.0-1.el5.pp.i386.rpm
    yum localinstall --nogpgcheck ipsec-tools-libs-0.8.0-1.el5.pp.i386.rpm ipsec-tools-0.8.0-1.el5.pp.i386.rpm
    
  2. 配置IPSec-Tools / Racoon

    /etc/racoon/racoon.conf

    path pre_shared_key "/etc/racoon/psk.txt";
    path certificate "/etc/racoon/certs";
    listen {
        isakmp xx.xx.xx.xx [500];
        isakmp_natt xx.xx.xx.xx [4500];
    }
    
    remote anonymous {
        exchange_mode aggressive, main, base;
        mode_cfg on;
        proposal_check obey;
        nat_traversal on;
        generate_policy unique;
        ike_frag on;
        passive on;
        dpd_delay 30;
    
        proposal {
            lifetime time 28800 sec;
            encryption_algorithm 3des;
            hash_algorithm md5;
            authentication_method xauth_psk_server;
            dh_group 2;
        }
    }
    
    sainfo anonymous {
        encryption_algorithm aes, 3des, blowfish;
        authentication_algorithm hmac_sha1, hmac_md5;
        compression_algorithm deflate;
    }
    
    mode_cfg {
        auth_source system;
        dns4 8.8.8.8;
        banner "/etc/racoon/motd";
        save_passwd on;
        network4 192.168.7.100;
        netmask4 255.255.255.0;
        pool_size 100;
        pfs_group 2;
    }
    

    /etc/racoon/psk.txt

    前面是VPN组名,后面是VPN密钥,VPN连接需要用到这两个值

    # Group Name Group Secret
    mzvpn mzvpn
    

    /etc/racoon/motd

    随便写一个,iOS、Mac OS X系统连接上VPN会显示该欢迎信息。

    Welcome To MartianZ VPN
    
  3. 添加系统的用户名和密码

    useradd -MN -b /tmp -s /sbin/nologin USER
    passwd USER
    
  4. 设置iptables的规则

    iptables -A INPUT -p udp -–dport 500 -j ACCEPT
    iptables -A INPUT -p udp --dport 4500 -j ACCEPT
    iptables -t nat -A POSTROUTING -s 192.168.7.0/24 -o eth0 -j MASQUERADE
    iptables -A FORWARD -s 192.168.7.0/24 -j ACCEPT
    iptables-save
    
  5. 设置IPv4 forward

    修改/etc/sysctl.conf

    net.ipv4.ip_forward=1
    

    生效

    sysctl -p
    
  6. 其它

    可以用调试模式启动racoon来看下。

    racoon -F
    

    或者:

    service racoon start
    chkconfig racoon on
    

《The Linux Kernel Primer》第2章习题

第2章习题:

  1. Describe how hash tables are implemented in the Linux kernel.

    参考:http://blog.csdn.net/shendl/article/details/6605207

    PDF下载:http://d.download.csdn.net/down/3441424/shendl

  2. A structure that is a member of a doubly linked list will have a list_head structure. Before the adoption of the list_head structure in the kernel, the structure would have the fields prev and next pointing to other like structures. What is the purpose of creating a structure solely to hold the prev and next pointers?

    第一个优点: 如果使用传统的链表数据结构,即:

    struct list_node {
    data_type data;
    list_node *next, *prev;
    }
    

    则对于不同的数据类型,必须声明不同的结构体。Linux的链表恰恰相反,是将链表节点嵌入到数据结构中,所以无论什么数据,链表操作都得到了统一。

    第二个优点: 一个Container数据结构可以含有多个list_head成员,这样就可以同时挂到多个不同的链表中,例如Linux内核中会将进程数据结构(task_struct)同时挂到任务链表、优先级链表等多个链表上。

    参考文档:http://www.cnblogs.com/stephenjy/archive/2010/02/09/1666166.html

  3. 什么是内联汇编(inline assembly)?为什么要使用它?

    内联汇编不需要调用单独编译好的会变成旭,可以通过特定的结构告诉编译器将代码组合到一起,而不是编译该代码块。能大大提高C函数的可读性和执行效率。

  4. Assume you write a device driver that accesses the serial port registers. Would you mark these addresses volatile? Why or why not?

    我会。不然编译器会尝试优化缓存这些值。同时对连续多次连续操作可能会被当做冗余操作去除。

  5. Given what __init does, what types of functions would you expect to use this macro?

    这个宏告诉编译器相关的函数或变量仅用于初始化。编译器将标有 __init 的所有代码存储到宏所代表的section中,初始化结束后就释放这段内存。

    对设备驱动的初始化过程一般用 __init 标记。

    提高系统效率,同时一部分内核初始化机制依赖与它,参考:http://blog.chinaunix.net/uid-25871104-id-2854544.html

Hello World! from the kernel space

Linux内核模块学习

源代码 hellomod.c:

//Hello World Driver for Linux

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");

static int __init lkp_init( void )
{
    printk("<1>Hello World! from the kernel space...\n");
    return 0;
}

static void __exit lkp_cleanup( void )
{
    printk("<1>Goodbye, World! leaving kernel space...\n");
}

module_init(lkp_init);
module_exit(lkp_cleanup);

Makefile:

obj-m += hellomod.o

default:
    make -C /usr/src/linux-$(shell uname -r) M=$(shell pwd) modules
clean:  
    rm -rf *.o *.cmd *.mod.c *.o *.unsigned .tmp_versions *.order *.symvers

输入make命令编译以后,即可得到输出的模块 hellomod.ko,可以用命令 insmod 将新的模块插入到内核中。

insmod hellomod.ko

通过 lsmod 命令可以检查模块是否被正确插入到内核中了:

[root@localhost hellomod]# lsmod | grep hellomod
hellomod                 620  0

通过 rmmod hellomod 命令可以移除内核模块。

通过journalctl -f或dmesg可以看到日志文件,可以看到printk()的输出

[root@localhost 98c7effcee3f41ef8549d7d5a93438bd]# journalctl -f
    -- Logs begin at Mon 2013-11-04 04:59:49 CST. --
    Dec 01 02:50:26 localhost kernel: <1>Hello World! from the kernel space...
    Dec 01 02:53:43 localhost kernel: <1>Goodbye, World! leaving kernel space...