计算机‎ > ‎软件‎ > ‎Linux‎ > ‎

Raspberry-Pi 的 Raspbian 系统 无线热点局域网路由器(AP) 和 DNS 服务器

发布者:guo rue,发布时间:2014年5月25日 下午9:36   [ 更新时间:2014年5月29日 上午3:30 ]
图中的树莓派平时担任二级路由为逸龙笔记本组提供无线网络。必要时候,切换成一级路由。

拿树莓派做个无线路由器,配置的结果就是把树梅派的网络连接通过无线网卡分享出来。做分享的无线网卡当然就不能同时来连接网络了。

root登录

运行 lsusb 查看USB设备
root@raspberrypi:~# lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter

接下来 lsmod 看一下有沒有 8192cu 這個東西在裡面,他就是无线驱动。
root@raspberrypi:~# lsmod
Module                  Size  Used by
snd_bcm2835            16165  0
snd_soc_bcm2708_i2s     5474  0
regmap_mmio             2806  1 snd_soc_bcm2708_i2s
snd_soc_core          131268  1 snd_soc_bcm2708_i2s
regmap_spi              1897  1 snd_soc_core
8192cu                550816  0
snd_pcm                81593  2 snd_bcm2835,snd_soc_core
snd_page_alloc          5156  1 snd_pcm
regmap_i2c              1645  1 snd_soc_core
snd_compress            8076  1 snd_soc_core
snd_seq                53769  0
snd_timer              20133  2 snd_pcm,snd_seq
snd_seq_device          6473  1 snd_seq
leds_gpio               2059  0
led_class               3688  1 leds_gpio
snd                    61291  7 snd_bcm2835,snd_soc_core,snd_timer,snd_pcm,snd_seq,snd_seq_device,snd_compress

没有插入USB无线网卡时候输入
ifconfig
是没有显示 wlan0

插入USB无线网卡,我的无线网卡是 『EDUP EP-N8508GS黄金版 迷你USB无线网卡 树莓派专用』
ifconfig
出现 wlan0 证明已经发现USB无线网卡

1 安装hostapd
因为 raspbian 官方安装源提供的 hostapd 需要 无线网卡 支持 nl80211 驱动。如果你的网卡支持 nl80211 驱动。你可以直接 用原生安装方式 安装
sudo apt-get install hostapd

我需要确认一下我的无线网卡是否 支持 nl80211 驱动 。先安装 iw
sudo apt-get install iw
运行 iw list 结果
root@raspberrypi:~# iw list
nl80211 not found.
找不到它。网卡不支持 nl80211 协议。唔,这个原因是……螃蟹卡不是使用 nl80211 作为驱动,而是使用螃蟹自己的 rtl871xdrv 作为驱动。需要自行编译 rtl871xdrv 作为驱动 的 hostapd 软件包。

卸载从官方安装的 hostapd
sudo apt-get remove hostapd

这个是第三方的
wget https://googledrive.com/host/0B6hvW6XtZ2CdNERMNmdnTTRnLTQ/v1.1.tar.gz
tar -zxvf v1.1.tar.gz
cd RTL8188-hostapd-1.1/hostapd
make && sudo make install
原地址 https://github.com/jenssegers/RTL8188-hostapd/archive/v1.1.tar.gz

编辑hostapd 默认配置文件
sudo nano /etc/default/hostapd
找到#DAEMON_CONF= "",修改为:
DAEMON_CONF="/etc/hostapd/hostapd.conf"
然后编辑:
sudo nano /etc/hostapd/hostapd.conf
修改为
# Basic configuration

interface=wlan0
ssid=wlan2.guoruei.net
channel=2
#bridge=br0

# WPA and WPA2 configuration

macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=youpassword
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
beacon_int=100
auth_algs=3
wmm_enabled=1

# Hardware configuration

driver=rtl871xdrv
ieee80211n=1
hw_mode=g
device_name=RTL8192CU
manufacturer=Realtek

保存退出,然后重启服务
sudo service hostapd restart
[ ok ] Stopping advanced IEEE 802.11 management: hostapd.
[ ok ] Starting advanced IEEE 802.11 management: hostapd.

2 配置无线网卡为固定ip地址
输入命令
sudo nano /etc/network/interfaces
编辑网络配置文件,找到这几行注释掉。
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp
添加以下几行。
iface wlan0 inet static
address 192.168.2.1
netmask 255.255.255.0
这里需要说明的是 192.168.2.1是给 raspberry pi 做的路由器分配的网关 ip,这个不能跟局域网里其他路由网关ip重复。
reboot
重启。
ifconfig
查看wlan0的IP是不是生效了。这次显示 192.168.2.1 了。

3 安装DHCP服务
sudo apt-get install isc-dhcp-server
sudo mv /etc/dhcp/dhcpd.conf  /etc/dhcp/dhcpd.conf.bak
sudo nano /etc/dhcp/dhcpd.conf
复制粘贴如下内容
default-lease-time 600;
max-lease-time 7200;
log-facility local7;

subnet 192.168.2.0 netmask 255.255.255.0 {
  range 192.168.2.101 192.168.2.106;
  option routers 192.168.2.1;
  option broadcast-address 192.168.2.127;
  option domain-name-servers 8.8.8.8,8.8.4.4;
  default-lease-time 600;
  max-lease-time 7200;
}

保存退出,然后重启服务
sudo service  isc-dhcp-server restart

4 配置路由转发
通过前面的配置过程,已经可以通过无线网络连接到Raspberry pi的无线网卡,但是还不能连接到互联网,下一步就是让从无线网卡 wlan0 进来的数据 转发到 有线网卡 eth0上面 通过有线网卡连接网络接到互联网。
因为eth0是获取的动态ip,所以这里通过iptables来实现简单的路由转发。

输入命令
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo bash
iptables-save > /etc/iptables.up.rules
exit
输入命令
sudo nano /etc/network/if-pre-up.d/iptables
把下面两行复制粘贴到编辑窗口
#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules
保存退出,输入命令。
sudo chmod 755 /etc/network/if-pre-up.d/iptables
开启内核转发,输入命令。
sudo nano /etc/sysctl.conf
找到这里。
# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1
去掉 net.ipv4.ip_forward 前面的#,保存退出,输入命令。
sudo sysctl -p
配置完毕 通过无线连接上以后ping一下外网,可以通了,这样就可以把Raspberry Pi 当作路由器来用了。

5 设置开机自动启动
完成上面的步骤,如果没什么问题,应该可以上网了。但是重启后还要手动启动hostapd和dhcp服务。打算用 chkconfig 支持开机启动。因为网上的大侠和菜鸟都是这么些的。
sudo apt-get instsall chkconfig
可是,我怎么安装,怎么都提示错误,不能安装,没有这个东西。逗逼。终于有一次在千难万险之后安装上了。每次开机的时候会有很大的概率自启动失败。

只好自己写脚本检测dhcp服务并打开。
nano /usr/sbin/keep_dhcp_on
写入
#!/bin/bash

i=0

while [ i=1 ]
do
        dhcpstatus=$(sudo service isc-dhcp-server status)
        tmp=$dhcpstatus
        dhcpstatus=${tmp##*is }
        echo second cut for dhcpstatus:
        echo $dhcpstatus
        if [ "$dhcpstatus" = "not running." ]
        then
                echo "Restartig dhcpd..."
                sudo service isc-dhcp-server start
        else
                echo "Do nothing."
        fi
        sleep 5
done
保存。上面这个脚本的作用是在运行之后每5秒钟检测一次dhcp服务是否处于启动状态,如果不是则启动它。需要注意的是,linux系的shell脚本的语法相对来说比较严格,需要严格注意空格等格式问题。

修改权限为可执行:
sudo chmod +x /usr/sbin/keep_dhcp_on

为了让它开机运行,
nano /etc/rc.local
在程序之前添加:
# service isc-dhcp-server start
/usr/sbin/keep_dhcp_on 1>/dev/null &
这句指令的作用是让这个脚本开机即在后台启动,并把所有的输出信息丢弃。

好了重启试试
reboot
已经可以连接上

6 公共DNS查询服务器
将树莓派(Raspberry Pi)设置为无线路由的,试用了一段时间觉得效果不错,但是总觉得树莓512MB内存仅仅作为路由太浪费了,于是我就想能不能将DNS公共查询服务器也架设在上面,这样常用的DNS查询将会缓存到树莓派上,也起到DNS查询加速的作用。

首先我找到了网上的解决方案,在树莓讨论版上《[HOW TO] Use your RPI as a DNS server and speed up yo’ net!》,当然这个解决方案是基于这篇文章的《DNS on Raspberry Pi — Speed up your internet Experience》,使用树莓派最大的好处是有强大的社区支持,基本上你所遇到的问题网上都有相关的解决方案,得益于Debian的丰富的包,一些软件可以直接apt安装
sudo apt-get install -y dnsmasq
下面我们就需要配置DNSMASQ了,配置文件一般位于路径/etc/dnsmasq.conf。
nano /etc/dnsmasq.conf
由于通篇默认是#注释了,我就顺势在篇末加上这些
# Dnsmasq.conf for raspberry pi
# /etc/dnsmasq.conf
# http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq.conf.example

# Set up your local domain here
domain=raspberry.local
resolv-file=/etc/resolv.dnsmasq
min-port=4096
server=8.8.8.8
server=8.8.4.4

# Max cache size dnsmasq can give us, and we want all of it!
cache-size=10000

# Below are settings for dhcp. Comment them out if you dont want
# dnsmasq to serve up dhcpd requests.
# dhcp-range=192.168.2.101,192.168.2.106,255.255.255.0,1440m
# dhcp-option=3,192.168.2.1
# dhcp-authoritative
这里的server所指示的就是上级DNS服务器的地址,也就是说本地缓存查不到的域名将会发送给上级DNS服务器然后本地再缓存结果。这里用的是Google的8.8.8.8和8.8.4.4,可以改成你所需要的,一般就用谷歌的,我就不改了:-)

保存,重启服务:
sudo service dnsmasq restart

到这里基本上就配置完成了,你可以在树莓派上nslookup或者dig一下看看结果,当然如果找不到这些命令是因为你没有安装dnsutils,直接通过下面的命令安装即可:
sudo apt-get install dnsutils
然后
nslookup www.google.com
或者
dig www.google.com

再讲解一个小技巧,大家电脑上的hosts文件一般不陌生,在DNS被投毒污染或者我们需要配置测试Web服务器时会要改这里的域名和IP对应关系,这里我们可以让dnsmasq替我们代劳。切换到/etc/dnsmasq.d/路径下,新建一个test.conf文件,内容如下:
address=/appspot.com/74.125.155.141
别忘了重启一下服务:
sudo service dnsmasq restart
这样当查询appspot.com的时候,dnsmasq将直接返回这里设定的IP地址,轻松避免了DNS投毒攻击。