-
2008-08-26
VPN@Fedora 9 with xl2tpd - [走很长路]
今天成功地搞定了VPN,虽然说速度也就那样子,不过比起之前用代理的效果还是赞了很多。在这里和大家分享下!
1、安装xl2tpd
安装xl2tpd其实是一个很简单的事情,但是呢,要小心的是也许你并没有安装成功。我是吃过这个苦的,在这里我先说说我没有安装成功的case。
A、到 www.xelerance.com/software/xl2tpd/去下载xl2tpd-1.1.12.tar.gz。
#tar zxvf xl2tpd-1.1.12.tar.gz
#cd xl2tpd-1.1.12
#make
#make install
#mkdir /etc/xl2tpd/但是我用rpm -q xl2tpd,发现并没有安装成功。
B、找一个速度快的代理,直接通过yum安装xl2tpd。如果速度不够快的话,会time out连接不上source。可以另外找台电脑,给自己开个代理。至少我是这么做的。
yum install xl2tpd
2、写配置文件
#mkdir /etc/xl2tpd/
#cd /etc/xl2tpd/
#vi xl2tpd.confxl2tpd.conf的内容如下:
[global] ; Global parameters:
port = 1701 ; * Bind to port 1701
[lac zju] ; Example VPN LAC definition
lns = lns.zju.edu.cn ; * Who is our LNS?
refuse pap = yes ; * Refuse PAP authentication
require authentication = no ; * Require peer to authenticate
name = zealot@a ; * Report this as our hostname
ppp debug = yes ; * Turn on PPP debugging
pppoptfile = /etc/l2tpd/zju.options ; * ppp options file for this lac
其中name就是你的VPN帐号。#vi zju.options
zju.options的内容如下:
asyncmap 0
noauth
crtscts
lock
hide-password
modem
netmask 255.255.255.0
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
ipcp-accept-local
ipcp-accept-remote
noipx3、编辑密码文件
#vi /etc/ppp/chap-secrets
chap-secrets的内容如下:
# Secrets for authentication using CHAP
# client server secret IP addresses
* * "password" *password是的的VPN密码,保留引号。
4、添加hosts
#mkdir /var/run/xl2tpd
然后,在/etc/hosts加入一行
10.5.1.9 lns.zju.edu.cn5、运行与调试
启动 l2tpd
# /etc/init.d/xl2tpd start
终端这里出现Starting xl2tpd:并且没有什么错误提示就ok了
然后发送连接到 vpn 的命令
# echo "c zju" > /var/run/xl2tpd/l2tp-control
之后运行一下 ifconfig(如果你的path没有设置好的话,就用全路路径/sbin/ifconfig),如果看到 ppp0 设备,那么恭喜你成功了!
ppp0 Link encap:Point-to-Point Protocol
inet addr:172.16.37.39 P-t-P:172.16.255.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1442 Metric:1
RX packets:267606 errors:0 dropped:0 overruns:0 frame:0
TX packets:189248 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:375656610 (358.2 MiB) TX bytes:11688257 (11.1 MiB)路由配置
要让校内的网络资源仍然通过原先的路由,而校外资源则通过 vpn,需要配置 一下路由。连接到 vpn 以后,用 ip route(如果你的path没有设置好的话,就用全路路径/sbin/ip route)查看当前路由。
# ip route
222.205.64.1 dev ppp0 proto kernel scope link src 222.205.74.23
222.205.9.0/24 dev eth0 proto kernel scope link src 222.205.9.2
default via 222.205.9.1 dev eth0
可以看出默认路由是通过网关,而不是 vpn ,我们希望 10.* 、 210.32.* 和 222.205.* 使用默认路由
# ip route add 10.0.0.0/8 via 222.205.9.1 dev eth0
# ip route add 222.205.0.0/16 via 222.205.9.1 dev eth0
# ip route add 210.32.0.0/16 via 222.205.9.1 dev eth0
注意 222.205.9.1 要替换成你刚才 ip route 所看到的 default 一句里面的那 个地址。
然后删除原来的默认路由
# ip route del default
注意不要先删除默认路由再设置 10.* 的路由,因为 vpn 服务器在 10.* 网段,删除默认路由将直接导致 vpn 断开。
设置其他地址使用 vpn ,地址可以通过 ifconfig 查看
# ifconfig
ppp0 Link encap:Point-to-Point Protocol
inet addr:222.205.74.23 P-t-P:222.205.64.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1442 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:40 (40.0 b) TX bytes:46 (46.0 b)
就是 P-t-P 那里的地址,这里是 222.205.64.1 ,然后设置新的默认路由
# ip route add default via 222.205.64.1 dev ppp0
这样 vpn 就配置完毕可以使用了。6、VPN连接脚本
#!/bin/bash
########################################
# Shell script to (re)connect to VPN
# pluskid <pluskid.zju@gmail.com>
########################################
####################
# Variables
####################
## How many seconds to wait for the ppp0 to come up each try
TIMEOUT=10
## How many times to try to bring up ppp0 until fail
N_RETRY=3
## Interface default to use
INTERFACE=eth0
## How many seconds to wait for l2tpd to restart
L2TPD_TIMEOUT=10
## For xl2tpd: /etc/init.d/xl2tpd
## For l2tpd: /etc/init.d/l2tpd
L2TPD_SCRIPT=/etc/init.d/xl2tpd
## For xl2tpd: /var/run/xl2tpd/l2tp-control
## For l2tpd: /var/run/l2tp-control
L2TPD_PIPE=/var/run/xl2tpd/l2tp-control
####################
# Commands
####################
function usage
{
echo "$1 login to the school VPN."
echo "$1 [-h] [-r]"
echo " Default to connect to VPN."
echo " -r reconnect."
echo " -h help, i.e. show this information."
}
function connect
{
if ppp0_alive ; then
echo "Already connected."
else
bring_up_ppp0 && setup_route
fi
}
function reconnect
{
restart_l2tpd && bring_up_ppp0 && setup_route
}
####################
# Internal utility functions
####################
function super_user
{
if [ "$UID" = "0" ]; then
return 0 # Yes, super user
else
return 1
fi
}
function ppp0_alive
{
if /sbin/ifconfig | grep -s 'ppp0' > /dev/null ; then
return 0 # Yes, connected
else
return 1
fi
}
function bring_up_ppp0
{
for i in $(seq $N_RETRY)
do
echo -n "Trying to bring up ppp0"
echo "c zju" > $L2TPD_PIPE
for j in $(seq $TIMEOUT)
do
if ppp0_alive; then
echo " Done!"
return 0 # Yes, brought up!
fi
echo -n "."
sleep 1
done
echo
done
echo "ERROR: Failed to bring up ppp0!"
return 1
}
function setup_route
{
echo "Setting up route..."
STATIC=$(/sbin/ip route | grep '^default' | cut -d" " -f3)
# If already set the route before, we cannot find
# the original default route any more. But fortunately,
# the route previously setted often won't change and
# we can just safely ignore this task
if [ ! -z $STATIC ]; then
/sbin/ip route add 10.0.0.0/8 via $STATIC dev $INTERFACE
/sbin/ip route add 222.205.0.0/16 via $STATIC dev $INTERFACE
/sbin/ip route add 210.32.0.0/16 via $STATIC dev $INTERFACE
/sbin/ip route add 239.43.1.1 via $STATIC dev $INTERFACE
/sbin/ip route del default
fi
PPP=$(/sbin/ifconfig | sed -n '/P-t-P/s/^.*P-t-P:\([0-9.]*\).*$/\1/p')
/sbin/ip route add default via $PPP dev ppp0
echo "Done!"
}
function restart_l2tpd
{
echo "Restarting l2tpd..."
$L2TPD_SCRIPT restart
for i in $(seq $L2TPD_TIMEOUT)
do
if [ -e $L2TPD_PIPE ]; then
echo "Done!"
return 0 # Successfully restarted!
fi
sleep 1
done
echo "ERROR: Failed to restart l2tpd!"
return 1 # Failed to restart l2tpd
}
####################
# Main
####################
if ! super_user ; then
echo "ERROR: You must be super user to run this utility!"
exit 1
fi
if [ $# -lt 1 ]; then
connect
elif [ "$1" = "-h" ]; then
usage
else
reconnect
fi将以上内容保存为 vpn.sh ,然后添加可执行权限 chmod +x vpn.sh ,之后直接执行就可以连接 vpn : ./vpn.sh ,加参数 -r 表示重新连接, -h 显示帮助信息。
-
2008-04-14
Windows Vista下配置JAVA开发环境JDK - [走很长路]
下面就以Windows Vista系统为例,详细的说明一下配置的过程。
1. 下载JDK
可以在Sun公司的网站上下载到免费的JDK软件,具体地址:http://java.sun.com/javase/downloads/index.jsp。注意选择正确的操作系统(这里选择Windows),我下的是jdk-6u3-windows-i586-p.exe。2. 安装JDK
直接点击安装就可以了,但是建议不要将JDK放在诸如Program Files等含有空格的文件夹中,这样会使以后的调试变得不方便。作为例子,这里将JDK装在 D:\JAVA\jdk 文件夹中。注意下载的安装程序会同时提示安装JRE,建议安装在 D:\JAVA\jre 就可以了。3. 配置坏境
在开始菜单中的计算机处敲击右键,选择属性,出现系统文件夹。点击左栏的“高级系统设置”,弹出“系统属性”选单,选择“高级”选项卡中的“环境变量”选项。在上部的用户变量处添加以下的三个键值。
名称=值
java_home=c:\JAVA\jdk (安装路径)
classpath=.;%java_home%\lib\tools.jar;%java_home%\jre\lib\rt.jar;
path= %java_home%\bin
注意classpath键值的最前面是一个句点和一个分号,句点表示的是当前文件夹。4.调试如果没有java的可视化编辑器的话,建议去http://www.eclipse.org下载eclipse,我用的是eclipse-java-europa-winter-win32。代开eclipse编辑器,点击New->Java Project,创建名为welcome的Java工程,在src处点击右键,添加.java源文件。输入以下代码:public class welcome
{
public static void main(String[] args)
{
String[] greeting = new String[2];
greeting[0] = "Welcome to Core Java";
greeting[1] = " I am kale."; for (String g : greeting)
System.out.println(g);
}
}如果运行成功,可以在Console窗口看到以下两行信息:
Welcome to Core Java
I am kale.则以上的设置是正确的。
-
古堡救美游戏
描述
一个命令行游戏,让玩家在一个有很多楼层和很多房间的古堡中探险,玩家的任
务是找到公主并带她离开古堡。房间有很多种,不同种类的房间有不同的出口,
有的房间里有怪物。如果遇到怪物,游戏就失败了。
游戏启动时,玩家位于古堡一楼的大厅,程序显示大厅的信息:房间的名字、有
几个出口、每个出口的名字(如"east"、"south"、"up")。
Welcome to the lobby. There are 3 exits as: east, west and up.
Enter your direction to go:
然后玩家可以输入出口的名字来进入那个出口联接的房间,如
east
则游戏进入那个房间,程序显示那个房间的信息,如大厅一样。玩家则可以继续
选择下一个房间。
一旦进入有怪物的房间,则显示怪物的信息并结束游戏。
一旦进入有公主的房间,则显示公主的信息,玩家还必须寻找出去的路直到大
厅,然后从大厅寻找出口离开古堡。
所有的显示信息和用户输入都采用英文,以简化程序。要求
1. 至少三种不同种类的房间;
2. 至少五个房间;
3. 怪物和公主所在的房间是随机的。分析
先对古堡就行数据抽象,古堡(Castle)包含了许许多多的房间(这里称之为格子(Lattice)),可以抽象为一个Castle类,该类包含以下信息:Castle内的所有Lattice,Monster在古堡内的分布情况,Princess在古堡内的定位信息。Castle类内的成员函数只有两个,一个是对随机分布进行实现的Random函数,另一个是Castle类的构造函数,用于对古堡内所有Lattice的初始化。Castle类定义如下:
class Castle
{
private:
Lattice Rooms[TotalLattice];
int MonsterIn[TotalLattice];
int PrincessIn[TotalLattice];
public:
int Random();
Castle();
};然后对古堡(Castle)内的每一个格子(Lattice)作进一步的数据抽象,每个房间(包括大厅)都是Lattice类的一个具体对象,该类包含以下信息:房间的名称,是否有Monster,是否有Princess,Exits的个数,各个出口指向的目的Lattice的指针,各个出口的(二进制)状态。Lattice类的成员函数有以下几个:判断是否Monster In,判断是否Princess In,打印房间(Lattice)的Info,对各个格子状态的初始化函数。
Lattice类定义如下:
class Lattice
{
public:
char RoomName[20];
int Monster;
int Princess;
int OpenDoor;
int DoorState[6];
Lattice *east , *west , *south , *north , *up , *down;int isMonsterIn();
int isPrincessIn();
void PrintLatticeInfo();
int Init(char *Name, int M , int P, Lattice *E , Lattice *W , Lattice *S , Lattice *N , Lattice *U , Lattice *D );
};
以上的类定义及成员函数的实现都写在CastleBeauty的头文件中。现在开始考虑整个古堡救美游戏(CastleBeauty)的实现。main函数的主体结构为:
int main()
{
WelcomeInfo(); //进入游戏显示欢迎信息while(1)
{
GameLoop(); //游戏主体,返回有两种情况:遇见Monster,救出Princess
cout<<endl<<"Do you wanna to try it again (Yes / No) :"; //询问是否再玩一次
cin>>Choice;if(choice is not yes) //判断是否继续
break;
}return 0;
}至于GameLoop函数的实现也很简单:
int GameLoop()
{
Castle CastleOne; //定义一个古堡的实例
int GetPrincess = false; int isFirstTime = true;Lattice *CurrentLattice = &CastleOne.Rooms[1]; //一楼的中间那间是大厅
while(!GetPrincess || Not yet return to the Hall)
{
CurrentLattice->PrintLatticeInfo(); //显示当前进入的Lattice的Infoif(Monster is in Current Lattice) //如果Monster在
{
cout<<endl<<"Monster is in the room , game over!!!"<<endl;
return 0;
}if(Princess is in Current Lattice) //如果Princess在
{
cout<<endl<<"Princess is in the room , lead her out of this castle and avoid meeting the monster!!!"<<endl;
}int loop = true;
while(loop)
{
cout<<"Enter your direction to go: ";
cin>>Choice;
parse the choice and go to the corresponding room.
}
}cout<<endl<<"Congratuations!!!"<<endl;
cout<<"You have succeed in leading the princess out of the castle!!!"<<endl;return 0;
}
至此我们的程序也就算是完成了,当然这是比较基本的实现,程序员也可以进一步Develop这个古堡救美的游戏,虽然只是在文本模式下的小游戏,还是可以进一步设置难度等级(Easy , Normal , Difficult),也可相应记录玩家的Mark以及Rank等。 -
2008-03-14
Robocup仿真和SRTP项目 - [走很长路]
Robocup仿真组中期检查的Dead Line是April 5th,到现在代码还是维持在最初水平。昨晚信誓旦旦地决定要把Goal Keeper的函数demeer_goalie()写好,写到一半发现底层代码用的是Portugal在2000年夺得世界冠军时候的代码,于是觉得我的水平应该很难超越的样子。只是重新组织了代码的结构,编译完打开Sever开始比赛测试下效果,发现我的Goal Keeper傻掉了,除了会盯着球看以外,其他什么都不会做了。每次都是眼睁睁地看着球进去,无动于衷。Zzz...上半场临近结束时就被弱弱的底层代码踢了个3:0,惊叹守门员的价值所在!剩下Defender、Midfielder和Attacker的战术什么的都还没有想好,时间过得好快,我做的又好慢,真麻烦。
今年想做SRTP,团队算是组好了:小董、俞辰、木木和我。里面最让我放心的是小董,做事最踏实了,而且CS曾经的NO.1实力是摆在那里的,外加任劳任怨,完全的实力派的劳模形象。zzz...瞻仰瞻仰...==身为组长的我惭愧下。项目基本上也定好了,写个Linux的发行版,虽然从大一就开始接触了Linux操作系统,最初的ubantu 6.10到现在的Fedora 7.0。不过都只是玩玩的水准,确切的说连玩玩都不是很深入,所以现在讲到要写这么个Linux的发行版本,还真的是什么都不懂得状态。
制作Linux发行版本主要是以需求为原则对软件包其进行取舍,得到适合实际需要的Linux系统。但既然是作为一个SRTP的项目,就没有什么需求方面的约束,完全是怎么高兴就可以怎么设计的活。基本的想法就是利用比较熟悉的Fedora版本,通过软件包管理器(RedHat Package Manager),对各种软件进行挑选,去精华去糟粕。至于发行版的名称嘛,别人怎么叫是别人的事,我是觉得应该叫做"羽衣甘蓝 1.0"版,算是单纯背后的小自私吧!嘿嘿^^

至于能不能通过学校的项目审批又是另一回事了,毕竟我能做的只是尽量把"SRTP学生立项申请表"填写好,其它的就不是我能决定的了.
最后,这篇boke算是写完了,只是不知道该把它归为哪一类,虽然不算是纯技术文档,但也和技术有点关系,总之有别于"花野"里面纯煽情的文字,于是还是放在"走很长路"里,顺便说这个分类名完全copy自小若澜的space名...(若澜,老大不好,没有做好榜样啊啊...
)








