Duangw

home-gate

操作系统版本:Slackware 11.0

索引:

  1. 分区
  2. 安装一个基础系统
  3. 安装编辑器
  4. 安装zlib
  5. 安装网络工具包
  6. 设置文件缺省权限
  7. 配置网络
  8. 防火墙配置
  9. 设置内核参数
  10. 安装grub
  11. 安装新内核
  12. 配置ipsec
  13. 配置域名服务

1.分区

 

2.安装一个基础系统

同开发机设置。

参见开发机[安装一个基础系统]

 

3.安装编辑器

安装vim。

同开发机,参见开发机[安装编辑器]

 

4.安装zlib

安装zlib,该压缩包会被openssl和openssh用到。

 

5.安装网络工具包

一些用到的网络工具:

  1. n/mailx-12.1-i486-1
  2. n/tcpip-0.17-i486-39
  3. n/iptables-1.3.5-i486-2
  4. n/tcpdump-3.9.4-i486-2
  5. n/openssl-0.9.8d-i486-1
  6. n/openssh-4.4p1-i486-1

 

6.设置文件缺省权限

系统初始的umaks为0022,这个对于安全要求比较高的网关机来说,有点过宽了。将其修改为0027。

编辑/etc/profile,将umask一行修改为:

umask 027

 

7.配置网络

执行netconfig配置网络,安装虚拟机网卡模块。

机器名:home-gate

域名:copyleft.net

IP地址:

路由:

使用ping和tcpdump命令测试网络配置的正确性。

 

8.防火墙配置

从开发机获得防火墙脚本模板,home-gate作为网关,使用的是网关模板rc.iptables-gate-novpn.ref,因为现在还没有配置vpn。

# scp 10.10.20.100:/newpkg/rc.iptables-gate-novpn.ref .
# scp 10.10.20.100:/newpkg/rc.S.ref .

把模板脚本放到/etc/rc.d/目录下,改名为rc.iptables:

# mv rc.iptables-gate-novpn.ref /etc/rc.d/rc.iptables

修改/etc/rc.d/rc.S文件,在末尾添加运行rc.S.ref的内容。

模板rc.iptables-gate-novpn.ref的说明如下:

#!/bin/sh
# Start/stop/restart my iptables configuration for gate.
#

# 网关作为一个网络的枢纽,一般都是有多个接口的,比如内网、外网、dmz接口,
# 有的还配有专门的管理接口mng,虽然当前的测试环境中,home-gate只有两个接
# 口,但还是按多接口的规格进行设计。
# in: eth0(内网用eth0接口)
# out: eth1, ppp+(外网用eth1接口,如果使用了PPP,对应接口也属于外网)
# dmz: eth2(dma网络使用eth2)
# mng: eth3(管理网络使用eth3接口)

start() {
## filter table begin:

iptables -F

# 缺省策略设置为禁止一切数据:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# 对于本地loopback接口,不做限制:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 虽然分片包有存在的理由,但在当今的网络现状下,已经很少了。分片出现更多
# 的是源于攻击,所以禁止分片包:
iptables -A INPUT -f -j DROP
iptables -A FORWARD -f -j DROP

# 允许网关可以访问任何地方,这种做法是值得商榷的。这里如此做是为了方便测
# 试,实际情况还得细细琢磨。
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED \
-j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 针对各种网络数据流向定义相应的链:
iptables -N in-IN(处理从内网进入网关的数据)
iptables -N in-out-FOR(处理内网经过网关进入外网的数据)
iptables -N in-dmz-FOR(处理内网经过网关进入dmz的数据)
iptables -N in-mng-FOR(处理内网经过网关进入mng的数据)
iptables -N in-OUT(处理从网关进入内网的数据)

iptables -N out-IN(处理从外网进入网关的数据)
iptables -N out-in-FOR(处理外网经过网关进入内网的数据)
iptables -N out-dmz-FOR(处理外网经过网关进入dmz的数据)
iptables -N out-mng-FOR(处理外网经过网关进入mng的数据)
iptables -N out-OUT(处理从网关进入外网的数据)

iptables -N dmz-IN(处理从dmz进入网关的数据)
iptables -N dmz-in-FOR(处理dmz经过网关进入内网的数据)
iptables -N dmz-out-FOR(处理dmz经过网关进入外网的数据)
iptables -N dmz-mng-FOR(处理dmz经过网关进入mng的数据)
iptables -N dmz-OUT(处理从网关进入dmz的数据)

iptables -N mng-IN(处理从mng进入网关的数据)
iptables -N mng-in-FOR(处理mng经过网关进入内网的数据)
iptables -N mng-out-FOR(处理mng经过网关进入外网的数据)
iptables -N mng-dmz-FOR(处理mng经过网关进入dmz的数据)
iptables -N mng-OUT(处理从网关进入mng的数据)

# 根据如上说明,把数据定义到相应的链,以后就不用再关心具体的网络接口,
# 可以更专注于功能上:
iptables -A INPUT -i eth0 -j in-IN
iptables -A FORWARD -i eth0 -o eth1 -j in-out-FOR
iptables -A FORWARD -i eth0 -o ppp+ -j in-out-FOR
iptables -A FORWARD -i eth0 -o eth2 -j in-dmz-FOR
iptables -A FORWARD -i eth0 -o eth3 -j in-mng-FOR
iptables -A OUTPUT -o eth0 -j in-OUT

iptables -A INPUT -i eth1 -j out-IN
iptables -A INPUT -i ppp+ -j out-IN
iptables -A FORWARD -i eth1 -o eth0 -j out-in-FOR
iptables -A FORWARD -i ppp+ -o eth0 -j out-in-FOR
iptables -A FORWARD -i eth1 -o eth2 -j out-dmz-FOR
iptables -A FORWARD -i ppp+ -o eth2 -j out-dmz-FOR
iptables -A FORWARD -i eth1 -o eth3 -j out-mng-FOR
iptables -A FORWARD -i ppp+ -o eth3 -j out-mng-FOR
iptables -A OUTPUT -o eth1 -j out-OUT
iptables -A OUTPUT -o ppp+ -j out-OUT

iptables -A INPUT -i eth2 -j dmz-IN
iptables -A FORWARD -i eth2 -o eth0 -j dmz-in-FOR
iptables -A FORWARD -i eth2 -o eth1 -j dmz-out-FOR
iptables -A FORWARD -i eth2 -o ppp+ -j dmz-out-FOR
iptables -A FORWARD -i eth2 -o eth3 -j dmz-mng-FOR
iptables -A OUTPUT -o eth2 -j dmz-OUT

iptables -A INPUT -i eth3 -j mng-IN
iptables -A FORWARD -i eth3 -o eth0 -j mng-in-FOR
iptables -A FORWARD -i eth3 -o eth1 -j mng-out-FOR
iptables -A FORWARD -i eth3 -o ppp+ -j mng-out-FOR
iptables -A FORWARD -i eth3 -o eth2 -j mng-dmz-FOR
iptables -A OUTPUT -o eth3 -j mng-OUT

# 从现在开始,就可以根据需要定义具体的规则。
# 比如,只允许使用ssh连接网关,而且只能在内网接口和mng接口,则如下定义:
# (相应的应答数据已经包含在前面:
# "iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED \
-j ACCEPT"
# 里了,所以这里没有再定义对应的in-OUT和mng-OUT。)
iptables -A in-IN -p tcp --dport ssh -m state \
--state NEW -j ACCEPT
iptables -A mng-IN -p tcp --dport ssh -m state \
--state NEW -j ACCEPT

# 除了外网,允许其余网络的机器给网关发ping数据包:
iptables -A in-IN -p icmp --icmp-type echo-request -j ACCEPT
iptables -A dmz-IN -p icmp --icmp-type echo-request -j ACCEPT
iptables -A mng-IN -p icmp --icmp-type echo-request -j ACCEPT

# other
# 外网访问本地网络一般都是受限的,网关要阻止外网对内网的肆意访问,但对
# 内网访问外网,外网返回的应答数据则要允许通过,相应的,内网与外网的正
# 常数据流也要允许通过。
# 此外,一些关联(related)的连接也要允许。最明显的如ftp协议,在ftp的port
# 模式下,外网服务器要通过自身ftp-data端口连接内网机器的某个端口进行数据
# 传输,这就是外网对内网的related;在ftp的passive模式下,内网要连接外网
# 某个临时端口进行数据传输,这就是内网对外网的related。
iptables -A out-in-FOR -m state --state ESTABLISHED,RELATED \
-j ACCEPT
iptables -A in-out-FOR -m state --state ESTABLISHED,RELATED \
-j ACCEPT

# 内网对外网的访问,比如允许内网ping外网的机器:
iptables -A in-out-FOR -p icmp --icmp-type echo-request \
-j ACCEPT

## filter table end.

# 以上部分只是filter部分的内容,如果有NAT方面的需求,则在下面接着定义。
## nat table begin:

#iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

## nat table end.
}

resume_all() {

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

}

stop() {
## filter table begin:

iptables -F

# 删除所有定义的链:
iptables -X in-IN
iptables -X in-out-FOR
iptables -X in-dmz-FOR
iptables -X in-mng-FOR
iptables -X in-OUT

iptables -X out-IN
iptables -X out-in-FOR
iptables -X out-dmz-FOR
iptables -X out-mng-FOR
iptables -X out-OUT

iptables -X dmz-IN
iptables -X dmz-in-FOR
iptables -X dmz-out-FOR
iptables -X dmz-mng-FOR
iptables -X dmz-OUT

iptables -X mng-IN
iptables -X mng-in-FOR
iptables -X mng-out-FOR
iptables -X mng-dmz-FOR
iptables -X mng-OUT

## filter table end.
 
## nat table begin:

iptables -t nat -F

## nat table end.
}

case "$1" in
'start')
  start
  ;;
'stop')
  stop
  resume_all
  ;;
'restart')
  stop
  start
  ;;
*)
  echo "usage $0 start|stop|restart"
esac

在将要进行的测试中,需要允许内网机器访问外网的http和ftp服务,故在start()函数中增加如下规则:

# enable in access out with http,ftp
iptables -A in-out-FOR -p tcp --dport http -m state \
--state NEW -j ACCEPT
iptables -A in-out-FOR -p tcp --dport https -m state \
--state NEW -j ACCEPT
iptables -A in-out-FOR -p tcp --dport ftp -m state \
--state NEW -j ACCEPT

测试分NAT和非NAT两种进行。当要使用NAT时,把start()函数末尾的如下规则取消注释即可:

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

要了解其他相关信息,可参见开发机[防火墙配置]

 

9.设置内核参数

从开发机获得模板rc.sysctl.ref

# scp 10.10.20.100:/newpkg/rc.sysctl.ref .
# scp 10.10.20.100:/newpkg/rc.M.ref .

把模板文件复制到/etc/rc.d/目录下,改名为rc.sysctl:

# mv rc.sysctl.ref /etc/rc.d/rc.sysctl

编辑/etc/rc.d/rc.M,将rc.M.ref内容加到rc.inet2的前面。

要了解详细信息,可参见开发机[设置一些内核参数]

除了上述参数,网关做为交通枢纽,还需要打开转发功能,这需要设置内核参数/proc/sys/net/ipv4/ip_forward。Slackware本身已经提供了一个脚本/etc/rc.d/rc.ip_forward,所以没有在rc.sysctl中添加这个参数。

要打开转发功能,只需要使rc.ip_forward脚本可执行:

# chmod u+x /etc/rc.d/rc.ip_forward

 

10.安装grub

同home-work设置。

参见home-work[安装grub]

 

11.安装新内核

同home-work设置。

参见home-work[安装新内核]

 

12.配置ipsec

(1).安装内核

从开发机获得支持ipsec的内核和软件包:

# scp 10.10.20.100:/newpkg/kernel/2.4.34.2-thin-klips/* .

内核的安装和引导配置与前面普通内核无二,注意不要覆盖原来的内核模块目录。

此外,多安装一个软件包:

# installpkg openswan-2.4.7-i386-1.tgz

重启,看新内核是否正常工作。

执行如下命令:

# ipsec --version
Linux Openswan 2.4.7 (klips)
See `ipsec --copyright` for copyright information.

显示如上,则表示内核安装正确。

(2).安装额外软件包

openswan的运行需要一些软件包的支持:

(3).初始运行

虽然现在还没有具体配置,但已经可以启动ipsec了,可以借此检验一下配置环境是否正确:

# /etc/rc.d/ipsec start
ipsec_setup: Starting Openswan IPsec 2.4.7...
ipsec_setup: WARNING: changing route filtering on eth1 (changing 
/proc/sys/net/ipv4/conf/eth1/rp_filter from 1 to 0)

上面的警告跟我们在sysctl中配置的一个参数有关,ipsec会自动关闭它,不影响。

执行如下命令进行检查:

# ipsec verify
Checking your system to see if IPsec got ...:
Version check and ipsec on-path                       [OK]
Linux Openswan 2.4.7 (klips)
Checking for IPsec support in kernel                  [OK]
Checking for RSA private key (/etc/ipsec.secrets)     [OK]
Checking that pluto is running                        [OK]
Two or more interfaces found, checking IP forwarding  [OK]
Checking NAT and MASQUERADEing                        [OK]
Checking for 'ip' command                             [OK]
Checking for 'iptables' command                       [OK]
Opportunistic Encryption Support                      [DISABLED]

检查完毕,关闭ipsec:

# /etc/rc.d/ipsec stop
ipsec_setup: Stopping Openswan IPsec...

(4).配置tunnels

这里配置两条tunnel,一个是host-to-host,用于home-gate和away-gate两个网关之间的通信;另一个是subnet-to-subnet,用于home子网和away子网之间的通信。

在配置文件/etc/ipsec.conf中添加如下内容:

conn host-to-host
	left=192.168.0.50
	right=172.16.0.50
	type=tunnel
	leftrsasigkey=0sAQONhe ......
	rightrsasigkey=0sAQNs7y9/ykc2......
	auto=start

conn subnet-to-subnet
	left=192.168.0.50
	leftsubnet=10.10.20.0/24
	right=172.16.0.50
	rightsubnet=10.10.40.0/24
	type=tunnel
	leftrsasigkey=0sAQONhe ......
	rightrsasigkey=0sAQNs7y9/ykc2......
	auto=start

配置文件写好后,传到away-gate上,两边要一致。

其中的leftrsasigkey在home-gate上获得,使用如下命令:

# ipsec showhostkey --left

rightrsasigkey在away-gate上获得,使用命令:

# ipsec showhostkey --right

这里left/right都是获得本机的公钥,实际内容是一样的。

把输出的公钥内容(很长)粘贴到ipsec.conf中。

(5).修改防火墙

之前的iptables脚本并没有考虑vpn功能,现在要增加对ipsec的支持,从开发机获得新模板rc.iptables-gate.ref

# cd /etc/rc.d
# mv rc.iptables rc.iptables-novpn
# scp 10.10.20.100:/newpkg/rc.iptables-gate.ref .
# mv rc.iptables-gate.ref rc.iptables

两个模板最大的不同,就在于启动ipsec后,会增加新的网络接口如ipsec0、ipsec1等,从而需要针对这些新接口制定规则。

另一个重大区别是,ipsec需要开放UDP 500端口和ESP(50)协议。

同时也启用NAT,因为现在模拟的是两个通过vpn连接起来的内部网络,而这些内部网络地址是不会出现在外网中的。

下面是模板rc.iptables-gate.ref的内容:(与rc.iptables-gate-novpn.ref相同的地方不再注释)

#!/bin/sh
# Start/stop/restart my iptables configuration for gate.
#

# interface summary:
#	in:	eth0
#	out:	eth1, ppp+
#	dmz:	eth2
#	mng:	eth3
#	vpn:	ipsec+(新增的网络接口)

start() {
## filter table begin:

iptables -F

# default policy
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# enable all lookback packets
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# disable all fragment packets
iptables -A INPUT -f -j DROP
iptables -A FORWARD -f -j DROP

# enable I access anywhere and response messages
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED \
-j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED \
-j ACCEPT

# 开放UDP500端口和ESP(50):(这里使用地址和端口加强安全性)
iptables -A INPUT -i eth1 -p udp -s 172.16.0.50 --sport 500 \
  -d 192.168.0.50 --dport 500 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eth1 -p 50 -s 172.16.0.50 -d 192.168.0.50 \
  -m state --state NEW -j ACCEPT

# 针对vpn增加了对应的链:
iptables -N in-IN
iptables -N in-out-FOR
iptables -N in-dmz-FOR
iptables -N in-mng-FOR
iptables -N in-vpn-FOR(新增)
iptables -N in-OUT

iptables -N out-IN
iptables -N out-in-FOR
iptables -N out-dmz-FOR
iptables -N out-mng-FOR
iptables -N out-vpn-FOR(新增)
iptables -N out-OUT

iptables -N dmz-IN
iptables -N dmz-in-FOR
iptables -N dmz-out-FOR
iptables -N dmz-mng-FOR
iptables -N dmz-vpn-FOR(新增)
iptables -N dmz-OUT

iptables -N mng-IN
iptables -N mng-in-FOR
iptables -N mng-out-FOR
iptables -N mng-dmz-FOR
iptables -N mng-vpn-FOR(新增)
iptables -N mng-OUT

iptables -N vpn-IN(新增)
iptables -N vpn-in-FOR(新增)
iptables -N vpn-out-FOR(新增)
iptables -N vpn-dmz-FOR(新增)
iptables -N vpn-mng-FOR(新增)
iptables -N vpn-OUT(新增)

# jump to new chains
iptables -A INPUT -i eth0 -j in-IN
iptables -A FORWARD -i eth0 -o eth1 -j in-out-FOR
iptables -A FORWARD -i eth0 -o ppp+ -j in-out-FOR
iptables -A FORWARD -i eth0 -o eth2 -j in-dmz-FOR
iptables -A FORWARD -i eth0 -o eth3 -j in-mng-FOR
iptables -A FORWARD -i eth0 -o ipsec+ -j in-vpn-FOR(新增)
iptables -A OUTPUT -o eth0 -j in-OUT

iptables -A INPUT -i eth1 -j out-IN
iptables -A INPUT -i ppp+ -j out-IN
iptables -A FORWARD -i eth1 -o eth0 -j out-in-FOR
iptables -A FORWARD -i ppp+ -o eth0 -j out-in-FOR
iptables -A FORWARD -i eth1 -o eth2 -j out-dmz-FOR
iptables -A FORWARD -i ppp+ -o eth2 -j out-dmz-FOR
iptables -A FORWARD -i eth1 -o eth3 -j out-mng-FOR
iptables -A FORWARD -i ppp+ -o eth3 -j out-mng-FOR
iptables -A FORWARD -i eth1 -o ipsec+ -j out-vpn-FOR(新增)
iptables -A FORWARD -i ppp+ -o ipsec+ -j out-vpn-FOR(新增)
iptables -A OUTPUT -o eth1 -j out-OUT
iptables -A OUTPUT -o ppp+ -j out-OUT

iptables -A INPUT -i eth2 -j dmz-IN
iptables -A FORWARD -i eth2 -o eth0 -j dmz-in-FOR
iptables -A FORWARD -i eth2 -o eth1 -j dmz-out-FOR
iptables -A FORWARD -i eth2 -o ppp+ -j dmz-out-FOR
iptables -A FORWARD -i eth2 -o eth3 -j dmz-mng-FOR
iptables -A FORWARD -i eth2 -o ipsec+ -j dmz-vpn-FOR(新增)
iptables -A OUTPUT -o eth2 -j dmz-OUT

iptables -A INPUT -i eth3 -j mng-IN
iptables -A FORWARD -i eth3 -o eth0 -j mng-in-FOR
iptables -A FORWARD -i eth3 -o eth1 -j mng-out-FOR
iptables -A FORWARD -i eth3 -o ppp+ -j mng-out-FOR
iptables -A FORWARD -i eth3 -o eth2 -j mng-dmz-FOR
iptables -A FORWARD -i eth3 -o ipsec+ -j mng-vpn-FOR(新增)
iptables -A OUTPUT -o eth3 -j mng-OUT

iptables -A INPUT -i ipsec+ -j vpn-IN(新增)
iptables -A FORWARD -i ipsec+ -o eth0 -j vpn-in-FOR(新增)
iptables -A FORWARD -i ipsec+ -o eth1 -j vpn-out-FOR(新增)
iptables -A FORWARD -i ipsec+ -o ppp+ -j vpn-out-FOR(新增)
iptables -A FORWARD -i ipsec+ -o eth2 -j vpn-dmz-FOR(新增)
iptables -A FORWARD -i ipsec+ -o eth3 -j vpn-mng-FOR(新增)
iptables -A OUTPUT -o ipsec+ -j vpn-OUT(新增)

# enable ssh for management in eth0,eth3
iptables -A in-IN -p tcp --dport ssh -m state \
--state NEW -j ACCEPT
iptables -A mng-IN -p tcp --dport ssh -m state \
--state NEW -j ACCEPT

# enalbe LAN ping me
iptables -A in-IN -p icmp --icmp-type echo-request -j ACCEPT
iptables -A dmz-IN -p icmp --icmp-type echo-request -j ACCEPT
iptables -A mng-IN -p icmp --icmp-type echo-request -j ACCEPT

# enalbe vpn ping me(新增)
#iptables -A vpn-IN -p icmp --icmp-type echo-request -j ACCEPT

# other
# enable out respond in
iptables -A out-in-FOR -m state --state ESTABLISHED,RELATED \
-j ACCEPT
iptables -A vpn-in-FOR -m state --state ESTABLISHED,RELATED \
-j ACCEPT(新增)
iptables -A in-out-FOR -m state --state ESTABLISHED,RELATED \
-j ACCEPT
iptables -A in-vpn-FOR -m state --state ESTABLISHED,RELATED \
-j ACCEPT(新增)

# enable in ping out
iptables -A in-out-FOR -p icmp --icmp-type echo-request -j ACCEPT

# enable in ping vpn(新增)
#iptables -A in-vpn-FOR -p icmp --icmp-type echo-request -j ACCEPT

# enable vpn ping in(新增)
#iptables -A vpn-in-FOR -p icmp --icmp-type echo-request -j ACCEPT

## filter table end.

## nat table begin:(打开NAT)

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

## nat table end.

}

resume_all() {

# enable all
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

}

stop() {

## filter table begin:

iptables -F

# remove all chains
iptables -X in-IN
iptables -X in-out-FOR
iptables -X in-dmz-FOR
iptables -X in-mng-FOR
iptables -X in-vpn-FOR
iptables -X in-OUT

iptables -X out-IN
iptables -X out-in-FOR
iptables -X out-dmz-FOR
iptables -X out-mng-FOR
iptables -X out-vpn-FOR
iptables -X out-OUT

iptables -X dmz-IN
iptables -X dmz-in-FOR
iptables -X dmz-out-FOR
iptables -X dmz-mng-FOR
iptables -X dmz-vpn-FOR
iptables -X dmz-OUT

iptables -X mng-IN
iptables -X mng-in-FOR
iptables -X mng-out-FOR
iptables -X mng-dmz-FOR
iptables -X mng-vpn-FOR
iptables -X mng-OUT

iptables -X vpn-IN
iptables -X vpn-in-FOR
iptables -X vpn-out-FOR
iptables -X vpn-dmz-FOR
iptables -X vpn-mng-FOR
iptables -X vpn-OUT

## filter table end.

## nat table begin:

iptables -t nat -F

## nat table end.

}


case "$1" in
'start')
	start
	;;
'stop')
	stop
	resume_all
	;;
'restart')
	stop
	start
	;;
*)
	echo "usage $0 start|stop|restart"
esac

(6).修改route的路由表

由于启动了NAT,所以route上增加的两条路由可以取消了。详情可以参见:route[配置网络]

(7).启动tunnels

现在可以启动了,在home-gate和away-gate上执行:

# /etc/rc.d/ipsec start

启动完毕,查看tunnels状态:

# ipsec eroute
0  10.10.20.0/24   -> 10.10.40.0/24  => tun0x1007@172.16.0.50
0  192.168.0.50/32 -> 172.16.0.50/32 => tun0x1008@172.16.0.50

正常会显示两条隧道。

然而,现在虽然有了加密通道,却几乎啥也不能做,因为防火墙阻止了访问。下面,需要针对具体的应用增加相应的iptables规则。

例1

在host-to-host隧道中,要测试home-gate和away-gate之间相互ping,需要对rc.iptables中的这条规则取消注释:

# enalbe vpn ping me
iptables -A vpn-IN -p icmp --icmp-type echo-request -j ACCEPT

该规则在subnet-to-subnet隧道中away-work ping home-gate的内网地址10.10.20.1时也用到。

例2

在subnet-to-subnet隧道中,让away-work ping home-work,则需要打开这条规则:

# enable vpn ping in
iptables -A vpn-in-FOR -p icmp --icmp-type echo-request -j ACCEPT

反过来,home-work ping away-work,则需要:

# enable in ping vpn
iptables -A in-vpn-FOR -p icmp --icmp-type echo-request -j ACCEPT

简单的说就是让网关转发相应的数据。

注意,home-gate和away-gate是对称的,上述的修改需要在两个网关上都进行才有效。

可以使用tcpdump监视各个网络接口,加深对整个过程的理解。

 

13.配置域名服务

在网关中运行DNS服务不是一个好主意。最好在本地子网有一台专门的域名服务器。这里配置的DNS只是一个高速缓存服务器,代理客户机进行域名解析工作。这样,客户机可以把网关和DNS统一设置为一个地址,方便使用。

(1).软件包

如果在上一步ipsec中没有安装bind软件包,则进行安装:

(2).主配置

软件包提供的/etc/named.conf就是针对一个缓存服务器的,可以完全满足要求,不需要修改。内容如下:

options {
    directory "/var/named";
    /*
     * If there is a firewall between you and nameservers you want
     * to talk to, you might need to uncomment the query-source
     * directive below.  Previous versions of BIND always asked
     * questions using port 53, but BIND 8.1 uses an unprivileged
     * port by default.
     */
    // query-source address * port 53;
};

//
// a caching only nameserver config
//
zone "." IN {
        type hint;
        file "caching-example/named.ca";
};
 
zone "localhost" IN {
        type master;
        file "caching-example/localhost.zone";
        allow-update { none; };
};
 
zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "caching-example/named.local";
        allow-update { none; };
};

(3).根服务器文件

作为实际的服务器,可以不修改named.ca文件,直接使用,必要时到互联网下载最新的版本即可。

也可以把根服务器设置为ISP提供的域名服务器,如ADSL上网中电信提供的地址。由于测试环境没有实际与互联网连接,所以采用这种方式,把out-server的域名服务器作为根服务器。

编辑/var/named/catching-example/named.ca:

.                     3600000  IN  NS    A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.   3600000      A     172.16.0.10
;
; End of File

只保留一个根服务器:172.16.0.10,就是out-server。

(4).其他设置

配置完毕,使rc.bind脚本可执行:

# chmod u+x /etc/rc.d/rc.bind

现在可以取消/etc/hosts中的ip地址对应关系了:

#10.10.20.1             home-gate.copyleft.net home-gate

编辑/etc/resolv.conf,该文件可以为空,为方便使用,可增加一行:

search copyleft.net

启动bind服务器,执行nslookup进行解析测试,看工作是否正常。

(5).防火墙设置

修改防火墙配置/etc/rc.d/rc.iptables,为本地网络提供dns解析服务:

# enable domain
iptables -A in-IN -p udp --dport domain -m state \
--state NEW -j ACCEPT