Skip navigation.

Fat R笔记……与减肥无关

Fat awful terrible Rubbish-bin

Posts tagged with "Network"

在ubuntu下连上OpenVPN了……

, ,

之前pptp虽然能拨通,ifconfig也能看到ppp0的interface,可是就是没办法通过那个interface上网 ,于是只好改用OpenVPN。还好以前被折磨了那么痛苦,积累了宝贵的经验,这次很快就弄好了。

首先当然是apt-get install openvpn,目前是2.0.6,也够用了。然后在/etc/openvpn下面建一个配置文件,参考配置如下:
client
dev tun
proto udp #我的server使用的是udp协议
remote 192.168.1.199 1194 #当然,我实际使用的ip和port不是这个 ;)
resolv-retry infinite
nobind
persist-key
persist-tun
ca keys/ca.crt #key文件相对于config文件的路径。可以改用绝对路径
cert keys/mobile.crt
key keys/mobile.key
comp-lzo
verb 3
route 202.116.84.0 255.255.255.0 #通过VPN连接202.116.84.0/24

假设文件保存为mobile.conf。

在服务器上生成客户端证书mobile.crt和密钥mobile.key,scp到本机上。另外ca.crt也要scp到本机上。按照上面的设置,这些文件应该放在/etc/openvpn/keys下面。注意如果key位置不对,启动openvpn服务会提示failed。出于安全考虑,最好把mobile.key文件的权限改成400,否则openvpn会在log中给出一个warning。

看看是否存在/dev/net/tun设备文件,如果没有就建立一个:
$ sudo mknod /dev/net/tun c 10 200

然后载入tun模块:
$ sudo modprobe tun

接着启动openvpn:
$ sudo /etc/init.d/openvpn start
Starting virtual private network daemon: mobile(OK).

可以看到openvpn自动调用mobile.conf作为配置文件启动了。如果一切正常,片刻之后就能用ifconfig看到tun0界面了。

当然,也可以以非daemon方式启动:
$sudo openvpn /etc/openvpn/mobile.conf

这种方式可以直接在屏幕上看到log,方便查错。

just backup....

, ,

:star:
ptables -t nat -L -n

iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 -j MASQUERADE
or
iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -o eth0 -j SNAT --to-source 192.168.192.9

iptables -t nat -A POSTROUTING -s 10.8.2.0/24 -o eth0 -j MASQUERADE

iptables -t nat -A PREROUTING -p tcp --dport 5000 -j REDIRECT --to-ports 1194
iptables -t nat -A PREROUTING -p udp --dport 5000 -j REDIRECT --to-ports 1194

再记OpenVPN

,

OpenVPN比较常见到的两个问题都被我遇到了,一个是只能访问VPN Server,不能访问Server外的机,一个是可以VPN到Server,但Server和Client互相ping不通。

  关于第一个问题,之前已经通过nat解决了。其实OpenVPN本身只是实现Client端到Server端的VPN通道,两者能互相Ping通就表示OpenVPN基本上是正常工作了,至于通过Server访问网络,则不属于OpenVPN的职责。因此,要通过Server来访问其它主机(包括Serve所在LAN的其它机),就需要操作系统另外实现了。也就是说,这相当于要让Server具备Gateway的功能。虽然有的资料说通过正确设置路由表并打开ip_forward就可以了,但在我的server上,虽然的确是有net:10.8.1.0/24,gw:10.8.1.2这个路由的(默认就有的),却仍然不能正常工作(除非是我的理解有误,需要的是另外一条路由设置),所以最后还是通过nat解决的(毕竟vpn的ip不属于本地子网,单纯的ip转发应该是没有用的)。因此,如果要让VPN的其它机通过我这个Client访问我所在的网络,首先也要让我的机具备gateway的功能,例如使用winroute。

  而第二个问题,看起来感觉更像OpenVPN的bug。在公司的机上是完全没有问题的,而在学校的机就没那么顺利了。开始还以为是C/A的问题,后来把学校的机用的密钥拷到公司的机上用,也没问题。那么看起来应该是学校的机那边的问题了。不过由于两边上网环境差异比较大(公司是内网IP+NAT,学校是内网IP+Proxy),弄了半天还是没啥头绪。今天早上突然想到,会不会是路由的问题呢?在公司Remote回学校,都拨上VPN,route print一看,学校的机是没有10.8.1.0/24(也就是OpenVPN的子网IP)的路由的。用ipconfig可以看到,获得的IP是10.8.1.10,网关是10.8.1.9,于是手动执行route add 10.8.1.0 mask 255.255.255.0 10.8.1.9,再ping 10.8.1.1,已经通了。公司的机也可以互相ping得通(也就是两个client能正常通讯了),服务器上也可以ping通10.8.1.10。看起来一切都正常了。

  不过到底为什么会出现这样的问题呢?后来仔细看了一下log,看到这3条:
Tue Apr 18 19:07:45 2006 route ADD 10.8.1.0 MASK 255.255.255.0 10.8.1.9
Tue Apr 18 19:07:45 2006 ROUTE: route addition failed using CreateIpForwardEntry: 参数不正确。   [if_index=65541]
Tue Apr 18 19:07:45 2006 Route addition via IPAPI failed

显然,OpenVPN是有尝试添加这条路由的,但由于某种原因失败了。在默认设置下,似乎OpenVPN会自动判断添加路由的时机(可能是TEST ROUTES: 0/0 succeeded len=1 ret=0 a=0 u/d=down...那几条),然后再添加路由。这种机制在公司的机可以正常工作,但在学校的机却失败了,在OpenVPN认为已经可以添加路由的时候,实际上系统还没做好准备(我后来写了个批处理,先ipconfig/all然后route print然后再route add,在配置文件中使用route-up这个directive来执行它,然后在log中查看结果。可以看到,即使路由表里已经有10.8.1.x的路由,接下来的route add还是加不进去。)。还好,OpenVPN提供了一个route-delay,用这个directive可以强行指定添加路由前的延时。经过实验,在我这里需要设置成route-delay 10(10秒)才可以添加路由。等待时状态窗口会停在"FlushIpNetTable"的状态,这时也可以自己cmd尝试手工添加路由,同样也会受到系统的拒绝。10秒过后,OpenVPN会添加路由,察看log也可以看到已经不会出错了。

  但问题没有解决。用route print,还是没看到那条路由,而如果在配置文件中加多一条route 10.8.1.0 255.255.255.0,可以在log中看到OpenVPN连续执行了两次route add,第一次成功,第二次显示路由已存在。然后连接完成后,route print还是看不到。真是比较奇怪。最后我是用
route-up "route add 10.8.1.0 mask 255.255.255.0 10.8.1.9"

这句来搞定的。遗憾的是,这里必须把10.8.1.9这个VPN Gateway的IP写进去,而在某些情况下,可能没办法是先确定这个IP。

  (补充:后来再读了一下manpage,发现有这个directive:
--route-method m 
Which method m to use for adding routes on Windows? 
adaptive (default) -- Try IP helper API first. If that fails, fall back to the route.exe shell command. 
ipapi -- Use IP helper API. 
exe -- Call the route.exe shell command.

也就是说,可以不用route-up那句,改成route-method exe,效果是一样的,而且更具通用性)

  总的来说,对于Openvpn,排除防火墙的因素,问题往往很有可能出在路由上,其次就是nat。配置Openvpn必须要对这两个东西保持清醒才行。

总算是用OpenVPN爬出去了

, ,

由于这边防火墙进行了很变态的封锁(之前甚至只开放了几个浏览网页和收发邮件的端口,协议也只开放了最基本的, icmp都封了,甚至连文件下载都被block了,非常痛苦……不过现在好了些,至少文件下载又重新开放了),所以逼于无奈下定决心要冲出去。

  正好自己在公网有一台服务器,这台服务器便成了我的救命稻草。在上面开了http proxy和socks proxy,虽然能缓解一下形势,不过还是不太爽,想pptp连回学校都不行。所以我的目标很明确,用那台Server提供VPN,然后这边通过这个VPN钻出去,从而不受本地防火墙限制地使用网络服务,包括拨pptp回学校。

  由于当初对网络协议认识不深,以为可以通过Socks来拨pptp,然而socks只能代理基于TCP/UDP的应用层协议,pptp需要的GRE协议是不能代理的(如果我的理解没有错),所以当然失败了。同样,后来尝试用datapipe进行端口映射,由于datapipe只支持tcp,所以也失败了。因此,只能选择VPN来实现我的目的了。

  (值得一提的是freecap这个俄罗斯人写的socks client,功能比sockscap强多了,还支持proxy chain,至少不会像sockscap和Permeo Security Driver那样,死活连不上需要密码验证的Socks5 Proxy)

  通过google,我了解到OpenVPN是一个不错的解决方案,于是就决定用它了。服务器使用的是Linux (2.4.19),可以在官方主页http://openvpn.net/下载,我用的版本是2.0.6。客户端是WindowsXP,可以在http://openvpn.se/下载OpenVPN GUI for Windows,我用的是1.0.3。安装和配置没有什么问题,参考HowTo就OK了。服务器端主要需要注意的是要先保证系统有lzo和openssl这两个库。安装完后,客户端和服务端的配置文件分别以example里的客户端和服务器配置文件为蓝本,稍作修改就没问题了。证书和密钥的设置可以参考这篇:配置OpenVPN进行加密通讯v0.1.pdf,在server端生成key后,把生成的ca.crt client1.crt和client1.key三个文件下载到C:\keys下面。(补充一点,在生成key和证书前,可以编辑vars文件的末尾,修改一些field的缺省值,这样就不用每次生成key和证书时都去改(其实不改也行,随便填的),一路回车就行了。我把默认值改成了:
export KEY_COUNTRY="CN"
export KEY_PROVINCE="GD"
export KEY_CITY="Guangzhou"
export KEY_ORG="SUAA"
export KEY_EMAIL="me@myhost.mydomain"

  我的客户端配置如下:
----------client.ovpn-----------
client
dev tun
proto udp
remote 192.168.1.199 1194 #当然,我实际使用的ip和port不是这个 ;)
resolv-retry infinite
nobind
persist-key
persist-tun
redirect-gateway #让VPN成为默认网关
ca "C:\\keys\\ca.crt"
cert "C:\\keys\\client1.crt"
key "C:\\keys\\client1.key"
comp-lzo
verb 3

  我的服务器端配置如下:
----------server.conf-----------
port 1194
proto udp
dev tun
daemon
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh1024.pem
server 10.8.1.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-to-client
keepalive 10 120
comp-lzo
max-clients 10
user nobody
group nogroup #这个系统没有nobody组,但有nogroup组,所以就用nogroup了
chroot /usr/local/etc/vpn
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
verb 3


  我实际使用的当然不是1194这个端口,这个端口是过不了这边的防火墙的,我用的是另外一个已确认防火墙没有挡掉的UDP端口。客户端这边是内网nat出去的,不过没有问题,因为服务器那边不需要访问通过我访问我这里的lan的其它,所以不用进行额外的设置。这样设置后,用OpenVPN GUI已经可以建立VPN连接了,互相也能ping得通。但这时客户端只能访问服务器,还不能通过服务器访问其它机器。

  其实这个问题困扰了我很长时间,网上那些解释把我绕得晕头转向的,而之前因为我并没有开防火墙,跟iptables有关的说明我都一概不理,所以一直没有成功。后来静下来想一想,虽然服务器端能访问VPN子网,也能访问外部网络,但VPN到外部网络,必然是要经过nat的过程,而不仅仅是route的设置问题。OpenVPN本身不会自己去nat,还是需要在系统里另外实现。(不过奇怪的是,我一开始在自己vmware里的linux试验时,只要打开ip_forward就可以了……)

  首先是要打开ip_forward:
sysctl -w net.ipv4.ip_forward=1

 或者
echo "1">/proc/sys/net/ipv4/ip_forward

 都可以(在我这里的FC4上,echo 1>...居然不行,一定要echo "1"...真分特!)

  然后是用iptables实现nat。我参考了这篇文章:http://www.linuxonline.net.cn/bbs/viewthread.php?tid=1080 。只要这个命令就可以了:
iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 -j MASQUERADE

 (我的vpn子网为10.8.1.0 mask 255.255.255.0)
 首先启动iptables:
service iptables start

 然后再运行上面那个命令设置nat(我没有iptables save来保存设置,所以要先启动服务再设置)
检查一下是否设置成功:
iptables -t nat -L -n


  设置完成后,再试试vpn,发现已经可以nat了。(不过如果在conf里设置了verb 9,在log里还是能看到GET INST BY VIRT: 66.102.9.99 [failed]这类东西,跟没nat时一样……)

  另外,如果不把vpn做为默认网关,可以在服务器的conf里用push "route ip mask"或者在客户端的配置文件里加入route ip mask来设置客户端访问哪些地址需要走vpn。

网络故障备忘

,

一台IBM T30,上网缓慢
ping 楼内IP偶尔丢包,当ping -l 40000的时候丢包显得十分严重
但据说在其它地方上网正常,拿到楼下测试也是正常
后怀疑是信号衰减问题
解决方法是在宿舍内使用一个hub/switch来上网,实现relay,从而使得信号得以重新放大