home-gate
操作系统版本:Slackware 11.0
索引:
1.分区
- /dev/hda1, /boot, 100M
- /dev/hda2, swap, 256M
- /dev/hda3, /, 其他
2.安装一个基础系统
同开发机设置。
3.安装编辑器
安装vim。
同开发机,参见开发机[安装编辑器]
4.安装zlib
安装zlib,该压缩包会被openssl和openssh用到。
- l/zlib-1.2.3-i486-1
5.安装网络工具包
一些用到的网络工具:
- n/mailx-12.1-i486-1
- n/tcpip-0.17-i486-39
- n/iptables-1.3.5-i486-2
- n/tcpdump-3.9.4-i486-2
- n/openssl-0.9.8d-i486-1
- n/openssh-4.4p1-i486-1
6.设置文件缺省权限
系统初始的umaks为0022,这个对于安全要求比较高的网关机来说,有点过宽了。将其修改为0027。
编辑/etc/profile,将umask一行修改为:
umask 027
7.配置网络
执行netconfig配置网络,安装虚拟机网卡模块。
机器名:home-gate
域名:copyleft.net
IP地址:
- eth0:10.10.20.1/24
- eth1:192.168.0.50/24
路由:
- GETWAY:192.168.0.1
使用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设置。
11.安装新内核
同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的运行需要一些软件包的支持:
- n/iproute2-2.6.16_060323-i486-1
- d/perl-5.8.8-i486-3
- l/glibc-2.3.6-i486-6(用到locale)
- n/bind-9.3.2_P1-i486-1(这里可选)
(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软件包,则进行安装:
- bind-9.3.2_P1-i486-1
(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