TA的每日心情 | 无聊 2015-1-16 14:36 |
---|
签到天数: 3 天 [LV.2]偶尔看看I
|
使用FreeBSD配置基于ADSL的VPN防火墙(IPFILTER)网关 ; |* l( [/ J1 h/ @+ z1 q4 u4 P
陈永光(Charlin) < charlin@88vip.com >
$ h" W6 v* t; x* q7 h+ l操作系统:FreeBSD5.1
8 D" J+ S y( y8 `, ~+ z2 RIPFilter: v3.4.31* @9 P8 R& n$ O. [5 w) v9 {) }& n
MPD:v3.13
& `1 E) h' J' }. r! r! S3 q3 }) K( W! ]$ u9 p
我的目的是做一台ADSL拨号网关,这个网关上由MPD作为VPN网关的守护进程,使用PPTP协议作为传输协议,由于这台机器上有samba服务器,所以我无法开放我的所有端口,我必须封锁所有不需要的端口。正因为这样花了很长时间研究PPTP协议到底需要通过防火墙上的那些端口和那些协议。配置的目的已经告诉大家了,下面是配置的过程。
) @. p0 [, p' M9 }首先从ppp拨ADSL说起,如果您对于使用ppp连接PPPoE(也就是ADSL使用的连接方式)已经非常熟悉了,那就可以跳过这一段直接看后面的。- H5 \3 n8 k8 s# D# u. @
使用ppp连接PPPoE是非常简单的,FreeBSD在安装好之后你会在/etc/ppp/目录下看到一个叫做ppp.conf的文件,你把这个文件修改成下面的样子就可以连接PPPoE了,文件内容如下:
5 Q1 u. R/ r8 o- Y6 L1 P, E* R( O% Edefault:
- g* q# ?$ t1 n1 B/ _8 q# PPP over Ethernet
3 o/ Z. G5 P* A# n8 U1 Z2 qset device PPPoE:rl0 # rl0是联接ADSL的设备号+ J- C* {: a$ [, x4 T* \8 l. ^
set speed sync7 r1 [5 [2 v W9 X4 k
set mru 1492! v/ B7 N2 N1 ]
set mtu 1492
: Q( W- N. F; f3 Oset ctsrts off4 i& t6 @, m q3 g# [
# monitor line quality0 D% O( ]) Z+ b0 b6 H/ {
enable lqr
' }* X- \0 {# f N! P2 m9 j9 `4 {4 O# log just a bit1 `4 ?) W4 n% b5 Y5 ^; t
set log phase tun/ ~- q2 b; M4 e7 U+ M
# insert default route upon connection$ B% H1 J$ B+ \6 k7 E- E
add default HISADDR6 R. ?) U, N- W* C. a7 ~) _/ f
# download /etc/resolv.conf, y2 u6 g# v2 _* {" W
enable dns
/ d2 U4 k" M! }% Q _$ e" [set authname xxxxxxxx # xxxxxxxx是ADSL账号
# e; Q* [$ y( I U0 _5 \8 Nset authkey ******* #*******是ADSL密码 Z% b: }/ V# Y% a4 e
第一部分是设置日志的方式和一些默认信息set device PPPoE:后面需要改成你的网卡的驱动,我的是Realtek的8139,所以就是rl0了,下面是设置最大发送/接受单元,PPPoE默认是1492。enable dns是打开从ISP服务端接收分配的DNS,后面是设置你的PPPoE帐号信息,请务必添加。
$ W3 r* [, \7 \* p G9 X
$ ?+ J1 p& b0 O. |! B注意:标签后面的语句要有缩进,至少缩进一个空格,在帖子里可能看不到,大家要注意!
/ q. j7 ]$ ?9 _7 A Q
: ~: g; U) U7 B% W/ U1 d5 |修改过配置文件之后你就可以用ppp -ddial来试验一下,如果连接上了网络就没问题了,在/etc/rc.local文件中添加下面一句就可以在开机的时候启动ppp拨号:
5 b0 \3 ]% k6 _/usr/sbin/ppp –ddial! o4 \, d S$ ]1 }1 ~
其中ppp的方式,可选的有auto ddial background等等,具体的信息可以从man ppp中获得。以上就是PPP拨PPPoE的配置,可以看到非常的简单。
9 o! i% I m, A: I* l& v. I/ ~1 t- D9 F0 r6 r3 s( U# J
下面一部分是启动IPFILTER的防火墙,这个需要修改默认得内核设置,同时使用MPD也需要对内核进行修改,所就在这里同时都修改了。重新编译内核需要经过如下步骤,首先进入/usr/src/sys/i386/conf/目录,里面有一个GENERIC,具体的说明信息我就不赘述了,我只讲一下我修改内核的过程。9 O1 |2 r7 _' U* R0 g
首先
* _9 S- K9 {6 n2 f& `cp GENERIC ipfilter
# C, n( \; O- Q, k, `! b1 e编辑mykern增加如下的部分:6 ^$ e: |0 Y( k# d) Q" L/ _) V8 k& T
options NETGRAPH
2 D9 p: [/ S I. J5 J3 T0 q0 r' noptions NETGRAPH_PPPOE5 U8 C; g; k, W4 r: z* M. ]
options NETGRAPH_SOCKET1 m; R; v; x: F( D
options NETGRAPH_ETHER
. C- T( ~: d/ g! X( N3 ]options IPSTEALTH
$ G: p" [: e: H7 W Woptions IPFILTER0 L8 s% T$ @, \9 X1 l+ q3 t, [
options IPFILTER_LOG
3 m0 i$ z) T3 h1 ~) d4 Ooptions IPFILTER_DEFAULT_BLOCK( r a/ N5 W1 R u
退出编辑器2 L" q$ s9 c. [1 L
config ipfilter3 {8 D8 P1 x% _ a
cd ../compile/ipfilter
1 z& s) o9 ^* D% R& R4 y+ lmake depend0 a. P j3 R& v! Y# m" A0 `4 v
make% s: F* ~7 O8 d* |& O
make install
& [9 P# x' M: M5 ]然后重新启动机器内核的更新就已经完成了。! E! M' w" y( z( g: S6 y
9 S# u2 t/ g" x9 @! J1 [* R' @6 b这样IPFILTER的安装就已经完成了,我们先不打开防火墙,我们先配置mpd来建立PPTP的服务器。关于MPD的安装其实非常简单,你可以自己手动编译,但我还是推荐大家用ports来安装,因为我实在是想不出什么理由来不用ports安装:)如果你安装了ports到你的硬盘上,你通过下列步骤就可以完成mpd的安装了! g2 d0 m+ ]) l; k& A
cd /usr/ports/net/mpd
7 _- @7 U3 b/ X! m2 gmake install# {* [# g Y1 w
make clean+ I8 b3 N8 X: i6 ~0 d
安装完毕之后,ports会自动创建/usr/local/etc/mpd目录并把配置文件的样本存放在这个目录里面,可以通过修改已有的配置文件样本来完成对mpd的配置,以mpd.conf.sample为例,首先cp mpd.conf.sample mpd.conf然后修改下面的两个部分:5 Y D! R* U" `" e/ d% M: }3 d( m: c( y
default:
# r+ P. T6 \. _2 j h1 k5 zload pptp
5 s7 S. `$ V3 ^2 s( k$ t0 c* L8 T7 E
2 {% v% S$ c7 C# @0 ~/ C9 f- j. v' M
pptp:, c# N9 P/ k& Z9 @9 M2 Y4 {8 O) m( l
new -i ng0 pptp pptp
3 i8 Q0 c+ n, k) R/ tset iface disable on-demand
2 k, k/ B6 s# P) j. G$ x( Z1 Pset iface enable proxy-arp
3 r( \ v6 w6 p. H4 [% e$ Oset iface idle 1800- ~/ W8 }% G$ Q: T
set bundle enable multilink& m4 [0 ?# a b2 ~! N
set link yes acfcomp protocomp
, n5 g2 R0 h- Z o3 dset link no pap chap
: k% }/ G2 c) y$ Q" A" |. Q0 J- O; qset link enable chap
2 r8 ^5 T5 I' i5 X5 |) k% x4 aset link keep-alive 10 604 d4 |0 X; d9 W3 l+ h
set link mtu 1460' D$ \( {3 U$ |8 c* L5 s! t R
set ipcp yes vjcomp$ X6 v" s+ T" @" {1 v( b
set ipcp ranges 192.168.1.1/32 192.168.1.50/32$ r9 ^7 G l4 Q& r
set ipcp dns 192.168.1.3. Q9 j- Z& j* S. l* Y# |) S* N8 b9 [
set ipcp nbns 192.168.1.4$ C! J* Q* ]6 I% ?
#; a4 b# C' q w2 N* p8 ~
# The five lines below enable Microsoft Point-to-Point encryption
6 {3 n3 L+ |% F) {0 G+ g l' A# (MPPE) using the ng_mppc( netgraph node type.
% O; X' Q$ i& b7 j#
* M3 ~/ ]3 h) Z1 ?8 A) Eset bundle enable compression7 J3 }/ H6 V6 u" ~
set ccp yes mppc
, e* _% Z0 A2 X2 f5 S7 l7 n, z( kset ccp yes mpp-e40
& l6 Y8 @- b% v; E9 X" w6 ?set ccp yes mpp-e128. W& J2 m0 ]( a1 ?
set ccp yes mpp-stateless1 Q- {8 D5 O @! J7 o+ k
这个是sample里面的默认配置,下面对于需要修改的部分做出说明实际上我们需要修改只有三行,就是下面三行
9 V" F% [2 r% u" g+ Cset ipcp ranges 192.168.1.1/32 192.168.1.50/32
. s7 X7 B8 q1 w8 F6 n5 Sset ipcp dns 192.168.1.3
$ |4 l& G% E, T3 m& Rset ipcp nbns 192.168.1.4
9 p- _. X5 L# o' T o0 R. b第一行是设置你的本地VPN网关的地址,如果你是像我一样用NAT来区分内外网的话这个应该是网关的内网地址,后面的是对方拨入以后将会在内网获得的地址,这个地址倒是没有什么特殊要求,就是首先这个地址需要和内网处于一个网段,否则访问不了,第二后面可以设置一个掩码,来控制这个地址可能的范围,如果这个地址被占用了,将会分配一个再限定范围内的地址给客户端,这个范围由"/"后面的掩码来控制。0 H$ F7 J, }$ h" H
5 J, B+ }% X' E R# c1 ~1 w第二行是指定你内网使用的DNS服务器的地址,注意这个将会在用户连入的时候同内网地址一起被分配给用户第三行和第二行类似,是指定Netbios服务器的地址,如果内网没有WINS服务器这行可以不写。最后我还增加了一行命令,再不增加这个命令的时候mpd看起来也是正常运转的,但是我不太放心还是加了这行加密指令
) O K; p4 j$ `& Y" t5 i% ?* M# Lset bundle enable encryption9 o" O; n: R) u
下面我们还需要cp mpd.links.sample mpd.links稍微修改一下mpd.links
7 e- y, f# c; R a4 W$ @3 hpptp:: l/ V, w* r" c( W& |, g' ?6 }
set link type pptp
( u7 s5 m2 R4 vset pptp self 1.2.3.42 k) Q) f; ~& a- e6 X
set pptp enable incoming
2 q4 U# `% u8 N6 y c6 wset pptp disable originate, J6 B0 L: w" n7 K
上面的部分里面需要修改一下set pptp self 1.2.3.4这一行,这行是指定mpd的pptp服务器绑定在那个地址上面,如果是我们现在使用ppp拨叫ADSL的情况,会遇到网络界面改变,ip地址改变的情况,就不能定义这一句,所以针对我们的情况,我们要去掉这句,其他的我们就不用改了。, K. V8 j8 _ |$ r# s8 _# `6 D
) V- E; M d" c, J当然我们还要cp mpd.secret.sample mpd.secret修改一下mpd.secret文件这个文件定义了拨入用户的用户名和密码用户名写在前面,密码写在后面用引号引起来,就像下面这样,当然还可以指定这个用户必须从那个地址或者网段来拨入,就像下面的例子:
$ u0 @* r8 e. ~3 ufred "fred-pw", e) p: z, N" V6 X0 l
joe "foobar" 192.168.1.1' Q( O' H" l! l, t8 l6 g3 n+ z5 F
bob "\x34\"foo\n" 192.168.1.10/24% z& g( ~7 x% l& b7 o2 j( l
sample文件里面还有配置多用户登陆的情况下的样本,我就不用在写了,配置是一样的改完这些之后只要运行mpd -b就可以启动了由于考虑到安全原因我没有书写启动脚本在开机的时候启动mpd,因为对于防火墙来说在没有用的时候多开一个端口就多一份危险,但是也许很多人需要在开机的时候自动运行mpd,下面我还是提供一个启动脚本给大家,可以放在/usr/local/etc/rc.d/目录下面记住要加上执行权限。6 U9 f" y7 f( f8 F7 b$ M; I, N! V
#!/bin/sh
" t, m; t! Q) Q9 h+ a- @: KPREFIX=/usr/local
7 Q5 O5 a( t. x4 jcase "$1" in
, e& t. g4 |. `0 ostart)
& } \- x# o5 d& W3 U1 {/ Rif [ -x ${PREFIX}/sbin/mpd -a -f ${PREFIX}/etc/mpd/mpd.conf ]; then( f9 T1 c, }' Q" G
${PREFIX}/sbin/mpd -b4 [2 `6 W6 W7 N" b
echo -n ' mpd '( C% `5 _ n Q3 b0 z
fi3 W7 {% j7 c3 a3 P. U. x1 D0 P& U
;;
7 j9 `4 i( i4 [2 v% u) Pstop)! f4 d) b1 x, B4 y1 q( d- P
killall mpd && echo -n ' mpd '( R) I; E; q5 D1 n4 @
;;/ [+ M+ }, Q, I8 k% H1 J
*)
& Q" x% F: y1 b7 S* Qecho "Usage: 'basename $0' {start|stop}" >&26 F0 x4 X/ Z- ~0 |- s
;;
8 h! I, }2 D5 Z6 kesac
- h+ ~; B2 A. {5 T% ~& h2 D7 R6 F5 x; `2 u! p3 L. m
exit 0+ @9 l+ J6 }! x9 H
;
5 S8 c8 ]/ ]2 Z' D下面我们要开启防火墙来测试一下了,我们开启防火墙还需要在/etc/rc.local文件中添加以下命令:
+ j# r+ \+ W- m; }" `sh /etc/adslip.sh
2 Y1 ~2 \, M3 W( ^% p" l然后再创建/etc/adslip.sh脚本:
0 Z& W0 e) V% N# S0 r代码:! ?1 ^* W/ ~9 F, f
#!/bin/sh; e! k B( Q* H, ]
###############################################################################5 V+ u! P# Z# f6 s
(未完) |
|