Raspberry Pi as a brouter

终于,今天成功实现了将Raspberry Pi变成一个brouter。

如果你看了前一篇随笔:http://www.cnblogs.com/DaochenShi/archive/2013/06/24/3152981.html 这里是给出了如何将Raspberry Pi变为一个路由器。当然,在实现之后,进度只是达到了50%,因为我想做的是,在IPv4保持当前状态的情况下添加无线网的IPv6接入。很不幸,那篇博文是将两个端口当中的数据进行按IP规则的转换传递,而IPv6的转换是一个比较难解决的问题。网上搜到的大多是针对于外网没有IPv6的情况的,建立各种隧道就可以在内网有IPv6,但是教育网是具有原生IPv6,不需要第三方的隧道,因此网上关于这类文章就很少见到了。

预备知识

希望你了解或者知道以下名词:计算机网络的7层协议,数据包,帧,网桥,路由器。这里着重说明网桥和路由器,因此是按照实际用户来说的,非正式定义。

网桥:将两个或多个网进行连接,是一个二层设备,只负责数据帧的转发,但是和Hub不同,网桥是有选择的转发,Hub会导致全局各个端口的广播。

路由器:也是将两个或多个子网进行连接,是一个三层设备,NAT是在这一层实现的,也就是在这一层可以读出IP地址。

必备的软硬件

硬件:Raspberry Pi,USB无线网卡

软件:ebtables, iptables, hostapd, udhcpd, bridge-utils,dhclient

系统环境:Raspbian Linux 3.6.11+ #474

实现目标

wlan0构成一个AP,手机平板等可以接入,接入后获得IPv4的局域网地址和IPv6的广域网地址。同时Raspberry Pi自身也可以访问外网。

步骤

安装各种组件

sudo apt-get install ebtables iptables hostapd udhcpd bridge-utils dhclient

配置

关于udhcpd和hostapd的配置,请参考 http://www.cnblogs.com/DaochenShi/archive/2013/06/24/3152981.html

Hostapd

在hostapd配置文件最后,需要添加一句:

bridge=br0

/etc/network/interfaces

auto lo

iface lo inet loopback

   

iface br0 inet manual

pre-up modprobe ipv6

bridge_ports eth0 wlan0

pre-up dhclient eth0

pre-up ifconfig wlan0 192.168.42.1 up

pre-up brctl addbr br0

pre-up brctl addif br0 eth0

   

iface br0 inet6 static

address 在此处填写你的IPv6地址

netmask 64

gateway 在此处填写网关IPv6地址

   

post-down ifconfig wlan0 0.0.0.0 down

post-down ifconfig eth0 0.0.0.0 down

post-down brctl delif br0 eth0

post-down brctl delbr br0

含Ebtables的bash脚本brouter.sh

#!/bin/bash
#请用管理员权限运行
#启动桥br0和无线网 ifup br0 service hostapd start service udhcpd start #非IPv6的数据不允许通过这个桥 ebtables
-t broute -A BROUTING -p ! ipv6 -j DROP #如果目的地是eth0的IPv4地址,则数据包被截获(即放下来处理) ebtables -t broute -A BROUTING -p ipv4 -i eth0 --ip-dst 替换为你的连接到互联网的IPv4地址 -j DROP #如果目的地是wlan0的IPv4地址,则数据包被截获(即放下来处理) ebtables -t broute -A BROUTING -p ipv4 -i wlan0 --ip-dst 192.168.42.1 -j DROP #如果是arp协议并且是请求本机的,则处理 ebtables -t broute -A BROUTING -p arp -i eth0 --arp-ip-dst 替换为你的连接到互联网的IPv4地址 -j DROP ebtables -t broute -A BROUTING -p arp -i wlan0 --arp-ip-dst 192.168.42.1 -j DROP


#使用iptables进行IPv4数据转发
iptables -A POSTROUTING -s 192.168.42.0/24 -o eth0 -j MASQUERADE

 

总结一下大致步骤:

首先是建立一个桥br0,在这里选择两个桥接端口为eth0和wlan0,之后使用hostapd来启动无线网络。在这时候,wlan0无线网的接入端是直通eth0的上级的,因此满足了拥有IPv6的特征。

之后的ebtables将在桥上的所有IPv6的包给通过,非IPv6协议的包则拒绝通过。这样就保证了面向wlan0的IPv4数据不会在eth0那边出现,防止因为DHCP而封禁网口。

而在/etc/network/interfaces当中,给br0设置了IPv6地址,因此可以通过IPv6来访问Pi;给wlan0设置了静态地址,因此内网的用户可以访问Pi;eth0通过dhclient来获取IPv4地址。

设置好地址之后,udhcpd给wlan0端分发DHCP消息,表示自己是wlan0这里有IPv4的网关,那么接入无线网的设备就可以获取到IPv4的局域网地址;IPv6由于网桥不阻拦所以正常获得全局地址。

为了让来自192.168.42.*的数据包可以被转发,使用iptables来进行数据包的处理。这样处理后内网就可以使用IPv4访问外网。

 

参考链接

http://ebtables.sourceforge.net/

 

(吐槽一下用Word写这个真不如用LiveWriter

posted @ 2013-06-28 17:03  Shi Daochen  阅读(1159)  评论(1编辑  收藏  举报