工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表全部文章

KVM Network Bridge Setup

http://wiki.solusvm.com/index.php/KVM_Network_Bridge_Setup

Xen bridge network trouble shooting tip

Xen桥接网络非常灵活,然而逻辑和管理方面也还算简单

桥接设备

  • bridge, 网桥;一般起名为:xenbr0, xenbr1, etc.
  • vif, 虚拟网络接口;一般起名为:vif0.0,vif0.1, etc.
  • veth/eth, 虚拟网络设备;一般起名为:eth0, etc.

桥接工具

  • /etc/xen/script/network-bridge, 网桥操作脚本
  • /etc/xen/script/vif-bridge, 虚拟接口操作脚本
  • brctl 工具,事实上以上两个脚本均调用了它

排查步骤

  • brctl show; 再看桥接是否OK。 
  • ethtool peth; 先看物理网卡通不通。
  • ifconfig vif; 看各虚拟接口是否正常。
  • ifconfig eth/veth; 看看虚拟网络设备是否正常。

http://wiki.xensource.com/xenwiki/XenNetworking

Xen bridge network and Xen Networking(转)

本文介绍了Xen桥接网络及出故障时可采用的工具和方法:

Xen桥接网络非常灵活,然而逻辑和管理方面也还算简单

 

桥接设备

  • bridge, 网桥;一般起名为:xenbr0, xenbr1, etc.
  • vif, 虚拟网络接口;一般起名为:vif0.0,vif0.1, etc.
  • veth/eth, 虚拟网络设备;一般起名为:eth0, etc.

桥接工具

  • /etc/xen/script/network-bridge, 网桥操作脚本
  • /etc/xen/script/vif-bridge, 虚拟接口操作脚本
  • brctl 工具,事实上以上两个脚本均调用了它

排查步骤

  • brctl show; 再看桥接是否OK。 
  • ethtool peth; 先看物理网卡通不通。
  • ifconfig vif; 看各虚拟接口是否正常。
  • ifconfig eth/veth; 看看虚拟网络设备是否正常。

链接

  • Xen Networking

Xen网络联接方式

        Xen 提供了 3 种虚拟网络模型来供客户机访问物理设备——桥接、路由和 NAT。在桥接模式中,虚拟网络接口(vif)在外部局域网是可见的,在路由模型中,vif 在外部局域网是不可见的,但是 IP 是可见的。在 NAT 模型中,vif 在外部局域网不可见,它也没有一个外部可见的 IP 地址。

        在桥接模式下, brctl 工具被用来创建软件方式的桥接接口,一个物理网络接口然后附加到桥上。Xen 客户机域的后端 vif 能被附加到这个桥上。当桥接口接收到来自物理接口的包时,物理网络接口将依据各域的虚拟网卡的 MAC 地址转发它们到不同的域上。

        在路由模型下将使用 iptables 机制来进行路由。由物理接口所收到的所有的包将被驱动域的网络 IP 层所处理。驱动域(dom0)查找路由表条目并将包转发到不同的客户机 IP 地址。在路由模式下,驱动域连接 2 个不同的网段:内部由客户机使用的网段和连接外部网络的网段。

       在驱动域作为一个 NAT 网关时,驱动域仍然作为一个路由器,但是更进一步映射一个它自己的 IP 地址和端口到一个客户机的 IP 地址和端口。客户机的 IP 地址隐藏在驱动域后面对外部网络不可见。

        Linux 防火墙提供了 iptables ,而 bridge-utils 则提供了 etables 来进行基本的 MAC 地址过滤。也可以指定一个物理网卡给一个域使用。
                

     Xen网络结构相当灵活,适当配置可以“轻松”实现dom0/domU与物理网络三者之间的复杂拓扑。

桥接模式


 

                                                                          图一、Xen 桥接模式示意图

下图是个桥接的例子。
    

         veth0、vif0.0 是 dom0 的网络接口veth0 被重命名为 eth0xenbr0 接口是软桥接接口vif1.0 是运行的客户机的后端网络接口

        peth0、xenbr0、vif0.0、vif1.0 都共享同样的 MAC 地址 FE:FF:FF:FF:FF:FF,它是以太网的广播地址。这意味着实际的网络接口、dom0 的回环接口、客户机的后端接口都向 xenbr0 广播。当物理网卡接收到包时,它直接发送到桥接接口 xenbr0,这个桥接接口通过包的 MAC 地址决定将包转发到哪个域的后端接口。因此 peth0 不需要 IP,只需要 MAC 地址。物理接口的原先 IP 已经被告知给 eth0——驱动域的虚拟前端接口。    

        xenbr0 通过 MAC 地址是 00:11:25:F6:15:22 或者是 00:16:3e:45:e7:12 来决定包转发到 eth0 或者 vif1.0。客户域相应的前端接口被命名为 eth0。从 dom0 的角度看,客户机中 eth0 实际是 vif1.0。
brctl 命令的显示:

  1. [user@Dom0]# brctl show
  2. bridge name     bridge id               STP enabled    interfaces
  3. xenbr0          8000.feffffffffff       no             vif1.0
  4.                                                        peth0
  5.                                                        vif0.0

基于Squid日志文件进行网络流量分析

实验室一直使用Squid来做代理服务器,今天突发奇想希望统计一下大家的上网情况。故写了一个简单的网络流量分析脚本。拿来和大家分享一下。

首先得打开Squid的access_log功能:
access_log /usr/local/squid/var/logs/access.log squid

默认的日志格式如下:

access.log中的日志规则:time elapsed remotehost code/status bytes method URL rfc931 peerstatus/peerhost type
1    time          表示客户端访问的时间,毫秒,从1970/0101开始
2    elapsed        客户请求所花费的时间,毫秒
3    remotedhost    客户机的IP地址
4    code/status    客户请求类型/HTTP返回码
5    bytes            客户请求的数据大小
6    method        客户请求的方法
7    URL            客户请求的URL
8    rfc931        客户认证信息
9    peerstatus/peerhost    缓冲/目的IP
10    type            客户请求对象类型

查看活跃的客户端

cat access.log | awk '{print$3}' | sort > sortresult.log
cat access.log | awk '{print$3}' | sort -u > iplist.log
sortresult.log中存储就是每次访问来源的IP地址,iplist.log中存储的是sortresult中不重复的IP,也就是客户端IP列表。
查看总的链接请求个数:
cat sortlist.log | wc -l
查看某个IP发出了多少次链接请求:
cat sortlist.log | grep 210.45.***.*** |wc -l

流量统计

统计总的数据流量大小(以M为单位):cat access.log |awk '{print $5}'|awk '{m+=$1}END{print m/1024/1024}'

查看各种请求方式的数量(以POST为例):

cat access.log | awk '{print $6}'|grep "POST"|wc -l

查看有多少链接来自腾讯QQ:cat access.log |grep ".qq.com" |wc -l



最后将希望特别关注的信息写入了一个shell脚本,以日志文件名为参数,产生自己关心的数据。



#!/bin/bash

echo -n "总的网络链接数:"
cat $1 | wc -l

echo -n "访问数据总流量(单位:M)"

cat $1 |awk '{print $5}'|awk '{m+=$1}END{print m/1024/1024}'

echo -n "访问 renren.com的链接数:"

cat $1 | grep ".renren."|wc -l
echo -n "访问 xiaonei.com的链接数:"
cat $1 | grep ".xiaonei."|wc -l
echo -n "访问 qq.com的链接数:"
cat $1 |grep ".qq."|wc -l
echo -n "访问 taobao.com的链接数:"
cat $1 | grep ".taobao."|wc -l
echo -n "访问 youku.com的链接数:"
cat $1 | grep ".youku."|wc -l
echo -n "访问 ykimg.com(youku的镜像站点)的链接数:"
cat $1 | grep ".ykimg."|wc -l
echo -n "访问 ku6.com的链接数:"
cat $1 |grep ".ku6."|wc -l
echo -n "访问 tudou.com的链接数:"
cat $1 |grep ".tudou."|wc -l
echo -n "访问 paipai.com的链接数:"
cat $1 |grep ".paipai."|wc -l
echo -n "访问 sina.com的链接数:"
cat $1 | grep ".sina."|wc -l
echo -n "访问 163.com的链接数:"
cat $1 | grep ".163."|wc -l
echo -n "访问 sohu.com的链接数:"
cat $1 | grep ".sohu."|wc -l
echo -n "访问 xunlei.com的链接数:"
cat $1 |grep ".xunlei."|wc -l
echo -n "访问 baidu.com的链接数:"
cat $1 |grep ".baidu."|wc -l
echo -n "访问 google.com的链接数:"
cat $1 |grep ".google."|wc -l
echo -n "访问 neu6.edu的链接数:"
cat $1 |grep ".neu6."|wc -l

对下午4个小时的网络日志进行分析的结果是:
总的网络链接数:48441
访问数据总流量(单位:M)1587.98
访问 renren.com的链接数:1253
访问 xiaonei.com的链接数:94
访问 qq.com的链接数:6461
访问 taobao.com的链接数:3544
访问 youku.com的链接数:1610
访问 ykimg.com(youku的镜像站点)的链接数:953
访问 ku6.com的链接数:54
访问 tudou.com的链接数:113
访问 paipai.com的链接数:1349
访问 sina.com的链接数:1602
访问 163.com的链接数:1692
访问 sohu.com的链接数:501
访问 xunlei.com的链接数:58
访问 baidu.com的链接数:2375
访问 google.com的链接数:1464
访问 neu6.edu的链接数:388

Squid防盗链

以前写了个Squid防盗链,不好用,现在更新了一下,有更加好用的。呵呵.

见下面的内容。我设置的例子是在squid上对mp3和wma进行控制防盗链.其实原理很容易啦,主要是对referer进行控制,更加高级的大家可以研究一下用cookie来进行控制。有空我也写个出来.

acl wmvurl url_regex -i \.mp3$  \.wma$ \.exe$

#要控制的后缀
acl phpoaref referer_regex -i ^http://.*\.php-oa\.com

#可以链接的网站
acl legalplayer browser -i Firefox  ^NSPlayer ^contype$ ^rma ^windows-media-player ^foobar2000 ^RealMedia  ^RealPlayer

#要在线直播的软件
http_access allow legalplayer wmvurl
http_access allow phpoaref wmvurl

#先让上面这些条件都可以的,让他们可以通过

http_access deny !phpoaref wmvurl
http_access deny !legalplayer wmvurl

#先accept后deny.

 
deny_info http://www.php-oa.com/error.jpg  phpoaref

#deny时出错时,给显示的出错的图

squid日志格式更改

squid日志里面默认记录的时间都是根据标准时间计算后加上毫秒记录的,不便于查看。
网上搜了搜,仿佛有许多方法都可以进行转换,但是想想还是麻烦,其实squid可以直接改日志的记录格式的。
打开squid的配置文件/etc/squid/squid.conf
找到下面这句,并取消注释

#logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%S

再找到:

access_log /var/log/squid/access.log squid

修改成

access_log /var/log/squid/access.log combined

重启squid
得到的日志格式就跟apache日志格式相似了

日志详解

在squid中access访问日志最为重要,位于/var/log/squid/access.log,常用的记录格式如下

例如:

下面来看看意思

1206507660.803  84367 192.168.1.114 TCP_MISS/502 1486 GET 
http://123.138.238.114/QQ2008SpringKB1.exe - DIRECT/123.138.238.114 text/html

 

logformat squid  %ts.%03tu %6tr %>a %Ss/%03Hs %<st %rm %ru %un %Sh/%<A %mt

解释如下:

%ts    Seconds since epoch;
%03tu  subsecond time (milliseconds); 
%6tr    Response time (milliseconds);
%>a    Client source IP address; 
%Ss    Squid request status (TCP_MISS etc);
%03Hs  HTTP status code;
%<st    Reply size including HTTP headers; 
%rm    Request method (GET/POST etc) ;
%ru     Request URL;
%un     User name;
%Sh    Squid hierarchy status (DEFAULT_PARENT etc); 
%<A    Client FQDN; 
%mt    MIME content type

 

我喜欢下面这样,可以输出 squid 日志的请求头

logformat squid_test_log %{%y%m%d%H%M%S}tl.%03tu %6tr %>a %Ss/%03Hs %<st %rm %ru  %un %Sh/%<A %mt "%>h"

 

>h      Request header. Optional header name argument on the format header[:[separator]element]
<h      Reply header. Optional header name argument as for >h


squid的日志很重要。常常要了解的,其中最重要的就是命中率啦,不然反向代理做的用就不大。

#cat access.log|gawk ‘{print $4}’|sort|uniq -c|sort -nr

9568 TCP_IMS_HIT/304
6313 TCP_HIT/200
2133 TCP_MISS/200
1568 TCP_MISS/206
587 TCP_MEM_HIT/200
531 TCP_MISS/304
207 TCP_REFRESH_HIT/200
152 TCP_REFRESH_HIT/304
86 TCP_NEGATIVE_HIT/404
69 TCP_MISS/404
9 TCP_MISS/000
4 TCP_MISS/503
1 TCP_REFRESH_MISS/000
1 TCP_DENIED/400

可以使用上面的方法,大约的分析一下命令中比。什么意思就看下面的详解.

#cat /var/log/squid/access.log |grep TCP_MEM_HIT

如果看到很多的TCP_MEM_HIT ,这表明该文件是从内存缓存读取的,squid已经起作用了!你再用浏览器打开该文件,应该是快如闪电了。。呵呵,大功告成了!还有其他类型的HIT,如TCP_HIT等等,这些是从磁盘读取的,我觉得加速的意义不大,只不过缓解了apache的压力而已。

相应于HTTP请求,下列标签可能出现在access.log文件的第四个域。

TCP_HIT

Squid发现请求资源的貌似新鲜的拷贝,并将其立即发送到客户端。

TCP_MISS

Squid没有请求资源的cache拷贝。

TCP_REFERSH_HIT

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器返回304(未修改)响应,指示squid的拷贝仍旧是新鲜的。

TCP_REF_FAIL_HIT

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。然而,原始服务器响应失败,或者返回的响应Squid不能理解。在此情形下,squid发送现有cache拷贝(很可能是陈旧的)到客户端。

TCP_REFRESH_MISS

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器响应新的内容,指示这个cache拷贝确实是陈旧的。

TCP_CLIENT_REFRESH_MISS

Squid发现了请求资源的拷贝,但客户端的请求包含了Cache-Control: no-cache指令。Squid转发客户端的请求到原始服务器,强迫cache确认。

TCP_IMS_HIT

客户端发送确认请求,Squid发现更近来的、貌似新鲜的请求资源的拷贝。Squid发送更新的内容到客户端,而不联系原始服务器。

TCP_SWAPFAIL_MISS

Squid发现请求资源的有效拷贝,但从磁盘装载它失败。这时squid发送请求到原始服务器,就如同这是个cache丢失一样。

TCP_NEGATIVE_HIT

在对原始服务器的请求导致HTTP错误时,Squid也会cache这个响应。在短时间内对这些资源的重复请求,导致了否命中。 negative_ttl指令控制这些错误被cache的时间数量。请注意这些错误只在内存cache,不会写往磁盘。下列HTTP状态码可能导致否定 cache(也遵循于其他约束): 204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504。

TCP_MEM_HIT

Squid在内存cache里发现请求资源的有效拷贝,并将其立即发送到客户端。注意这点并非精确的呈现了所有从内存服务的响应。例如,某些cache在内存里,但要求确认的响应,会以TCP_REFRESH_HIT, TCP_REFRESH_MISS等形式记录。

TCP_DENIED

因为http_access或http_reply_access规则,客户端的请求被拒绝了。注意被http_access拒绝的请求在第9域的值是NONE/-,然而被http_reply_access拒绝的请求,在相应地方有一个有效值。

TCP_OFFLINE_HIT

当offline_mode激活时,Squid对任何cache响应返回cache命中,而不用考虑它的新鲜程度。

TCP_REDIRECT

重定向程序告诉Squid产生一个HTTP重定向到新的URI(见11.1节)。正常的,Squid不会记录这些重定向。假如要这样做,必须在编译squid前,手工定义LOG_TCP_REDIRECTS预处理指令。

NONE

无分类的结果用于特定错误,例如无效主机名。

相应于ICP查询,下列标签可能出现在access.log文件的第四域。

UDP_HIT

Squid在cache里发现请求资源的貌似新鲜的拷贝。

UDP_MISS

Squid没有在cache里发现请求资源的貌似新鲜的拷贝。假如同一目标通过HTTP请求,就可能是个cache丢失。请对比UDP_MISS_NOFETCH。

UDP_MISS_NOFETCH

跟UDP_MISS类似,不同的是这里也指示了Squid不愿去处理相应的HTTP请求。假如使用了-Y命令行选项,Squid在启动并编译其内存索引时,会返回这个标签而不是UDP_MISS。

UDP_DENIED

因为icp_access规则,ICP查询被拒绝。假如超过95%的到某客户端的ICP响应是UDP_DENIED,并且客户端数据库激活了(见附录A),Squid在1小时内,停止发送任何ICP响应到该客户端。若这点发生,你也可在cache.log里见到一个警告。

更改Android网络路由

使用的i909手机的免费流量是2G,不过如果要用手机看美剧,这个流量就有点不足。但是,当前我所被覆盖的无线网,上网需要手动设置上网路由。Android里面我还没有找到现成的能够设置路由的软件,不过经摸索,却找出了通过终端使用超级用户模式手工设置路由的办法。

首先确保机器已经root了,还安装了busybox和Emulator。

启动Emulator,然后输入命令:

# ip route show
172.18.0.0/16 dev eth0 src 172.18.3.80
default via 172.18.1.170 dev eth0

有井号的行是命令,没有的是输出结果。上述命令用于显示手机当前的路由。下面的命令删除手机的默认路由。如果出错,说明可能没有安装好busybox。

查看路由只需要普通权限,删除、添加、修改路由都需要超级用户权限。

# su ip route del default

然后,添加默认路由和一条通往内网另一个网段的路由

# su route add default gw 172.18.1.252
# su route add -net 192.30.1.0 netmask 255.255.255.0 gw 172.18.1.170

最后查看新的路由设置,下面的结果表示设置成功了。

#ip route show
192.30.1.0/24 via 172.18.1.170 dev eth0
172.18.0.0/16 dev eth0 src 172.18.3.80
default via 172.18.1.252 dev eth0

当前我使用的busybox有个问题就是命令返回出错结果,它也不会提示任何信息。此外,使用手机键盘输入实在麻烦,解决的一个办法是使用SSH,通过电脑来控制手机。

注意:不同版本的emulator, busybox, 命令稍微有差异,例如最近升级后,su命令需要而且只要首次单独执行一次,此后都不用su, 其次,route add 命令的格式也与电脑版本Linux更接近,需要用route add -net 此类的语法了。

近期升级后,我手机上修改路由的语句变成了:
su
ip route del default
route add -net 0.0.0.0 netmask 0.0.0.0 gw 172.18.1.252
route add -net 192.30.1.0 netmask 255.255.255.0 gw 172.18.1.170