买了一个Apple TV3,因为香港区默认是不支持Netflix的,所以除了要用美国区的帐户登录之外,还需要让Apple的服务器看到访问的Source IP是美国的,

因此不为翻墙,而是为了SNAT,我又要配置一下VPN了,同时因为不在墙内,也不需要chnroutes之类的了,但是要Source based routing或者Multiple routing table,好让除了ATV之外的所有设备都不走VPN,

然后我想起秋香同学 @fqx 写过教程哦,然后我看了秋香同学的教程,然后我发现秋香的教程,实在是…

我还是写个清楚一点的吧,免得其他同学像我一样照着做却还要自己troubleshooting!

 

先决条件当然是有一台支持Tomato firmware的路由器,路由器上有足够的空间,或者加了个U盘,有VPN Server,有帐号,有密码,有一顆愛折腾的心神马的,然后:

1)刷一个有tun.ko的Tomato版本,同樣建議用shibby mod,選擇支持VPN的就好

http://tomato.groov.pl/?page_id=164

 

2)U盘格式化成EXT3或者FAT32或者NTFS插上去,配置把U盘挂载到/opt目录

首先登录到Tomato的管理界面,然后在USB and NAS » USB Support下勾选以下选项:

“Core USB Support” / “USB 2.0 Support” / “USB Storage Support” / “File Systems Support”(全选) / “Automount”

然后到“Administration » Scripts » Init”,把以下內容帖进去,

echo "LABEL=optware /opt ext3 defaults 1 1" >> /etc/fstab
sleep 2
insmod /lib/modules/2.6.22.19/kernel/drivers/net/tun.ko

保存,重启路由器

 

3) 配置軟件repository,

cd /opt
mkdir /tmp/harddisk/opt
wget http://wl500g-repo.googlecode.com/svn/ipkg/entware_install.sh
chmod +x ./entware_install.sh
./entware_install.sh

 

4) 安裝VPNC

opkg update
opkg install vpnc

安裝完之後可能会有vpnc-script不存在的问题,可以手动下载一下

cd /opt/sbin/
wget http://git.infradead.org/users/dwmw2/vpnc-scripts.git/blob_plain/HEAD:/vpnc-script
chmod +x vpnc-script

 

5)配置VPNC和vpncwatch

先下載vpncwatch,詳細可參考P大文章 vpncwatch 修正(外)

cd /opt/sbin
wget http://p5.gfw.io/paveo/vpncwatch

好吧,VPNC配置直接看P大 @Paveo 的教程吧,我也懒得写了,(写这个期间我从墙外撞墙被reset了,好,很好,非常好)

路由器上使用 Cisco IPSec VPN client

 

6)配置多路由表,

除了秋香同学那个不好的参考 A Bridge To Home Theater (2) 之外,好的参考在这里:

http://linux-ip.net/html/routing-tables.html

(看人家写得多好多清晰啊,秋香你真的要惭愧一下!)

 

傻瓜教程,

新建/opt/etc/vpnc/iproute2文件,貼入以下內容:

#!/bin/sh
mkdir /etc/iproute2
cp rt_tables /etc/iproute2/rt_tables
ip rule add from <SUBNET/MASK> table novpn //<SUBNET/MASK>这里可以逐个主机的写,也可以用掩码整段配置
ip route add $(nvram get wan_gateway_get) dev <INTERFACE> proto kernel scope link src $(nvram get wan_ipaddr) table novpn //<INTERFACE>是获得外网IP地址的接口,也许是ppp0,也许是vlan2,自己确认一下吧
ip route add <LOCALNET/MASK> dev br0 proto kernel scope link src  table novpn //<LOCALNET/MASK>是内网的子网和掩码,例如192.168.1.0/24,是路由器的内网IP地址,例如192.168.1.1
ip route add default via $(nvram get wan_gateway_get) dev <INTERFACE> table novpn //<INTERFACE>是获得外网IP地址的接口,也许是ppp0,也许是vlan2,自己确认一下吧
ip route flush cache

編輯完之後別忘了執行權限

chmod +/opt/etc/vpnc/iproute2

新建/opt/etc/vpnc/rt_tables文件,貼入以下內容:

255 local
254 main
253 default
200 novpn
0 unspec

然后到“Administration » Scripts » WAN up”,把以下內容帖进去,

#IPsec VPN Setting
vpncwatch -c twitter.com -p 80 -i 10 vpnc
sleep 10
service dnsmasq restart
 
#Multiple Routing Table
/opt/etc/vpnc/iproute2

嗯,打完收工!

【Update 2012.05.30】 对比起StrongSWAN,我发现用IPSec-Tools/racoon来做IPsec VPN Server能同时支持IKE Phase 1 main mode /aggressive mode,因此不管在iOS,OSX,Windows又或者DD-WRT/Tomato/Openware都可以用,具体步骤可以参考这里:

Pure IPsec VPN with IPsec-Tools/Racoon on CentOS

 

iPhone4s升级到5.1之后,jailbreak不能,Openvpn又不能在iphone上用了,于是,我决定在我的Linode上把Cisco IPsec VPN server也折腾一下,

Google一圈之后,发现在openswan和strongswan这两个option之间,openswan是没有一个比较正常的howto教怎么做的,strongswan的wiki上倒是有一个,于是我决定用strongswan,


以下的运行环境是Linode的Xen VPS,系统为CentOS 5.5


安装的过程其实还是蛮简单的,跟着官方wiki的示例一步一步往下做好了,

http://wiki.strongswan.org/projects/strongswan/wiki/InstallationDocumentation

首先去下载页面 http://download.strongswan.org/ 找到最新的版本(当前是4.6.2),下载

wget http://download.strongswan.org/strongswan-4.6.2.tar.bz2

解压

tar xjvf strongswan-4.6.2.tar.bz2; cd strongswan-4.6.2


编译之前,需要对源代码做一些小小的fix,否则会有连接48分钟后的rekey失败问题,

修正代码的来源在此 https://lists.strongswan.org/pipermail/users/2011-September/006613.html


strongswan-4.6.2/src/pluto/ipsec_doi.c

@@ -977,6 +977,18 @@

 add_pending(dup_any(whack_sock), st, c, policy, 1

 , predecessor == NULL? SOS_NOBODY : predecessor->st_serialno);

 }

+

+/* copy xauth/modecfg data from last isakmp state */

+if (predecessor)

+{

+st->st_xauth.started   = predecessor->st_xauth.started ;

+st->st_xauth.status    = predecessor->st_xauth.status ;

+st->st_modecfg.started = predecessor->st_modecfg.started ;

+DBG(DBG_CONTROL,

+DBG_log(“copy XAUTH/ModeCfg status from #%d”, predecessor->st_serialno)

+)

+        }

+

 if (predecessor == NULL)

 {

 plog(“initiating Main Mode”);

@@ -3137,6 +3149,18 @@

 st->st_doi = ISAKMP_DOI_IPSEC;

 st->st_situation = SIT_IDENTITY_ONLY; /* We only support this */

 

+/* copy xauth/modecfg data from last isakmp state */

+         struct state * predecessor = find_phase1_state(c, ISAKMP_SA_ESTABLISHED_STATES | PHASE1_INITIATOR_STATES);

+         if (predecessor)

+{

+st->st_xauth.started   = predecessor->st_xauth.started ;

+st->st_xauth.status    = predecessor->st_xauth.status ;

+st->st_modecfg.started = predecessor->st_modecfg.started ;

+DBG(DBG_CONTROL,

+DBG_log(“copy XAUTH/ModeCfg status from #%d”, predecessor->st_serialno)

+)

+        }

+

 if ((c->kind == CK_INSTANCE) && (c->spd.that.host_port != pluto_port))

 {

    plog(“responding to Main Mode from unknown peer %s:%u”


另外连接后的banner默认是”Welcome to strongSwan – the Linux VPN Solution!”, 如果看着不顺眼,可以自己改一下,

strongswan-4.6.2/src/pluto/modecfg.c


@@ -44,7 +44,7 @@
 
 #define MAX_XAUTH_TRIES         3
 
-#define DEFAULT_UNITY_BANNER”Welcome to strongSwan – the Linux VPN Solution!\n”
+#define DEFAULT_UNITY_BANNER”YOUR PREFERRED BANNER\n”
 
 /**
  * Creates a modecfg_attribute_t object

编译,有些文章说要enable cisco-quirks,但是貌似wiki上的howto是说不用的,anyway,还是enable吧,并且disable了几个不需要的option,

./configure -prefix=/usr -sysconfdir=/etc –enable-cisco-quirks –enable-openssl –enable-nat-transport –disable-mysql –disable-ldap –disable-static –enable-shared

make

make install


安装完了之后,可以根据wiki上的教程配置,

http://wiki.strongswan.org/projects/strongswan/wiki/IOS_(Apple)

根据wiki,iOS貌似只支持IKEv1,所以以下的配置都是针对IKEv1的,同时相比起证书认证,我还是更喜欢pre-shared key比较多,至少不用到处导入证书什么的,于是我们可以跳过前面的证书生成部分,直接进入配置部分 /etc/ipsec.conf


config setup

        plutostart=yes  #这个是IKEv1对应的守护进程,必须启动

        nat_traversal=yes #启用对NAT穿透的支持



conn IPSec

        keyexchange=ikev1 #使用IKE1v1

        authby=xauthpsk #相对教程用证书认证交换KEY,这里改成xauthpsk改为使用pre-shared key

        xauth=server 

        left=%defaultroute

        leftsubnet=0.0.0.0/0

        leftfirewall=yes

        right=%any

        rightsubnet=10.11.0.0/24 #这里配置客户端可分得的IP地址网段,需跟iptables的配置对应

        rightsourceip=10.11.0.0/24 #相对wiki配置示例的指定单一IP地址,这里同样配置为网段就可以多用户接入了,IP Address Pool要strongswan 4.4以上版本才支持

        pfs=no

        auto=add


配置完ipsec.conf之后,接着需要配置pre-shared key和用户名,密码,配置文件为/etc/ipsec.secrets


: PSK “YOUR RSK HERE” #这里配置PSK,注意前面的冒号是必须的

USERNAME : XAUTH “PASSWORD” #这里配置用户名和密码,中间的冒号也是必须的


最后是在iptables增加对应的策略,编辑 /etc/sysconfig/iptables

1) 允许ISAKMP和IPSec NAT Traversal数据包通过防火墙


-A INPUT -p udp –dport 500 -j ACCEPT #ISAMKP数据包

-A INPUT -p udp –dport 4500 -j ACCEPT #IPSec NAT Traversal数据包

2) NAT地址转换

-A POSTROUTING -s 10.11.0.0/24 -o eth0 -j MASQUERADE #这里的地址就是上面配置中分配给客户端的地址段

3) 数据包转发

-A FORWARD -s 10.11.0.0/24 -j ACCEPT #这里的地址就是上面配置中分配给客户端的地址段


最后重启iptables和ipsec服务即可,

service iptables restart #重启iptables服务

ipsec restart #重启ipsec服务


客户端的配置,

iOS配置时不选择Use Certificate,Group Name留空,其他填入正确内容就好~

IMG_1983


OSX,在网络设置中先添加一个VPN接口,类型为Cisco VPN

System Preferences

然后同样填入相应信息就好

System Preferences-1