Cisco packet tracer 模拟BGP的一点感受
最近因为工作关系, 需要做一些混合着3层交换, 路由, MPLS-VPN, IPSec Tunnel等环境的模拟.
因为我用GNS3实在无法完美模拟出3层交换机…所以退而求其次用了CPT, 因为最近发现更新到了7.0版本,而且CPT一直比较容易用,是我这种菜G比较喜欢的.
首先至少能用BGP了, 这个据说是5.x开始的进步算是弥补了以前连用都不能用的尴尬.
不过只能支持E-BGP不能用I-BGP这点我挺意外的…本质上没那么大差别啊..居然不支持…
然后发现手工汇率network的情况下只能配置静态到Null 0再用network宣告, 没有aggregate-address 命令.
三层路由可以直接起BGP, 如果在GNS3上只能用路由器加交换卡来模拟….虽然差不多应该不过我怕有东西不一样啊
IPSec Tunnel也比较容易就实现了…不过总觉得Cloud这个设备不太好用….最终是配了帧中继来模拟公网IP互联的….其实我想偷懒直接配公网IP互联的..
防火墙型号只有ASA-5505….因为公网互联用了FR的关系所以我没用这个架VPN…而且因为型号略旧了…跟新的那些ASA系统差别有点大…所以就算了.
总的来说,易用性一直都是CPT不灭的优势….不过相比GNS3对于设备的精确模拟来说, CPT的模拟确实有点out of date.
不过对于环境要求没有那么高只要随手能用的情况下, CPT还是挺好的…而且画图很方便…咔咔
更新一下..
最近很少更新, 主要是因为正在适应新的工作环境, 理解他们的公司文化.
说真的我很难想象在国内, 在一个相对来说比较classic的零售分销行业内, 有着这样一家思想激进的公司.
作为一个ITer, 第一次感受到了在一个非科技行业的公司内正在运作着一个理念: 我们要把一切都搬上云~
是的, 现在的公司, 整个办公软件环境是全Google化的, 这是他们全cloud化的第一步, 把整个公司的办公环境从微软的捆绑中解除了出来.
现在所有的office主力软件都已经切换到了google的office套件上去了: Gmail, Google Site, Google Online doc等等, 基本的办公环境已经完成了云化.
接着就是把微软的AD服务器系统剥离, 不再使用常规的AD管理方式, 而是放权给用户本身, 然后所有的传统的Windows server都迁移到CentOS上并运行Puppet来说自动化运维.
到了这一步, 其实本地办公环境已经完全可以云化了, 因为Linux所提供的其实只是DHCP, DNS, Radius, SMB共享等基础服务, 在带宽足够的情况下, 完全可以直接迁移到AWS上而毫无影响..
他们的下一部是把传统的商场POS系统进一步云化…
争取把所有的POS系统都做成B/S模式然后中央服务器直接AWS托管.
SAP也直接升级到NWBC的B/S版本上, 随意准备切换成纯WEB base的cloud ERP.
简直Amazing..
作为一个在国内的巨大分支, Google本身的可用性已经对我们提出了巨大的挑战!
为了保证今后的任意时间任意地点的可用性, 我们还要构思一套根据方便好用并且稳定的VPN方案.
暂时的说法是借助Juniper VPN来实现联通, 然后在本地策略上不做默认路由而只针对Google系的应用做策略路由, 然而他们还想要更好的…
一切的一切, 都是为了支撑看似在当前还略有疯狂的想法.
然而既然已经开始了, 就只有死命去做了, 不管怎么样, 至少很多好玩的事情可以去参与甚至于亲手实现, 挺不错不是嘛….
翻墙之APN篇
继续我们的翻墙大业.
之前介绍的无论是路由智能翻墙还是客户端VPN, 基本上都是需要客户端软件支持的.
然而对于用户来说, 有没有一种是可以一次设置完就不用想只管用的解决方案呢?
伟大的劳动人民+奇葩的程序猿=无敌的存在, 所以答案是必须有!
我们有了一个叫APN接入方式.
这个APN是指Anon Proxy Network, 匿名代理网络, 而不是手机信号上的access point network.
实现方式如下:
对用户来说, 需要做的只是在你的wifi或者浏览器里面配置一个PAC文件的地址.
PAC是一个代理自动配置文件.功能就是根据域名或者IP来选择使用不同的代理服务器或者直连.
这样一来呢, 就可以直接在客户端完成路径的分流.
这样的模式对于服务器端要求略高, 需要墙内墙外各有一套, 通过服务器之间的通信来实现翻墙, 而用户因为只跟墙内的跳板服务器通信, 并且墙内代理可以开Cache或者使用感受会很好.
具体表现就是: 配置简单, 自动代理无需手动开关, 速度快.
不过这个模式的缺点也是很明确的:
1.由于使用的是代理模式, 所以实际上用户跟墙内服务器的通信是明文不加密的状态的, 这在私人服务器, 自建的VPS上的时候很少有感觉, 但是, 一旦被服务商大规模使用起来了, 那么流量的汇聚就很明显, 这也是APN的服务商几乎都不长久的根本原因.
2. 在移动平台上, PAC文件的配置是无法应用在蜂窝网络的, 只能在wifi下工作, 这就意味着, 当你在无wifi状态下, APN+PAC的模式就失效了, 用户需要准备另外一套方案来解决这个问题.
3. 由于一条通道必须有2台服务器, 所以成本必然相对高, 所以一般来说价格也会略贵一点.
由于这些原因, 市场上的APN供应商一直都处于不稳定的状态, 曲径熊猫都已经完蛋, 土行孙基本已经封闭, 轻云谢公屐也相对封闭, ZPN现在是邀请测试状态.
至于让用户自己起VPS做这个..我个人是不推荐的…因为与其要准备2套方案应对不同的网络环境, 不如直接来一套Shadowsocks解决问题更加实际.
翻墙之VPN篇
之前的路由器翻墙估计看完以后很多人都觉得好麻烦,为啥要搞那么吃力呢?
因为人要折腾嘛…为了自己一点点的偷懒折腾一下才舒服呗.
不过对于大部分的普通用户而言, 无论是手机还是PC, 直接挂个VPN才是最省心的办法.
最近手上拿到一个不错的资源, 这里跟大家分享一下.
vyprvpn 不知道有人是否使用过.
我先把他们最大的优势报一下:
- 无限流量! 没错就是所有的付费帐号都没有流量限制
- 全平台! iOS, Android, Windows, Mac, 甚至于基于Tomato的路由器都可以装.
- 有自己的私有协议. 在Pro以上的套餐中, 不仅可以支持PPTP, IPsec等常见的公有协议, 还有他们自己的私有VPN协议的存在, 在最大程度上保证了安全
而且从价格上来说并不高企, 非常亲民.
注册以后可以3天免费试用, 不舒服就退就是了.
根据使用和支付习惯有几种不同的价格模式:
- 首月折扣 第一个月半价, 基础套餐只要5刀不限制流量, 不过后面就价格就没那么低了, 不过你可以再注册一个啊. 推荐对协议跟设备数量要求都很低的童鞋循环使用.
2. 年度折扣 这个其实首月半价的年度包, 适合于喜欢用基础套餐的童鞋并且想长期用不再一个个月注册的, 不过我建议想买这个的同学继续往下看.
3. Pro套餐特别优惠 这个是Pro套餐的特别优惠活动, 可以60刀买下一年的Pro级别的套餐, 从价格上来说跟上面的其实完全一样, 但是你可以多一个客户端连接多了协议的选择, 所以可以说是年度付费用户的不二之选
有需要的童鞋赶紧去试试看呗…也许这就是你需要的…
自动翻墙配置EdgeOS篇续
上一篇我们说明了使用纯VPN连接的方式来做自动翻墙.
因为VPN的方式就必然需要另外一头也有相同协议的服务器端, 这就意味着要么自己在VPS上建自己的VPN服务器,
比如我常说的搬瓦工, 一来是便宜, 二来是因为搬瓦工几乎把所有VPN需要用到的服务跟端口都给开了, 所以软件安装相对容易多了.
要么去买一些商用的VPN服务,比如:
VyprVPN, 在最基础的套餐jin仅支持PPTP, 但是在后续的pro套餐里可以支持几乎所有参见的的协议.
不过现在我们还有别的选择, 那就是shadowsocks.
这是一个开源的加密Socket5代理协议, 跟VPN相比最大的区别就是他的客户端相对轻量化, 所以大部分的路由器系统都可以运行在后台.
所以在路由器平台上相当流行, 也进而导致了同样使用shadowsocks协议的服务供应商的大量出现.
所以如果不愿意自己建VPS的服务端, 也可以直接去买相关的服务.
关于Shadowsocks的服务器端怎么安装就不在这里说了, 因为不同的服务器不同的系统差别比较大.
在EdgeOS这端, 我们需要在Debian的系统里安装2个工具, 一个是Shadowsock, 一个是ChinaDNS.
ERL3用的版本可以在这里找到:http://www.onlyos.com/archives/shadowsocks-libev-chinadns.html
因为是Linux端, 需要的话可以用Wget或者PSCP从Windwos拷贝过来.
Deb使用dpkg安装, ChinaDNS则是解压以后直接chmod +x赋权以后就能直接用了.
基本思路如下:
Shadowsocks负责流量的转发…ss-redir启动以后可以绑定在127.0.0.1的某个端口上, 等待路由协议把需要翻墙的包转发到这个端口上然后发送到服务器端
ChinaDNS负责作为本地的DNS服务器解析域名, 因为ChinaDNS本身带有-m的压缩指针模式, 同时支持使用433等非标准的域名端口, 所以可以成功绕开GFW去国外域名服务器拿到正确的IP.
并且支持非污染的IP从国内DNS拿IP, 被污染的出国拿, 所以最大程度上绕开了域名污染,并且避免了CDN, 位置服务等带来的不遍.
IPset负责标记GFWlist内的域名进入相关的组.
IPtables 负责将符合要求的对应的组的流量转发到Shadowsocks
这中间, 还需要一个本地Dnsmasq的支持, 不过这里的Dnsmasq主要的是直接去访问127.0.0.1:(ChinaDNS的端口), 作为一个转发跟缓存的存在, 因为Ipset需要Dnsmasq的解析记录去存入group
因为主要是Debian下的DNS操作, 所以具体操作我就不详细写了.
ss的配置主要是config.json的这个文件, 以及ss-tunnel的问题.
因为ss一开始并不支持UDP协议, 所以在DNS解析的时候, UDP包没有地方去, 所以ChianDNS使用8.8.8.8:53作为墙外的DNS, 那么我们可能需要ss-tunnel作为UDP转发通道.
一旦涉及到UDP流量, 那么请考虑所使用的SS版本因为只有C语音版本是支持UDP的, python版本无法使用UDP转发所以服务器端装什么也要考虑到.
当然我们也可以让ChinaDNS启用压缩指针模式.
在这些都准备好的情况下, 我们只需要一条iptabels的命令:
iptables -t nat -A PREROUTING -p tcp -m set –match-set group-name dst -j REDIRECT –to-port 1188(ss-local-port)
就可以把ipset对应的翻墙组的流量都扔到ss上然后出国拉.
我个人使用的方式是结合了几种方式的:
- 我用PPTP的VPN作为DNS解析的通道, 因为对速度要求低而且不需要考虑SS服务器端是否支持UDP
- SS作为流量的转发主力, 主要是因为如果要更换服务器信息我只要改下配置文件或者新建配置文件就可以, 不需要考虑路由等问题
- IPv6隧道备用, 作为第三路径保证前2个都出问题的情况下我去google和inbox都不会出问题.
ERL3是一台非常强大非常好用的路由, 然而因为图形界面的简陋, 命令行的相对晦涩, 导致了使用的人比较少, 相关资料也远不如ROS来的丰富.
然而因为后台Linux系统的开放, 甚至于可以直接在上面apt-get, 就跟一个树莓派一样, 所以对于Linux比较熟悉的用户甚至于可以直接在上面创建编译环境生成需要的工具.
并且他的存储其实是一个U盘…如果觉得原厂的容量不够了, 可以直接拆机换一个16G的上去…屌炸天有木有.
有兴趣的朋友去买一个来玩玩呗.
Ubiquiti Networks Edgerouter Lite 3Port Router (ERLITE-3)
Ubiquiti EdgeRouter X Advanced Gigabit Ethernet Routers ER-X 256MB Storage 5 Gigabit RJ45 ports
注意ER-X跟ERL的硬件平台不同所以软件包并不通道.
自动翻墙配置EdgeOS篇
ROS篇结束以后,我们来记录一下现在正在工作的EdgeOS的配置.
大概介绍一下Edge Router Lite 3这个路由器.
ERL3是Ubnt发售的一款纯有线的路由, 以NAT速度快闻名, 有记录是在1G的网络上可以跑出900多M的NAT速度…所以说速度很快.
有兴趣的朋友可以去amazon收一个:
Ubiquiti Networks Edgerouter Lite 3Port Router (ERLITE-3)
下面这个是ER-X, 相对ERL-3有缩水不过ERL3的价格比这个高不少, 所以ER-X还是比较超值的
Ubiquiti EdgeRouter X Advanced Gigabit Ethernet Routers ER-X 256MB Storage 5 Gigabit RJ45 ports
当然也可以国内某著名网站
其内嵌的EdgeOS的本质是跑在一个Debian系统上的Vyatta路由系统, 因为vyatta现在已经被博通收购, 所以现在的EdgeOS是基于原本的开源代码后续开发的, 在命令行格式上仍然完全集成了vyatta的模式.
由于EdgeOS其实是Debian上的一个应用, 所以我们很多时候可以跳过edgeos, 直接在debian上操作来实现一些edgeos上并不能实现的功能.
思路其实仍然一样, 我们需要解决2个问题:
- DNS污染的问题
- 流量区分的问题
因为我们可以直接在Debian上操作, 所以我们的选择就多了很多很多…毕竟Linux base的东西太多了.
所以我们现在选择这样的组合来完成我们需要的功能:
- VPN隧道+IPset+edgeOS的防火墙规则转发
- SS隧道+Ipset+ChinaDNS+iptables防火墙规则转发
- 上面这种的混合模式
首先我们来介绍一下第一种,这种方式的好处在于不需要对路由内的debian做太多的操作, 相对来说比较容易实现.
VPN的隧道可以选择IPsec SSL, L2TP或者PPTP.
广告一波我在用的VPS:https://bandwagonhost.com/aff.php?aff=5802
我在搬瓦工已经有了PPTP, 所以就自然直接上PPTP了, 不过因为ERL的GUI模式是没有PPTP的设置界面的, 所以我们需要使用edgeOS的命令行模式:
configure edit interfaces pptp-client pptpc0 set user-id your-sername set password your-password set server-ip your-vps-ip set require-mppe commit save exit
只要数据正常, vpn就会自动拨号连接起来, 然后就是NAT:
configure set service nat rule 5012 type masquerade
set service nat rule 5012 outbound-interface pptpc0
commit
save
exit
NAT完成以后, 我们需要搞定路由,
在搞定路由之前, 我们先需要认识一下IPSET这个Linux的工具, IPSET算是Dnsmasq和iptables的一个辅助工具, 主要的功能是快速的把域名或者IP归类, 然后帮助防火墙来识别, Dnsmasq算是附带的.
所以这里就有一个逻辑, 就是我们把所有gfwlist所知道的被墙的域名都转换为IPSET所能认识的配置文件, 在这样的情况下通过IPSET所归类的组, 我们可以要求dnsmasq去制定的DNS服务器去解析, 而避免了被墙的域名遭到污染, 同时呢, 这个组又可以作为防火墙的选择依据, 让这组的路由全部都走VPN通道出去:
具体的思路可以参考:
这位兄弟的博客, 上面同时也有编译好的高版本的Dnsmasq, 因为系统内建的是2.61版本不支持ipset功能.
在理解这些以后, 我们可以先通过系统命令创建一个组:
configure
set firewall group address-group group-name
commit
save
这时候ipset就有了一个可以自由使用的组了.
然后我们就把gfwlist转换成所需要的ipset设置, 因为gfw太大了, 所以我们需要跑个python的脚本, 可以从github直接抄来:
https://github.com/smallfount/gfwlist2dnsmasq
gfwlist2dnsmasq, 我把文件直接上传了可以直接下:
然后用python2 跑一遍就可以得到需要的ipset列表, 并且会根据脚本的配置去配置放到指定的地方然后dns的解析也是我们设定的方式.
最后就是防火墙规则的配置了:
configure
set protocols static table 1 interface-route 0.0.0.0/0 next-hop-interface pptpc0
set firewall modify your-group-name rule 1 action modify set firewall modify your-group-name rule 1 destination group address-group your-group-name set firewall modify your-group-name rule 1 modify table 1 set firewall modify your-group-name rule 1 protocol all
set interfaces ethernet eth1 firewall in modify your-group-name
commit
save
这样的配置就会让系统的防火墙根据group去区分不同的出口.
然而问题还是有: 因为gfwlist的转换并不完美, 所以可能会有不少域名有问题.
所以还有另外的办法,我们下一篇继续
自动翻墙配置ROS篇续
上一篇我们讲到了完成VPN隧道架设以后把DNS使用的流量导入了VPN,这样可以保证DNS的结果干净.
那么接下来需要处理的就是要把翻墙流量跟不翻墙的流量区分开来.
这里有2种思路:
- 根据需要翻墙的域名列表来区分
- 根据被墙的IP来区分
根据域名呢比较直观, 而且也比较容易维护, 然而由于CDN, CNAME等配置的存在, 很难得到一个非常完整的域名列表.
https://github.com/gfwlist/gfwlist
这里有一个相对比较网站的列表, 理论上可以通过正则转换成需要的形式, 不过ROS的七层模式我没搞懂怎么玩, 所以只能作罢.
剩下的就是根据IP来区分.
IP的话也是2种形式:
- 把被墙的IP段都分到VPN去
- 把不是墙内的IP都分到VPN去
在我做ROS的时候, 我没找到被墙的IP段的信息, 不过现在倒是有一个可以参考的.
https://github.com/SteamedFish/gfwiplist
可惜作者也说了, 严重不全, 所以只能说满足部分去求就行了
另外一种呢, 就是把所有的墙内的IP都摘出来, 然后解析出来不在这些里面的都扔到VPN去.
http://autorosvpn.googlecode.com/files/address-list.rsc
这是一个已经做到ROS用的IP地址列表, 包含了大部分墙内的IP段.
把这个导入到ros的文件管理器然后再导入到地址列表就能用了.
然后在防火墙墙里对这个地址列表做一个mark的标记, 这样在路由选路的时候就能根据标记来判断走哪跳路由了.
具体的操作我就不写了, 因为我也是照抄下面这个博客的:
http://autorosvpn.blogspot.jp/2013/05/ros-vpn.html
ROS的翻墙, 基本原理就是基于VPN隧道的, 但是因为ROS的系统没有相关IPSET等类似的域名策略功能, 所以基本都要靠IP来实现策略路由.
这个在管理上相对来说就麻烦多了. 而且因为第一种方式实现起来不容易, 大部分时候是使用第二种方式的.
这时候就会发现, 一些本来不需要翻墙的应用也在走VPN, 如果VPN速度快也就无所谓了, 如果VPN不够快, 那么就会觉得所有国外网站都很慢, 这时候就觉得反而不方便了.
所以我们在能翻墙以后又会有新的需求, 那就是能不能更加智能一点?
所以我们下一篇就介绍怎么在EdgeOS上实现更加智能翻墙.
技术文—自动翻墙配置ROS篇
因为休息在家, 就想了点事情给自己弄弄. 一来是有事情研究不会太无聊, 二来呢一直一来Bash都属于我不太擅长的领域, 通过折腾可以多学点怎么玩.
所以呢, 趁着自己有空, 就把家里的翻墙配置彻底优化了一下, 可以保证自己最大程度得使用舒适.
背景呢是手上有2台纯有线的路由, 一台是RB450G, 朋友送的, 一台是Ubnt的ERL3, 这是自己在升级到100M宽带的时候自己买的.
在这2货之前呢, 我一直都是IPv6直接挂到He的6to4的Tunnel上实现Google等支持IPv6的访问了, 不过问题就是IPv6毕竟还是小众的, youtube这种就算能访问也不能看片子, 所以用途就很小.
在使用了ERL3以后还是延续了原来的部署方式, 并没有特意去搞太多因为大部分时候我只要有Gmail跟Google就满足了其实.
不过在帮朋友在Azure上部署了一套SS并且他用Asus梅林固件的路由器完成了家用的自动翻墙以后, 我忽然觉得其实路由翻墙也不错嘛, 尤其是其实实现方式比我认为的还是容易多了.所以决定折腾一下.
因为朋友用上了R7000以后把ROS的RG450G送给我了, 所以我觉得先折腾一下这个, 毕竟ROS真心资料比较容易找.
ROS的配置可以使用WinBOX来完成, 当然如果会命令行会更好, 因为命令行其实逻辑性更容易理解一点.很多时候反而是GUI上的配置比较难理解.
基本的思想其实很简单, 就是放弃国内的DNS(因为国内所有的DNS在解析国外被墙的域名的时候必然被污染), 使用国外的DNS并且让DNS从VPN上直接出国而不走国内路由的, 否则DNS的解析结果会直接被污染.
所以我们首先需要搞一个VPN.
我个人使用的是搬瓦工的VPS: https://bandwagonhost.com/aff.php?aff=5802
最近能买到的比较便宜应该只有Los Angeles的2.99刀每月的套餐. LA的DC是搬瓦工比较快的那个, 东部的基本不行.
在起了VPN以后, 我们在VPS上起个VPN, 搬瓦工如果使用centos的话是有自动部署脚本的, 可以直接起OpenVPN.
不过为了我自己用起来方便我其实还是起了PPTP, 可以直接搜自动安装脚本去自动安装, 当然也可以自己手动装.
在VPN server端搞定以后, ROS这端就直接起一个VPN的Interface: 新建PPTP(或者SSTP,OVPN等等)客户端连接:
, 然后输入VPS的服务器IP, 端口号等需要的信息:
只要信息正确, VPN Link会自动建立.
不过为了要能正常通信, 我们需要在ROS上建立一个新的SNAT, GUI的位置防火墙, NAT页里面.
新建一个SNAT的类型, 把out interface改成VPN的接口, action 改成masquerade, src address 改成自己的内网IP段就行了.
CLI比较好理解其实, 例如:
/ip firewall nat
add action=masquerade chain=srcnat comment=”” disabled=no src-address=192.168.1.0/24(自己的本地IP段)
这样VPN的路径就通了.然后我们需要相关的路由来知道流量:
首先我做了一条给8.8.8.8 使用的路由, 这样可以保证我使用的DNS从VPN出去而不是被GFW污染一圈:
/ip route add dst-address=8.8.8.8 gateway=Bandwagong(VPN接口的名字) disabled=no check-gateway=ping
这样DNS就解决了, 然后我们需要把我们需要翻墙的流量到入VPN, 这样就能完成翻墙了.
这里就有问题了, 因为ROS是怎么知道那些需要去VPN的呢?
我们需要整理一个IP List告诉ROS, 然后给去到这些IP的流量做个标记, 再做一条路由让这些流量从VPN出去而不是本地.
具体怎么搞我们下一篇继续.