显示标签为“Networking”的博文。显示所有博文
显示标签为“Networking”的博文。显示所有博文

2012年9月1日星期六

NetworkManager和Upstart

Ubuntu桌面下,网络是由NetworkManager管理的。NM很好用,但是有时要配置复杂网络,只能用interfaces等网络配置文件搞定。

我给eth0设置了静态IP,用于办公室环境(其实也是DHCP网络)。回家之后这个静态IP得不到,开机的时候会等待2分钟时间让网络起来,先显示:
Waiting for network configuration...
1分钟后是:
Waiting up to 60 more seconds for network configuration...
最后是:
Booting system without full network configuration...
这在Launchpad上有N个bug报告。之后进入Ubuntu,interfaces文件没有生效,而且NM都没自动启动呢。来分析一下这个问题。

现在的Ubuntu在/etc/init.d下,System V Init任务和Upstart任务都有。如果是Upstart任务,则都链接到/lib/init/upstart-job,如NM:
tux@macbook:/etc/init.d(0)$ ls -l network-manager
lrwxrwxrwx 1 root root 21 May 25 12:01 network-manager -> /lib/init/upstart-job
开始我看到NM在/etc/rc?.d下没有启动脚本,就用update-rc.d创建了链接,但还是不能自动启动。后来才明白Upstart任务的启动和停止控制不在/etc/rc?.d目录下,而是在/etc/init目录。NM的配置文件为/etc/init/network-manager.conf。里面有:
start on (local-filesystems
      and started dbus
      and static-network-up)
就是说NM要在local-filesystem, dbusstatic-network-up之后才会启动,而这个Upstart Event(事件)应该是要在interfaces中的网络接口启用之后才会发生(Emit)。所以如果interfaces文件失效,NW也起不来。

那么开机等待的两分钟在哪里配置的呢?看了这个文章后才知道,是在/etc/init/failsafe.conf里面配置的。具体看该文件可以知道个大概。

2012年8月22日星期三

KVM的桥接网络

按照官方文档在Ubuntu下安装KVM及虚拟机,竟然出奇地顺利。网络自然是桥接(bridge)爽啦,但是在办公室DHCP环境下不能保证虚拟机和宿主机都是固定IP。然后竟然发现即使虚拟机是DHCP,桥接情况下可以从宿主机直接通过虚拟机的主机名来访问。要做的是把libvirt的IP地址:
$ ip a s virbr0
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
    link/ether 2e:7f:c8:81:58:7f brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
192.168.122.1放到宿主机DNS服务器的第一个即可。具体可在宿主机interfaces文件的br0或者eth0配置中增加一行:
dns-nameservers 192.168.122.1 192.168.0.2 192.168.0.3
相关支持参见resolvconf(8)

2012年2月24日星期五

Iptables的nat表

Iptables的nat表,看其名字,乃是Network Address Translation的缩写。我用过nat表的几次都是路由器在不同网段之间转发报文需要做NAT。现在碰到如下的情况:
笔记本电脑是配置成一个网桥的,两个网卡配置在一个网段,只需开启内核的转发和Proxy ARP两边网络即可打通,无需用iptables做NAT。

现在要用Dell作透明代理,要把192.168.2.5这边发出的所有对80端口的访问,转到Dell的3128端口。一般是用下面的一条iptables规则:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
可是这里没有地址转换,是不是不应该用nat表?经过研究,其实nat表不一定必须要做NAT。iptables的手册里面写着:
nat:
This table is consulted when a packet that creates a new connection is encountered. It consists of three built-ins: PREROUTING (for altering packets as soon as they come in), OUTPUT (for altering locally-generated packets before routing), and POSTROUTING (for altering packets as they are about to go out).
例如PREROUTING链,在数据包进入的时候就要穿越,所以上面的iptables规则自然是可以用在网桥上的。
iptables的报文处理顺序
用iptables,一定要搞清楚报文处理顺序了,这样就能真正理解其用法了。推荐Linux Home Networking上的上图。

2012年2月22日星期三

用ping来traceroute

那天看TCP/IP Illustrated第一卷的第8章Traceroute,突然想到用ping就可以来做traceroute
for i in {1..30}; do  ping -t $i -c 1 google.com; done | grep "Time to live exceeded"
这只是一个演示traceroute原理的例子,不过是我灵机一动的原创哦。之前发在commandlinefu了,又在这里发一下。

其实这个和traceroute还是有区别的。比如ping发送的是ICMP echo request,而traceroute默认发送的是UDP报文。

2012年2月18日星期六

DHCP的租期

前几天DHCP出现问题,顺便研究了下DHCP的租期。
ChinaUnicom客户端的DHCP信息
北京联通的WLAN免费试用不错,SSID就是不加密的那个ChinaUnicom。不过被我发现,这个服务的DHCP租期竟然达10天。就是说如果连接的设备下线后,从连接开始到10天这个IP才会释放到IP池里面供别的设备使用。如果NAT为私有地址的话,那么IP池可以设置很大,没有关系。但只这个服务给用户的是因特网地址,上面的111.195.89.234即是。这样就很浪费IP地址的。

DHCP租期过短的话,局域网内Renew包和客户端租期的过期就会过多;DHCP租期过长的话,地址浪费就会过多。这篇2007年的论文研究了DHCP的租期,自称是对DHCP使用最大规模的研究(we present the largest known study of DHCP utilization)。论文研究发现,指数方式动态调整DHCP的租期,可以比较有效地提高IP地址利用率,并同时减少DHCP的Renew和Expire。具体策略是客户端每次续租的时候把租期翻倍,最高到一个固定值(the lease time a client receives doubles each time it renews a lease, up to a maximum possible lease time).

2012-02-21更新:发现每次连接ChinaUnicom ,得到的IP地址都会变化;说明它的DHCP服务器不保留客户端的租期信息,每次都重新分配IP地址。

Virtualbox的Bridge模式联网

VitualBox里的虚拟机用Bridge模式来联网,宿主机连接到无线路由器上网。无线路由器设置了MAC地址过滤,要把宿主机无线网卡的MAC地址加到路由器里,宿主机才能上网。而虚拟机网卡的MAC地址是不需要加进路由器的许可列表的,虚拟机依然可以上网。在这种模式下,相当于宿主机的无线网卡,替虚拟机的网卡从路由器又租用了一个IP地址给虚拟机用。在路由器上可以看到宿主机和虚拟机的MAC地址及租用IP。不过不需要将虚拟机MAC地址加入许可列表是比较特殊的一点。
路由器上看到的:X61为宿主机,*为虚拟机

2010年6月30日星期三

网络启动脚本

在前一篇日记中,我写到“目前我发现禁用interfaces里面设置的方法只有把这个文件改名或者挪走”。我想找一个更干净的方法。我以为/etc/init.d/networking是启用网络接口的脚本,就用update-rc.d把这个脚本在/etc/rc?.d/里面的链接删掉,这样networking脚本就不会启动了。谁知下次开机后,网卡依然是按照interfaces里面的设置启用的。

我读了一下这个脚本(Ubuntu 10.04)。首先它默认是在0、6和S的运行级启动的,分别对应关机、重启和单用户模式。其次,脚本的start参数对应的命令只有如下一段:
case "$1" in
start)
/lib/init/upstart-job networking start
;;
看了一下upstart-job这个脚本,由于对Bash脚本不熟,没有仔细研读,待日后再研究。难道networking这个脚本只是用来停止网络接口的?这是瞎猜,不是结论。