月度归档:2015年05月

Debian搭建vpn服务器

搭建 VPN 服务器的方法非常多,比较著名的有 PPTP, L2TP/IPSec 和 OpenVPN。这三种方式中后两者的安全性比较好,但配置较麻烦,PPTP 是这三者中配置最容易的方式,而且 Windows/Mac 系统中都内建相应的客户端。 1、安装pptp,这是个vpn的服务端软件

sudo apt-get install pptpd

系统会自动解决依赖关系,安装好后,需要进行一番设置。 2、编辑 /etc/pptpd.conf

sudo vi /etc/pptpd.conf

去掉文件最末端的 localip 和 remoteip 两个参数的注释,并进行相应修改。这里,localip 是 VPN 连通后服务器的 ip 地址,而 remoteip 则是客户端的可分配 ip 地址,自己设置置。 3、这里绝大多数参数只需维持原来的默认值即可,我们只需要改变其中的 ms-dns 选项,为 VPN 客户端指派 DNS 服务器地址,可以修改为google提供的DNS server或其他DNS:

ms-dns 8.8.8.8
ms-dns 8.8.4.4

4、 修改文件 /etc/ppp/chap-secrets,第一列是用户名,第二列是服务器名(默认写 pptpd 即可,如果在 pptpd-options 文件中更改过的话,注意这里保持和文件中的name行一致),第三列是密码,第四列是 IP 限制(不做限制写 * 即可)如创建一个名为user,密码为userpasswd,不限制登录IP的VPN账号:

user pptpd userpasswd *

全部搞定后,我们需要重启 pptpd 服务使新配置生效:

sudo /etc/init.d/pptpd restart

如果这时候尝试连接的话是可以连上的,但是只能访问机器资源,不能上网,想上网的话需要继续配置。 6、修改文件 /etc/sysctl.conf,去掉这一行 #net.ipv4.ip_forward=1 的#号,开启ipv4 forward,然后运行命令:

sudo sysctl –p

运行后会显示 net.ipv4.ip_forward = 1,就表示修改生效了。有些时候,经过这样设置,客户端机器就可以上网了,如果还不行的话,继续配置 7、使用iptables来建立NAT,先安装iptables:

sudo apt-get install iptables

装好后,我们向 nat 表中加入一条规则:

sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

上面的24表示子网掩码,代表24个1. eth0是网卡名字,可以通过命令 ifconfig 查看,iptables 的规则会在下次重启时被清除,为防止重启机器后iptables丢失,先运行:

sudo iptables-save > /etc/iptables-rules

然后修改 /etc/network/interfaces 文件,找到 eth0 那一节,在对 eth0 的设置最末尾加上下面这句:

pre-up iptables-restore < /etc/iptables-rules

这样当网卡 eth0 被加载的时候就会自动载入我们预先用 iptables-save 保存下的配置。PPTP 服务需要使用 1723(tcp) 端口和 gre 协议,因此确保防火墙设置允许这两者通行。测试是否可以解析DNS:

nslookup google.com

配置完后重启pptpd

Hello world的autoconf和国际化支持教程

本文将讲解如何将一个使用Makefile的Hello world程序国际化以及如何采用autotools进行配置和编译。

下面是大家所熟知的Hello world程序,将其命名为helloworld.c:

#include <stdio.h>

int main (void) {
  printf ("Hello, world!\n");
} 

1.首先我们创建源代码目录树:
    /                这是顶层目录
    /src           这是放置源代码的目录
将helloworld.c放入src/目录中。

2.如果你的程序还没有启用autoconf,你可以先创建configure.scan文件(),将其重命名为configure.ac:

autoscan
mv configure.scan configure.ac

编辑configure.ac,进行一些修改。你可以删除AC_INIT后面的所有内容。我们将采用AM_INIT_AUTOMAKE来传递变量。在AC_INIT后添加如下几行:

PACKAGE=helloworld
VERSION=0.0.1
AM_INIT_AUTOMAKE($PACKAGE, $VERSION)

并将AC_CONFIG_HEADER改变为AM_CONFIG_HEADER。如果你有一个空的AC_CONFIG_FILES 宏,注释掉它,否则下一步会出现错误。最后添加Makefile到AC_OUTPUT宏:

AC_OUTPUT(Makefile)

    注释:configure.ac以前叫configure.in

3.添加一些额外的文件:NEWS、README、AUTHORS、Changelog,这些文件不是automake工具所需要的,这是为了遵循GNU标准。在新建另外两个文件:config.h.in、Makefile.am,这两个文件是automake工具所必须的。我们将稍后创建Makefile.am。

4.添加GNU所要求但还不存在的文件(如CONPING、INSTALL等):

automake --add-missing --gnu

5.接下来,我们将添加国际化支持。同样,在顶层目录运行下面的命令:

intltoolize 

6.运行autoheader来创建config.h.in:

autoheader

7.打开configu.in进行一些修改:

IT_PROG_INTLTOOL(0.26)
AM_GNU_GETTEXT([external])      # 我们只需要这两个
AM_GLIB_GNU_GETTEXT         # 宏中的一个
ALL_LINGUAS="da nl"         # 国际化,意味着将为danish和dutch语言创建.po文件
AC_OUTPUT(
    Makefile
    src/Makefile
    intl/Makefile
    po/Makefile.in
)

IT_PROG_INTLTOOL将检查intltool工具的版本是否符合标准。

AM_GNU_GETTEXT添加本地语言支持到Makefile,同时带有一个编译选项。AM_GNU_GETTEXT将检查额外需要的函数和程序,并在configure过程中创建po/POTFILES。除了使用AM_GNU_GETTEXT,你也可以使用AM_GLIB_GNU_GETTEXT, which will do a few less things than AM_GNU_GETTEXT, but does more than enough for what intltool needs to work.你只需要使用这两个宏其中任一个就可以。

文本域通过PACKAGE来识别,我们将在helloworld.c添加一些函数,函数将使用这些预定义的变量。同样,这将是你翻译文件的基本文件名,确定你选择了一个独一的名称。

8.现在,添加所支持的语言到po/LINGUAS:

da nl

注释:过去,这个功能是通过configure.{in,ac}文件中的ALL_LINGUAS变量实现的,从gettext 0.11废弃。

9.运行
aclocal 
来检查autoconf和automake所必要的宏是否插入到aclocal.m4。

运行
autoconf
来创建configure脚本。

10.安装gettext.h头文件,并在程序中包含进去,我们定义了一个简单的宏_()来代替gettext():

#include "gettext.h"
#define _(String) gettext (String)

11.现在添加下列代码到helloworld.c中:

#include <locale.h>
#include "gettext.h"
#define _(String) gettext (String)
/* includes used by original program here */    

int main (void) 
{
    setlocale (LC_ALL, "");
    bindtextdomain (PACKAGE, LOCALEDIR);
    textdomain (PACKAGE);

    /* Original Helloworld code here */
    }

如果你使用的是gnome或是gtk+,那么我们不需要setlocale这条语句。现在我们将要被进行翻译的字符创替换为(“字符串”),那么printf(“Hello world”)将变成printf((“Hello world!\n”))。

12.创建src/Makefile.am(Makefile.in和Makefile文件将会基于Makefile.am产生):
INCLUDES = -I$(top_srcdir) -I$(includedir) -DLOCALEDIR=\””$(datadir)/locale”\”
bin_PROGRAMS = helloworld
helloworld_SOURCES = helloworld.c
noinst_HEADERS = i18n-support.h

  1. Now we create the following toplevel Makefile.am
    SUBDIRS = src po

  2. Go into the directory po/ and create POTFILES.in

    This file should contain a list of all the files in your distribution

    (starting from the top, one level above the po dir) that contain

    strings to be internationalized.

    For the helloworld sample, it would contain

    src/helloworld.c

    Run 

      intltool-update –pot

    Run

      intltool-update –maintain 

    to see if you are missing files that contain marked strings.  

    You should consider adding these to POTFILES.in

  1. Now we start making a Danish and Dutch translation

    msginit –locale=da

    msginit –locale=nl

    intltool-update da

    intltool-update nl

    edit and update da.po and nl.po

    (The respective translations are “Hej verden” and “Hallo wereld”)

    

  1. Now we can compile.  We will test it later, so we will install it in

    a temporary location.

    Close your eyes and type 

      ./configure –prefix=/tmp/helloworld && make 

    in the toplevel directory. 🙂

  1. To test if it works, you have to install the package.

    Run

      make install

    in the toplevel directory.

  1. Now set the environment variable LC_ALL to your preferred language :

      export LC_ALL=nl_NL

      /tmp/helloworld/bin/helloworld

      export LC_ALL=da_DK

      /tmp/helloworld/bin/helloworld

    And if all goes well, the string should be translated in the two languages.

  1. To finish it all up, run

      make dist

    to create a distributable tarball containing your internationalized

    program.

  1. Exercises :

    – add another language