Pages

Saturday, 17 December 2016

用树莓派做翻墙网关

在网上搜了很多文章来看,很多都是把树莓派当WIFI AP来用的,但我这里不是。我的树莓派只有1个自带的eth网卡,我把它做成一个网关,让所有的设备在网络设置的网关一项都填树莓派的IP,基本实现其他设备无配置无缝自动翻墙。
其实过程非常简单。
首先,当然是要有能用的代理,无论是http proxy还是socks proxy,甚至只是一个shadowsocks server也行,现有的工具都能适配使用。
然后,用redsocks或ss-redir在树莓派上开端口,一定要监听在0.0.0.0上,我之前就是开在127.0.0.1上,然后纠结了大半天,一直是树莓派自己能翻过去,其他把它当网关的机器翻不出去。redsocks目前我看到有两个不同版本,一个原版,从2012年以来就很少更新了,可以将本地tcp流量封装到http connect/http relay/socks协议里,配合iptables等机制实现系统全局代理,另一个是国人修改版, 在原版的基础上又增加了一些功能,比如后端协议还支持了shadowsocks(就跟ss-redir一样)和直连,以及auto proxy自动检测是否需要代理,还有自称修正了一些原版中的bug等等。但我昨天试用下来,发现这新增的功能很不稳定,基本经不起日常使用。我最后就直 接用了ss-redir,这是shadowsocks-libev中的一个工具,功能与redsocks类似,但它只提供了shadowsocks的协议作为后端,不过胜在稳定,又不用多走一次socks5代理,所以估计效率也会好一点。
接着,把树莓派设置流量转发。打开/etc/sysctl.conf,设置net.ipv4.ip_forward=1,让更新实时生效: sysctl -p /etc/sysctl.conf。这样树莓派就已经可以做为网关使用了。还要把流量转发到ss-redir开的端口(我用58100)上去,Linux 上用iptables:
iptables -F
iptables -X
iptables -Z

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 58100 -m state --state NEW,ESTABLISHED -j ACCEPT

# dnat
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
iptables -t nat -N SS
# 过滤私有地址,vps地址
iptables -t nat -A SS -d 127.0.0.1 -j RETURN
iptables -t nat -A SS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SS -d 172.16.0.0/21 -j RETURN
iptables -t nat -A SS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SS -d shadowsocks-server-ip -j RETURN

# 过滤中国ip地址,网上搜一下“中国ip段"
iptables -t nat -A SS -d 58.14.0.0/15 -j RETURN
iptables -t nat -A SS -d 58.16.0.0/13 -j RETURN
iptables -t nat -A SS -d 58.24.0.0/15 -j RETURN

# 所有其他的ip,都提交给shadowsocks
iptables -t nat -A SS -p tcp -j REDIRECT --to-port 58100

# 使用SS链,其他设备走PREROUTING链
iptables -t nat -A PREROUTING -p tcp -j SS
# 使用SS链,树莓派自己走OUTPUT链
iptables -t nat -A OUTPUT -p tcp -j SS

中间有一段中国IP地址的,有个叫chnroute的项目,简单的做法就只有一条命令:
curl http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest | grep 'apnic|CN|ipv4' | awk -F\| '{ printf("iptables -t nat -A SS -d %s/%d -j RETURN\n", $4, 32-log($5)/log(2)) }' > cn_rules.conf
,再把文件cn_rules.conf的内容执行一下。
最后,把家里所有要翻墙的设备都在网关一项里填成树莓派的IP。比较方便的做法是,在DHCP那里就直接返回树莓派的IP当网关。比较郁闷的是我的 Netgear R6300v2貌似没找到怎么在DHCP里设置自定义的网关地址。当然树莓派一定要用静态设置上级路由器的IP为网关。这样所有连入的设备就自动能翻墙 了。
上面还有一点没提到的是DNS污染的问题,现在也有很多方案了,我的做法是在树莓派上建了个dnsmasq,上游走OpenDNS的5353端口,国内常用域名有个列表,走114DNS.
---------

在树莓派上搭建全局透明代理网关


有的程序本身不支持设置代理,所以需要在网关上动手。正好一直使用树莓派当路由器,所以尝试把树莓派打造成一个带有智能转发功能的透明网关,即国内的 IP 直连,海外的 IP 走代理加速。

配置无线网络

本文关注点不在此,所以一笔带过。

可以通过一键安装脚本 pi-setup-wifi.sh 来安装和配置树莓派的无线。该脚本会创建一个名为SSID,密码为PASSWORD的无线网络,使用的网段为 192.168.68/24

启动 DoH 服务来避免 DNS 污染

目前 GFW 大概有这么几个级别的干扰:

  1. 随机丢包、限速
  2. 域名阻断、IP阻断
  3. DNS 干扰

一般的网站都基本上处于1或2,一般来说只要 TCP/UDP 流量不直连就行,但是 Google 家的产品比较强,直接上了最高规格的屏蔽,即 DNS 解析污染。

出于性能和速度的考虑, DNS 协议使用了 UDP 这种不可靠的协议,这使得 DNS 解析污染出现,即被中间路由截获并返回了虚假的 IP 地址,因此我们需要建立一个可靠的 DNS 解析服务。

目前已经有很多解决方案,如基于 TCP 的 DNS 解析,但是由于 TCP 流量仍然能够被嗅探,所以出现了 DoH (DNS over Https),这样只要服务器没问题,返回的结果就一定是正确的。

本文权衡各工具,最后选择了 Cloudflare 家的 DoH服务

首先到 下载页 下载 Binary: ARMv6这一栏的压缩包,然后解压。
(被屏蔽了,需要用代理下载)

1
tar -xzvf cloudflared-stable-linux-amd64.tgz

然后把 cloudflared 移动到 /usr/local 目录下,并启动。

1
/usr/local/cloudflared proxy-dns --address 0.0.0.0 --port 15353

只监听本地的话wifi客户端会有问题
5353 端口被 avahi 占用了,所以使用15353

你可以在 /etc/rc.local 文件中配置开机启动。

1
nohup /usr/local/cloudflared proxy-dns --port 15353 &

不同网络层之间协议转换

安装 redsocks 来把无线网卡的流量转发到 socks5 代理,这本质上是转换两个不同网络层的流量。

1
sudo apt install -y redsocks

编辑配置文件 /etc/redsocks.conf

1
2
3
4
5
6
redsocks {
local_ip = 0.0.0.0;
local_port = 12345;
ip = 127.0.0.1;
port = 1080;
}

这里的ip必须改成0.0.0.0,实测如果保留127.0.0.1会让wifi客户端无法上网

这里假设已经有一个开放在 1080 端口的 socks5 服务,可以使用 Shadowsocks 来创建一个。

重启 redsocks 以使配置生效

1
sudo service redsocks restart

忽略国内地址

安装 ipset 来生成国内地址列表

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo apt install -y ipset

# 下载分配给国内运营商的 IP 段
curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | \
grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt

# 创建一个集合并把上述IP段加进去
sudo ipset create chnroute hash:net

cat chnroute.txt | sudo xargs -I ip ipset add chnroute ip

# 上一条命令执行的非常慢,所以把结果保存下来,下次直接从文件恢复
sudo bash -c "ipset save chnroute > /etc/chnroute.ipset"

在系统重启后,使用如下命令来恢复ipset

1
sudo ipset restore < /etc/chnroute.ipset

使用 iptables 来转发流量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sudo iptables -t nat -N SHADOWSOCKS

# 注意这里要把 $server_IP 改成你自己的 socks5 远程IP,即你的VPS IP,不然无法正常工作
sudo iptables -t nat -A SHADOWSOCKS -d $server_IP -j RETURN

# 忽略局域网地址
sudo iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -m set --match-set chnroute dst -j RETURN

# 把流量转发到 12345 端口,即redsocks
sudo iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345
sudo iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS
sudo iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS

覆盖设备自身的 DNS 服务器

因为 Google Home 内置了 DNS 服务器,而不是网关分配的,所以需要把流量截获然后转发到可靠的 DNS 解析。

1
2
sudo iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 15353
sudo iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 15353

至此,搭建完毕,将 Google Home 连接到 wifi 上,就可以开始欢快的使用各种服务啦^_^。

Hey, Google, nice to meet you ~

参考链接及资源

Running a DNS over HTTPS Client

求推荐靠谱的防 dns 污染方案

请教如何修改让dns强制重定向到路由

利用shadowsocks打造局域网翻墙透明网关

用树莓派打造无线中继科学上网路由器

ss-redir 透明代理

Dnsmasq 介绍与使用

利用Dnsmasq部署DNS服务

DNSmasq 安装&配置详解

dnsforwarder

Tcp-DNS-proxy

dns-over-https

https_dns_proxy

Pcap_DNSProxy

---------------------

利用shadowsocks打造局域网翻墙透明网关

update: 这个方案我已经不再使用了,仅在此留作一个记录。目前我已改用软路由方案,用esxi作为虚拟机host,上面建ikuai和lede(openwrt),分别用来做流控和翻墙,感兴趣的童鞋可以参考https://www.vediotalk.com/?p=1055 这篇文章,有比较详细的过程。

另外,如果手上仍然有树莓派又希望能利用上的,我个人有个更好一些的想法,就是将树莓派刷上lede,然后将其作为透明网关,原理和本文下面所述其实是一样的,只不过用lede和shadowsocks插件来取代下面这些繁琐的linux命令行配置

利用shadowsocks科学上网有很长时间了,一开始是在每个手机电脑客户端上都装ss,后来希望能在全家免配置翻墙,于是在路由器上面刷了梅林。不过毕竟支持刷固件的路由器有限,要是哪一天想换支持mesh的路由器就头疼了,于是想到了自建透明网关,这样无论用什么路由器只要能允许手动设置内网网关和DNS服务器那么无需依赖梅林固件也可达到局域网内所有设备自动科学上网的目的

大体思路是:

  1. dnsmasq+China DNS+ss-tunnel解决DNS污染的问题
  2. ss-redir配合iptables和ipset来分流国内流量和国外流量,这样国内的网站直连,而国外网站则走ss-redir

顺便提一下网关,网关其实含义非常丰富,在本文中所谓网关,可以是树莓派,可以是家庭服务器中的一个虚拟机,也可以是一台独立的PC,由于网关即为路由中的下一跳,所以局域网内所有的数据都会首先被发送到这台网关上,由它再来判断是直接发给目标地址,还是走ss。

如下分别是透明网关的物理结构图和数据流逻辑图

网关方案解析:

  1. dnsmasq主要起到DNS缓存作用,DNS请求会被发送给ChinaDNS,ChinaDNS会将请求同时发送给国内的DNS服务器和ss-tunnel,ss-tunnel负责relay给ss服务器,由于ss在国外不会被GFW污染,因此ChinaDNS会得到两个回复并判断其结果是否被污染,最终dnsmasq将得到未被污染的DNS应答
  2. iptables配合ipset负责区分国内和国外流量

网关硬件:

如前所述,可以是树莓派,可以是家庭服务器中的一个虚拟机,也可以是一台独立的PC

网关软件:

Ubuntu 14.04 (如果是树莓派可以是 Raspbian)

安装配置dnsmasq

  1. 安装dnsmasq
sudo apt-get install dnsmasq

2. 修改配置文件 /etc/dnsmasq.conf

no-resolv
server=127.0.0.1#5354

3. 启动dnsmasq

sudo service dnsmasq start

安装配置ChinaDNS

参考ChinaDNS的官方文档

  1. 下载ChinaDNS, 链接
  2. 编译
./configure && make
src/chinadns -m -c chnroute.txt

3. 编译后,将会在src目录里生成可执行文件chinadns,将其拷贝至 /usr/local/bin里面

sudo cp ./src/chinadns /usr/local/bin/

4. 在/etc/init.d/下创建名为chinadns的文件,将如下代码复制进去,记得执行sudo chmod +x /etc/init.d/chinadns 以使其可执行

#!/bin/sh
### BEGIN INIT INFO
# Provides: chinadns
# Required-Start: $network $local_fs $remote_fs $syslog
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start ChinaDNS at boot time
### END INIT INFO
### Begin Deploy Path
# Put this file at /etc/init.d/
### End Deploy Path
DAEMON=/usr/local/bin/chinadns
DESC=ChinaDNS
NAME=chinadns
PIDFILE=/var/run/$NAME.pid
test -x $DAEMON || exit 0case "$1" in
start)
echo -n "Starting $DESC: "
$DAEMON \
-c /etc/chinadns/chnroute.txt \
-m \
-p 5354 \
-s 114.114.114.114,127.0.0.1:5300 \
1> /var/log/$NAME.log \
2> /var/log/$NAME.err.log &
echo $! > $PIDFILE
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
kill `cat $PIDFILE`
rm -f $PIDFILE
echo "$NAME."
;;
restart|force-reload)
$0 stop
sleep 1
$0 start
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0

5. 启动/重启/停止 chinadns

sudo service chinadns start #启动chinadns
sudo service chinadns restart #重启chinadns
sudo service chinadns stop #停止chinadns

安装配置shadowsocks-libev(含有ss-redir以及ss-tunnel)

  1. 详细过程参见官方文档
  2. 如果是Ubuntu 14.04, 执行如下代码
sudo apt-get install software-properties-common -y
sudo add-apt-repository ppa:max-c-lv/shadowsocks-libev -y
sudo apt-get update
sudo apt install shadowsocks-libev

3. 配置/etc/shadowsocks-libev/config.json, 注意,111.111.111.111自己请替换为自己的VPS Server地址,密码“password”请自行修改

{
"server":"111.111.111.111",
"server_port":8388,
"local_address":"0.0.0.0",
"local_port":1080,
"password":"password",
"timeout":60,
"method":"aes-256-cfb",
"mode": "tcp_and_udp"
}

4. 启动ss-tunnel 与ss-redir,注意替换VPS IP和ss的密码password

nohup ss-redir -c /etc/shadowsocks-libev/config.json &
nohup ss-tunnel -s 111.111.111.111 -p 8388 -b 0.0.0.0 -l 5300 -k password -m aes-256-cfb -L 8.8.8.8:53 -u &

开启转发

  1. 修改 /etc/sysctl.conf, 取消注释:
net.ipv4.ip_forward=1

2. 执行命令使其生效

sysctl -p

配置iptables和ipset

  1. 生成国内IP地址的ipset
curl -sL http://f.ip.cn/rt/chnroutes.txt | egrep -v '^$|^#' > cidr_cn
sudo ipset -N cidr_cn hash:net
for i in `cat cidr_cn`; do echo ipset -A cidr_cn $i >> ipset.sh; done
chmod +x ipset.sh && sudo ./ipset.sh
rm -f ipset.cidr_cn.rules
sudo ipset -S > ipset.cidr_cn.rules
sudo cp ./ipset.cidr_cn.rules /etc/ipset.cidr_cn.rules

2. 配置iptables

iptables -t nat -N shadowsocks# 保留地址、私有地址、回环地址 不走代理
iptables -t nat -A shadowsocks -d 0/8 -j RETURN
iptables -t nat -A shadowsocks -d 127/8 -j RETURN
iptables -t nat -A shadowsocks -d 10/8 -j RETURN
iptables -t nat -A shadowsocks -d 169.254/16 -j RETURN
iptables -t nat -A shadowsocks -d 172.16/12 -j RETURN
iptables -t nat -A shadowsocks -d 192.168/16 -j RETURN
iptables -t nat -A shadowsocks -d 224/4 -j RETURN
iptables -t nat -A shadowsocks -d 240/4 -j RETURN
# 以下IP为局域网内不走代理的设备IP
iptables -t nat -A shadowsocks -s 192.168.2.10 -j RETURN
# 发往shadowsocks服务器的数据不走代理,否则陷入死循环
# 替换111.111.111.111为你的ss服务器ip/域名
iptables -t nat -A shadowsocks -d 111.111.111.111 -j RETURN
# 大陆地址不走代理,因为这毫无意义,绕一大圈很费劲的
iptables -t nat -A shadowsocks -m set --match-set cidr_cn dst -j RETURN
# 其余的全部重定向至ss-redir监听端口1080(端口号随意,统一就行)
iptables -t nat -A shadowsocks ! -p icmp -j REDIRECT --to-ports 1080
# OUTPUT链添加一条规则,重定向至shadowsocks链
iptables -t nat -A OUTPUT ! -p icmp -j shadowsocks
iptables -t nat -A PREROUTING ! -p icmp -j shadowsocks

设置网关的默认网关

透明网关需要设置默认的下一跳地址,也就是说,网关在决定了数据包的路由之后应该把数据包送到哪里去,在我们的家庭局域网环境中这个下一跳就是路由器的地址

请留意,192.168.2.1应该是路由器的地址,有的是192.168.0.1,有的是192.168.1.1,需要查看具体的设置

p2p1是网卡,有时候可能是eth0,请自行通过ifconfig 查看自己的网卡代号

route del default
route add default gw 192.168.2.1 p2p1

设置路由器的DNS和DHCP网关

  1. 假设透明网关的IP地址是192.168.2.2,那么将路由器的DNS也设为192.168.2.2
  2. 在路由器的DHCP子项下面将路由器的内网网关设为192.168.2.2

参考文章

  1. https://junnan.org/2017/05/transparent-proxy-server-using-raspberrypi.html
  2. https://yuln.com/thread-30-1-1.html
  3. https://icymind.com/learn-from-gfw/
  4. https://github.com/yqsy/linux_script

from  https://medium.com/@oliviaqrs/%E5%88%A9%E7%94%A8shadowsocks%E6%89%93%E9%80%A0%E5%B1%80%E5%9F%9F%E7%BD%91%E7%BF%BB%E5%A2%99%E9%80%8F%E6%98%8E%E7%BD%91%E5%85%B3-fb82ccb2f729

---------------------

用树莓派打造无线中继科学上网路由器

为什么要做无线中继?因为两个场景:第一个是在我司,WIFI上网同一账户只能连接两个设备,现在两个设备哪里够?第二个场景是在宾馆,我希望就像在家里一样,所有设备都是连上路由器就可以免设置科学上网,这就需要对宾馆原来的WIFI进行处理。


来源:https://story.tonylee.name/2016/03/31/yong-shu-mei-pai-da-zao-wu-xian-zhong-ji-ke-xue-shang-wang-lu-you-qi/

请各位看官注意两个关键字:无线中继 科学上网
  • 为什么要做无线中继?因为两个场景:第一个是在我司,WIFI上网同一账户只能连接两个设备,现在两个设备哪里够?第二个场景是在宾馆,我希望就像在家里一样,所有设备都是连上路由器就可以免设置科学上网,这就需要对宾馆原来的WIFI进行处理
  • 为什么要随时科学上网?我只能说,为了知识和真相
树莓派使用的系统:RASPBIAN JESSIE
另外,因为手头没有路由器,因此,本文介绍利用电脑直连树莓派进行相关设置。不多说,开始了。
1.设置IP
按照树莓派官方的做法,树莓派需要一根网线直连路由器,通过路由器的DHCP分配到IP后,就可以远程登录了。但是刚才已经提到,因为手头没有路由器,所以我们需要用电脑直连树莓派进行远程登录。将制作好的树莓派SD卡插入电脑,会弹出一个名为Boot的磁盘,其中有一个cmdline.txt文件,打开之后,在最后的位置追加一个IP如下:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait ip=192.168.3.1  
插回SD卡至树莓派,通电后,将我们的电脑端IP设置为192.168.3.100,掩码设置为255.255.255.0即可连接树莓派了
2.更改磁盘大小和LOCALE
树莓派默认并没有用足所有的SD卡,具体原因未知。但是也很好调整。运行sudo raspi-config,可以打开树莓派设置窗口:设置窗口第一项,就是将文件系统扩展到整个SD卡。顺便把第五项中的语言项也改了吧,否则在安装软件时,总会提示language没有设置,我一般会选择生成en_US.UTF-8以及zh_CN.UTF-8,默认语言使用赵家语言(选择时,使用空格键来切换选中/未选)。
3.更改WIFI国别
为什么要更改WIFI国别?因为按照规范,各国的频谱不一样,详见这里,如果不更改,树莓派默认使用大英帝国,直接的影响就是,可能某些5G信道会搜索不到。
编辑/etc/wpa_supplicant/wpa_supplicant.conf,更改countryCN
4.安装第一块WIFI适配器
因为我司所在的WIFI环境支持5G信号,因此,在选择WIFI适配器时,我选择了TP-LINK TL-WDN3321,该设备插入即可使用,免驱动。
5.配置基于WPA-EAP的WIFI认证
我司使用了基于PEAP和MSCHAPV2的WPA-EAP的WIFI认证,但是没有使用证书。
配置时,只需要在/etc/wpa_supplicant/wpa_supplicant.conf增加如下段落即可
network={  
    ssid="ssid"
    key_mgmt=WPA-EAP
    eap=PEAP
    identity="id"
    password="password"
    #ca_cert="/etc/cert/ca.pem"
    #phase1="peaplabel=1"
    phase2="auth=MSCHAPV2"
    priority=10
}
更改其中的ssid identitypassword为你所在环境的配置。
配置文件中可以有多个network配置,系统会根据搜索到的ssid来自动匹配
6.连接WIFI
连接WIFI其实就是一个重新加载配置的过程,先执行sudo ifdown wlan0,再执行sudo ifup wlan0即可。之后,可以利用iwconfig命令查看wifi配置是否已经加载,用ifconfig来查看是否分配到IP,如果一切顺利,就应该能够上网了。
7.更改为中科大的源
树莓派的apt-get的源在英国,因此访问起来比较缓慢。感谢中国科学技术大学 Linux 用户协会做了镜像,编辑/etc/apt/source.list,删除其中的内容,使用一下内容代替
deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ jessie main non-free contrib  
之后运行sudo apt-get update来更新源
8.固定接口名称
什么叫固定接口名称?当我们插入WIFI适配器时,尤其是我们的整个方案中,会使用两个WIFI适配器时,系统会随机分配哪个是wlan0,哪个是wlan1。因为两个适配器不一样,会导致运行在上面的配置可能没办法生效。因此,我们必须让系统记住WIFI适配器使用的接口名称。
编辑新增文件/etc/udev/rules.d/10-network.rules,其中的内容如下:
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="wlan0"  
注意其中的mac地址,设置为你的设备的mac地址。获得mac地址,可以使用命令ip link
重启系统后,再插入设备,就会绑定接口名称
9.更改eth0的IP
前面的第一步中,我们使用了一个变相的手法分配了树莓派的IP。但是我发现在该模式一下有一个问题:如果不插网线,树莓派启动时会很长一段时间都在等待插入网线。
既然已经进入了系统,我们自然还原为标准的配置。编辑文件/etc/network/interfaces,将eth0的配置改为如下
auto eth0  
iface eth0 inet static  
    address 192.168.3.1
    netmask 255.255.255.0
然后编辑/boot/cmdline.txt,去掉第一步中增加的IP配置
10.安装dnsmasq来设置DHCP服务
先来说明一下我的网段设置,有线网络使用192.168.3这个网段,而无线AP端,使用192.168.4这个网段。
很多博文使用udhcpd来做作DHCP服务器,但是考虑到将来要科学上网,既然dnsmasq就可以做这个事,那就只用它好了。
使用命令sudo apt-get install dnsmasq,编辑/etc/dnsmasq.conf,注意更改如下几段:
#配置监听地址
listen-address=127.0.0.1,192.168.3.1,192.168.4.1  
#配置DHCP分配段
dhcp-range=192.168.3.50,192.168.3.150,12h  
dhcp-range=192.168.4.50,192.168.4.150,12h  
运行命令sudo service dnsmasq restart来启用
11.开启包转发
Linux系统默认关闭了IP包转发,因此不能做路由器。所以需要先打开包转发
编辑/etc/sysctl.conf,去掉以下属性前的注释:
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1  
运行sudo sysctl -p来启用
之后运行
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE  
来启用wlan0端口的NAT
12.安装iptables-persistent
上一步中,我们启用了一条防火墙规则,但是防火墙规则重启后就丢失了,为了能够规则开机自动加载,我们可以使用iptables-persistent。用命令sudo apt-get install iptables-persistent来安装该组件,根据其提示进行初次设置(一路确认)。该组件默认会将防火墙规则保存到/etc/iptables/rules.v4中。你可以使用如下命令保存和读入规则:
#保存现有规则
sudo service netfilter-persistent save  
#读取并应用先有规则
sudo service netfilter-persistent reload  
为什么服务名称变成了netfilter-persistent,这里面好像有故事,留待以后再digg
13.安装第二块WIFI适配器
第一块WIFI适配器是为了连接现有网络,第二块则是为了建立WIFI热点。为了建立WIFI热点,适配器必须具有AP的mode。可以使用命令iw list|grep -A10 'Supported interface modes'查看。比如,我选用的设备是widemac SL-1506N,其参数如下:
Supported interface modes:  
         * IBSS
         * managed
         * AP
         * AP/VLAN
         * WDS
         * monitor
         * mesh point
该设备依然是插入即可,不需要驱动。
14.设置第二块Adapter的IP
依然是编辑/etc/network/interfaces,更改wlan1的配置如下
auto wlan1  
iface wlan1 inet static  
    address 192.168.4.1
        netmask 255.255.255.0
15.固定第二块WIFI适配器的接口名称
做法类似于第一块,只不过再加入一行而已,接口名称为wlan1,这里就不说了,记得重启让其生效。
16.安装并开启hostapd
Linux启用WIFI热点,使用的是hostapd。首先,用命令sudo apt-get install hostapd安装它,然后增加配置文件/etc/hostapd/hostapd.conf如下:
interface=wlan1  
driver=nl80211  
ssid=ssid  
hw_mode=g  
channel=13  
macaddr_acl=0  
auth_algs=1  
ignore_broadcast_ssid=0  
wpa=2  
wpa_passphrase=passwd  
wpa_key_mgmt=WPA-PSK  
wpa_pairwise=TKIP  
rsn_pairwise=CCMP  
只需要更改其中的ssidwpa_passphrase属性。
之后运行命令sudo hostpad -d /etc/hostapd/hostapd.conf来观察测试,没有错误可以连接,就OK了。 CTRL+C后,编辑/etc/default/hostapd,改变DAEMON_CONF的配置如下
DAEMON_CONF="/etc/hostapd/hostapd.conf"  
之后就可以使用sudo service hostapd start正式启动WIFI热点了

至此,通常一个WIFI中继路由器就好了,以下介绍透明科学上网部分

17.建立无污染DNS
以前都需要使用chinadns等项目,现在基本上都直接使用中科大的DNS,直接无污染。在/etc/dnsmasq.conf,加入如下规则
no-resolv
server=202.38.93.153
server=202.141.162.123
重启dnsmasq,可以用dig t.co测试一下
18.安装shadowsocks
这里首先要说明一下,我找了很久,也没有找到适合树莓派的shadowsocks-libev,因此,我们使用了redsocks+shadowsocks的组合来替代。
树莓派源中的shadowsocks的版本很低,连rc4-md5都不支持。因此,我们使用pip安装,键入sudo pip install shadowsocks即可安装,之后新建配置文件/etc/shadowsocks.conf如下
{
    "server":"xxx.xxx.xxx.xxx",
    "server_port":8964,
    "local_address":"0.0.0.0",
    "local_port":1080,
    "password":"password",
    "timeout":600,
    "method":"rc4-md5"
}
然后用命令sudo sslocal -c /etc/shadowsocks.conf -d start来启动
没有问题,就将sslocal -c /etc/shadowsocks.conf -d start加入/etc/rc.local来让其开机启动
19.安装redsocks
执行sudo apt-get install redsocks来安装软件,之后编辑/etc/redsocks.conf,更改其中的redsocks部分如下
redsocks {  
    local_ip = 0.0.0.0;
    local_port = 12345; 
    ip = 127.0.0.1;
    port = 1080;
}
使用命令sudo service redsocks start来启动软件
可以使用netstat -an|grep 1080netstat -an|grep 12345来确认一下shadowsocks和redsocks都启动了
20.安装ipset并导入chnroute
我们科学翻墙的规则:凡是国外的网站都用shadowsocks加速。因此,我们借助于ipset保存国内ip段。先用sudo apt-get install ipset安装软件
执行命令
curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt  
来导出国内ip段
然后用如下命令导入到ipset
sudo ipset create chnroute hash:net  
cat chnroute.txt | sudo xargs -I ip ipset add chnroute ip  
21.备份ipset并开机载入
各位看官可能已经发现,导入ipset的过程非常缓慢,不适合每次开机都执行。我们可以将ipset的结果保存,每次开机导入。执行如下命令
sudo ipset chnroute save > /etc/chnroute.ipset  
然后在/etc/rc.local中加入如下语句
ipset restore < /etc/chnroute.ipset  
即可开机执行
22.导入防火墙规则
sudo iptables -t nat -N SHADOWSOCKS

sudo iptables -t nat -A SHADOWSOCKS -d $server_IP -j RETURN

sudo iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN  
sudo iptables -t nat -A SHADOWSOCKS -m set --match-set chnroute dst -j RETURN

sudo iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345

sudo iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS  
sudo iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS  
其中server_IP是你的VPS的地址
然后保存规则
sudo service netfilter-persistent save  
23.开机重新生效防火墙规则
既然iptables-persistent可以开机加载防火墙规则,为什么还要谈这个?因为防火墙规则中,有使用到redsocks的端口12345,但是因为启动顺序问题,很可能redsocks还没有启动,防火墙规则先加载了,所以会导致防火墙规则加载失败。因此,我们需要把规则加载放入/etc/rc.local中:
iptables-restore < /etc/iptables/rules.v4  

至此,整个教程就写完了。这些步骤是我实验了三四遍之后的经验所得.

--------------------

树莓派打造科学上网无线路由器(基于Realtek 8192cu网卡)

一直念叨着要把家里的无线路由改成能自动科学上网,但是平时在各种设备上习惯了用SS,懒癌晚期患者说了N长时间都没有动静。直至前几天,小朋友抱怨因为不能访问Google,查资料时搜索引擎都只能用度娘。关乎到下一代成长总得引起足够重视,但是哥穷得实在舍不得花钱买一个新的路由器,想起家里有个已经吃尘差不多两年的Model B树莓派,翻箱倒柜找出来,开始折腾。

以为无非是手到擒来的小case,把树莓派接上电来开始放狗搜,结果还要赔了差不多一个晚上才把它折腾完。原因主要有两个,一是网上大多数使用的无线网卡都是nl80211的,而俺手里只有型号为磊科Netcore NW337的Realtek 8192cu USB无线网卡,而默认的驱动程序并不支持hostapd;二是现在大家用的都是新版本的Raspbian操作系统,而俺是使用吃灰的旧派来折腾。所以此博文并没有多大的技术含量,无非是记录俺安装过程的备忘录,还有就是各种资料拼凑的整合。在此先感谢本文引用的各位大拿的资料。

[heading]硬件与系统[/heading]
系统是Raspbian Wheezy,更新了源后升级到了最新版本固件(sudo rpi-update)。
我利用树莓派的有线网卡连接电信的光猫,USB无线网卡做为网络信号发射器。USB无线网卡使用的是在某东买的磊科Netcore NW337网卡,成本低廉耐操是王道。再重点说明一下,这个网卡的芯片是Realtek 8192cu。利用以下命令可以确认无线网卡的芯片型号。
[highlight dark="no"]$ dmesg | grep 8192cu
[ 7.434462] usbcore: registered new interface driver rtl8192cu[/highlight]

[heading]基本设置[/heading]

1.树莓派基础设置

运行Raspbian系统配置命令,把文件系统扩展到整个SD卡,修改密码等。
$ sudo raspi-config

2.修改系统源
默认的源更新时速度会很慢,备份源文件,修改源至中国科学技术大学 Linux 用户协会的镜像。然后更新源,更新系统固件。
[highlight dark="no"]$ sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak
$ sudo echo "deb deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ wheezy main contrib non-free rpi" > /etc/apt/sources.list
$ sudo apt-get update
$ sudo rpi-update
[/highlight]

3.把eth0的IP设置为固定IP

原来系统的IP是DHCP,把IP地址改为固定,并把默认网关指定为电信光猫的IP。

[highlight dark="no"]$ sudo nano /etc/network/interfaces[/highlight]

把配置信息修改如下:

[highlight dark="no"]auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
[/highlight]

192.168.1.1为电信光猫地址。

4.安装dnsmasq,设置DHCP服务

使用dnsmasq来做DHCP服务器,修改配置文件,设置DHCP的客户端IP网段。

[highlight dark="no"]$ sudo apt-get install dnsmasq

$ sudo nano /etc/dnsmasq.conf[/highlight]

对应修改以下几段内容。

[highlight dark="no"]#配置监听地址
listen-address=127.0.0.1,192.168.1.2,192.168.0.1
#配置DHCP分配段
dhcp-range=192.168.0.100,192.168.0.150,12h [/highlight]

注意192.168.0网段是无线路由分配给客户端的地址段。

重启dnsmasq服务以使更改生效。

[highlight dark="no"]$ sudo service dnsmasq restart[/highlight]

5.开启系统的包转发
Linux系统默认关闭了IP包转发,需要把包转发打开方能使用路由功能。
[highlight dark="no"]$ sudo nano /etc/sysctl.conf[/highlight]

去掉[highlight dark=”no”]net.ipv4.ip_forward=1[/highlight]前的注释,运行以下命令使其生效。同时启用eth0的NAT。

[highlight dark="no"]$ sudo sysctl -p
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE [/highlight]

[heading]Realtek 8192cu网卡驱动的安装[/heading]

正如前文所说,系统默认的Realtek 8192cu网卡驱动并不支持hostapd,所以必须重新编译网卡的驱动。

1.安装内核源

为了编译网卡驱动,你需要系统的内核源,下载Raspbian的内核源至当前用户的honme目录备用。

[highlight dark="no"]$ cd ~
$ sudo wget https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source -O /usr/bin/rpi-source && sudo chmod +x /usr/bin/rpi-source && /usr/bin/rpi-source -q --tag-update
[/highlight]

下载后运行以下命令。

[highlight dark="no"]$ rpi-source[/highlight]

运行时很有可能会提示gcc版本错误,因为内核源所用的gcc版本要比当前树莓派安装的gcc版本要高。用以下命令查看对应的gcc版本并安装新版本。

[highlight dark="no"]$ cat /proc/version
$ gcc --version | grep gcc
$ sudo apt-get update
$ sudo apt-get install -y gcc-4.8 g++-4.8[/highlight]

然后设置gcc版本。

[highlight dark="no"]$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 20
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 20
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50[/highlight]

再一次运行命令安装内核源。

[highlight dark="no"]$ rpi-source[/highlight]

创建内核源目录的符号链接,此步非常重要,不做的话下面的命令会报错。

[highlight dark="no"]$ ln -s ~/linux/arch/arm ~/linux/arch/armv6l[/highlight]

2.重新编译rt8192c网卡驱动程序

系统默认的rt8192c驱动程序不支持AP模式,但是感谢dz0ny提供的代码,让这成为可能。从git克隆代码到本地。

[highlight dark="no"]$ cd ~
$ git clone https://github.com/dz0ny/rt8192cu.git[/highlight]

如果提示没有git请自行安装git。

构建驱动程序并安装。

[highlight dark="no"]$ cd ~/rt8192cu
$ sudo make
$ sudo make install[/highlight]

安装成功后程序会自动把旧的驱动程序放到黑名单里,运行以下命令确认。

[highlight dark="no"]$ cd ~/rt8192cu
$ cat /etc/modprobe.d/blacklist.conf
blacklist rtl8192cu[/highlight]

3.下载hostapd源并编译

网上的资料讲需要到Realtek官网下载hostapd压缩包并解决对应树莓派所需的hostapd源,估计是太旧的原因,现在Realtek官网已没有该文件下载。开始觉得应该在官方源安装个hostapd也可以,于是apt-get install hostapd,折腾了老半天,发现没法启动hostapd,最后还是卸载了,放狗搜到了RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip(下载地址:

https://drive.google.com/file/d/1FQIEU_GcXT-LIAvfxBYu-xE3BY0-r7kt/view?usp=sharing),老老实实的做下来才能正常工作。

上传zip文件到用户目录下,解压。

[highlight dark="no"]$ unzip RTL8192xC_USB_linux_*.zip
[/highlight]

再解决你所需要的hostapd程序。

[highlight dark="no"]$ tar zxvf RTL8188C_8192C_USB_linux_*/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_*.tar.gz[/highlight]

切换到hostapd源,修改Makefile。

[highlight dark="no"]$ cd ~/wpa_supplicant_hostapd-0.8_*/hostapd/
$ sudo nano Makefile
[/highlight]

找到CFLAGS节内容修改为:

[highlight dark="no"]CFLAGS=-MMD -Os
[/highlight]

编译hostapd,并把可执行文件复制至正确位置。

[highlight dark="no"]$ sudo make
$ sudo cp hostapd hostapd_cli /usr/local/sbin/
[/highlight]

4.配置hostapd

创建hostapd配置文件名录,编辑配置文件。

[highlight dark="no"]$ sudo mkdir /etc/hostapd
$ sudo nano /etc/hostapd/hostapd.conf
[/highlight]

我的hotapd.conf文件长这个样子。

[highlight dark="no"]ctrl_interface=/var/run/hostapd
###############################
# Basic Config
###############################
macaddr_acl=0 auth_algs=1
driver=rtl871xdrv
##########################
# Local configuration...
##########################
interface=wlan0
hw_mode=g
ieee80211n=1
wme_enabled=1
channel=13
ssid=Tongfu
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_psk=IL0veT0ngfu
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
[/highlight]

运行命令来验证hostapd配置文件,没有错误提示CTRL+C结束,修改/etc/default/hostapd文件,编辑/etc/default/hostapd,改变DAEMON_CONF的配置为[highlight dark=”no”]DAEMON_CONF=”/etc/hostapd/hostapd.conf”[/highlight] 。

[highlight dark="no"]$ sudo hostpad -d /etc/hostapd/hostapd.conf
$ sudo nano /etc/default/hostapd
[/highlight]

创建初始化脚本到/etc/init.d中,以便设置开机启动AP服务。

[highlight dark="no"]$ sudo nano /etc/init.d/hostapd
[/highlight]

文件代码如下:

[highlight dark="no"]#!/bin/bash
# /etc/init.d/hostapd

### BEGIN INIT INFO
# Provides: hostapd
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Managing hostapd
# Description: This service is used to manage hostapd (WiFi Access Point)
### END INIT INFO

case "$1" in
start)
echo
echo "Starting hostapd..."
echo
if [ ! -d /var/run/hostapd ]; then
rm -rf /var/run/hostapd
mkdir /var/run/hostapd
fi

/usr/local/sbin/hostapd -B -P /var/run/hostapd/wlan0.pid /etc/hostapd/hostapd.conf
;;
stop)
echo
echo "Stopping hostapd..."
echo
if [ -e /var/run/hostapd/wlan0.pid ]; then
read pid < /var/run/hostapd/wlan0.pid if [ x$pid != x ]; then kill $pid fi fi ;; restart) echo echo "Restarting hostapd..." echo if [ -e /var/run/hostapd/wlan0.pid ]; then read pid < /var/run/hostapd/wlan0.pid if [ x$pid != x ]; then kill $pid fi fi if [ ! -d /var/run/hostapd ]; then rm -rf /var/run/hostapd mkdir /var/run/hostapd fi /usr/local/sbin/hostapd -B -P /var/run/hostapd/wlan0.pid /etc/hostapd/hostapd.conf ;; *) echo echo "Usage: /etc/init.d/hostapd start|stop|restart" echo exit 1 ;; esac exit 0 [/highlight]

赋予文件可执行,并且开机启动。

[highlight dark="no"]$ sudo chmod +x /etc/init.d/hostapd
$ sudo update-rc.d hostapd defaults
[/highlight]

现在启动hostapd服务,应该可以用电脑搜到热点并连接了。

[highlight dark="no"]$ sudo service hostapd start
[/highlight]

至此,利用Realtek 8192cu USB无线网卡在树莓派建立无线路由器的工作已完成,你可以通过无线网络连接路由,正常的上网浏览了。但是要透明的访问Google,还是得进行科学上网的设置。

[heading]科学上网配置[/heading]

1.建立无污染DNS
使用中科大的DNS,修改/etc/dnsmasq.conf。
[highlight dark="no"]$ sudo nano /etc/dnsmasq.conf
[/highlight]

在文件最后加入以下规则:

[highlight dark="no"]no-resolv
server=202.38.93.153
server=202.141.162.123
[/highlight]

重启dnsmasq。

[highlight dark="no"]$ sudo service dnsmasq restart
[/highlight]

2.安装shadowsocks

通过pip安装shadowsocks,建立配置文件

[highlight dark="no"]$ sudo pip install shadowsocks
$ sudo nano /etc/shadowsocks.conf
[/highlight]

配置文件内容如下:
[highlight dark="no"]
{
"server":"xxx.xxx.xxx.xxx",
"server_port":9999,
"local_port":1088,
"password":"xxxxx",
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false,
"workers": 1
}
[/highlight]

保存文件后启动ss服务。

[highlight dark="no"]$ sudo sslocal -c /etc/shadowsocks.conf -d start
[/highlight]

如果没有问题把命令加入/etc/rc.local来实现开机自启动。

3.安装redsocks

安装redsocks并编辑配置文件。

[highlight dark="no"]$ sudo apt-get install redsocks
$ sudo nano /etc/redsocks.conf
[/highlight]

修改配置文件的redsocks部分。

[highlight dark="no"]
redsocks {
local_ip = 0.0.0.0;
local_port = 12345;
ip = 127.0.0.1;
port = 1088;
}
[/highlight]

启动redsocks,确认ss和redsocks都启动

[highlight dark="no"]$ sudo service redsocks start
$ netstat -an|grep 1088
$ netstat -an|grep 12345
[/highlight]

4.安装ipset并导入chnroute

科学上网的规则:凡是国外的网站都用shadowsocks加速。因此,我们借助于ipset保存国内ip段。

安装ipset,导出国内ip地址段,再导入到ipset

[highlight dark="no"]$ sudo apt-get install ipset
$ curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt
$ sudo ipset create chnroute hash:net
$ cat chnroute.txt | sudo xargs -I ip ipset add chnroute ip
[/highlight]

5.备份ipset并开机载入

导入ipset的过程非常缓慢,不适合每次开机都执行。我们可以将ipset的结果保存,每次开机导入。

[highlight dark="no"]$ sudo ipset save chnroute > /etc/chnroute.ipset
[/highlight]

然后在/etc/rc.local中加入如下语句,实现开机启动。

[highlight dark="no"]
ipset restore < /etc/chnroute.ipset [/highlight]

6.导入防火墙规则

[highlight dark="no"]sudo iptables -t nat -N SHADOWSOCKS

sudo iptables -t nat -A SHADOWSOCKS -d $server_IP -j RETURN

sudo iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -m set --match-set chnroute dst -j RETURN

sudo iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345

sudo iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS
sudo iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
[/highlight]

其中$server_IP是你的VPS的地址,保存规则后确认可以正常翻墙。可把规则加载写入到/etc/rc.local中,实现开机重新生效防火墙规则。

在客户端连接此无线路由,开始自由自在的上网吧。

[heading]引用与感谢[/heading]

没有网上前人大量的实验和分享的文章,俺绝对是没办法自己搞定树莓派无线路由的设置的,特别感谢以下博客文章。

1.来自Wannabe Nerd RandomnessWiFi access point using a Realtek 8192cu based USB WiFi dongle with a Raspberry Pi,本文关于Realtek 8192cu网卡的设置引用均来自此文章,thanks Jack Flushell for your great sharing.

------

Raspberry Pi3 打造无线中继服务器 

不妨就单开个热点做梯子用,其实中继模式和桥接模式很类似,表面上看可以简单的说只是无线SSID广播不同的信号,实际在实现上还是有诸多区别,这里就记一下所趟的坑。

准备工作

主要参考了网上的教程
我的是一个板子(包含内置的有线网卡eth0和无线网卡wlan0),一根网线,一个无线网卡wlan1(用来做梯子用)。

Static IP

之前已经准备好了eth0静态ip, wlan0动态获取。主要是有线网卡比较稳定适合用静态ip。
静态ip设置参照这里
后面修改 /etc/network/interfaces/etc/dhcpcd.conf 分别添加以下配置:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# modify /etc/network/interfaces
sudo vim /etc/network/interfaces

# add wlan1 configuration
allow-hotplug wlan1
auto wlan1
iface wlan1 inet manual

# modify /etc/dhcpcd.conf
sudo vim /etc/dhcpcd.conf

# add wlan1 dhcp configuration
interface wlan1
static ip_address=192.168.20.1/24
static routers=192.168.11.1
static domain_name_servers=114.114.114.114 119.29.29.29

DNS

然后修改 /etc/dnsmasq.conf配置wlan1网段(192.168.20.0/24):
Bash
1
2
3
4
5
6
7
8
9
10
11
12
# modify /etc/dnsmasq.conf
sudo vim /etc/dnsmasq.conf

# uncomments add configuration
no-resolv
server=202.38.93.153
server=202.141.162.123
server=114.114.114.114
server=119.29.29.29

listen-address=127.0.0.1,192.168.20.1
dhcp-range=192.168.20.50,192.168.20.150,12h

Forward

开启包转发 sudo vim /etc/sysctl.conf
Bash
1
2
3
4
5
6
7
8
# uncomment
net.ipv4.ip_forward=1

# run
sudo sysctl -p

# add iptables rule (nat rule for wlan0)
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
PS.Tips: 使用iptables-persistent将防火墙rules保存至/etc/iptables/rules.v4
Bash
1
2
3
4
5
6
7
8
9
# save current rules
sudo service netfilter-persistent save
#read current rules
sudo service netfilter-persistent reload

# reload rules when restart rasp
sudo vim /etc/rc.local
# add configuration
iptables-restore < /etc/iptables/rules.v4

Hostapd

首先需要确保当前网卡wlan1是否具有APmode或用来做中继或桥接的功能。iw list|grep -A10 'Supported interface modes'
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# install hostapd
sudo apt-get install hostapd

# check wlan adapter support current driver
lsusb

# currently, my driver need use r8712u
# Bus 001 Device 005: ID 0bda:8171 Realtek Semiconductor Corp. RTL8188SU 802.11n WLAN Adapter
# if hostapd doesn't support current dirver, need find driver related hostapd and manually make it

# modify hostapd configuration
sudo /etc/hostapd/hostapd.conf

# add configuration
interface=wlan1
driver=r8712udrv
ssid=My_SSID_Name
channel=10
wmm_enabled=1
wpa=2
wpa_passphrase=MYPASSWORD
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
auth_algs=1
macaddr_acl=0

# test hostadp
sudo hostapd -d /etc/hostapd/hostapd.conf

# change DAEMON_CONF path
sudo /etc/default/hostapd

DAEMON_CONF="/etc/hostapd/hostapd.conf"

# start SSID
sudo service hostapd start

梯子部分

Shadowsocks

使用redsocks + shadowsocks, 直接sudo pip install shadowsocks
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# create shadowsocks json configuration
sudo vim /etc/shadowsocks.json

# add json content
{
"server":"xxx.xxx.xxx.xxx",
"server_port":8989,
"local_address":"0.0.0.0",
"local_port":1080,
"password":"password",
"timeout":600,
"method":"aes-256-cfb"
}

# test
sudo sslocal -c /etc/shadowsocks.json -d start

# add autostart
sudo sh -c "sslocal -c /etc/shadowsocks.conf -d start >> /etc/rc.local"

Redsocks

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# install
sudo apt-get install redsocks

# modify /etc/redsocks.conf
sudo vim /etc/redsocks.conf

redsocks {
local_ip = 0.0.0.0;
local_port = 12345;
ip = 127.0.0.1;
port = 1080;
}

# start
sudo service redsocks start

IPset Rule

凡是国外ip都采用shadowsocks, 其实这条规则有点大,如果下载BT的话风险会很大。目前先按tony1016的配置来。
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
# execute command
curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt

# export ip to ipset
sudo ipset create chnroute hash:net
cat chnroute.txt | sudo xargs -I ip ipset add chnroute ip

# set autostart
sudo sh -c "ipset save chnroute > /etc/chnroute.ipset"

sudo vim /etc/rc.local
# add configuration
iptables-restore < /etc/iptables/rules.v4

Firewall Rule

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# general rule for wlan0 wlan1
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -i wlan0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT

# shadowsocks rule
sudo iptables -t nat -N SHADOWSOCKS
sudo iptables -t nat -A SHADOWSOCKS -d 67.216.202.107 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -m set --match-set chnroute dst -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345
sudo iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS
sudo iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS

# save rules to /etc/iptables/rules.v4
sudo sh -c "iptables-save > /etc/iptables/rules.v4"

 from https://archive.is/O4Jod#selection-333.5-2571.40

--------

将树莓派Raspberry Pi设置为无线路由器

最近又开始折腾起Raspberry Pi来了,因为某处上网需要锐捷拨号,于是我就想能不能让我的树莓派代劳,当然首先要将其改造为路由器,默认自带的网口作为WAN口,我们还缺一个网口,木有办法,只好占用一个USB口,接上一个USB网卡,网上的USB转RJ45网线口的适配器比较少,价格也不便宜,于是就考虑干脆将其改造成无线路由,也符合时下高端大气上档次的标准。
准备工作,当然要先去购买一个USB无线网卡,可以购买的型号比较多,Raspberry Pi官方也提供了 兼容性列表 供大家参考,具体猛击这里。我这里购买的是 网件(Netgear)WNA1000M 150M迷你USB无线网卡
较为官方的介绍配置为无线热点的文章莫过于这一篇 《RPI-Wireless-Hotspot》 。但是实际配置下来始终无法成功。但是无线网卡确实能够被识别,可以通过 lsusb lsmod 查看到,不过我注意到这款无线的芯片型号是RealTek RTL8188CUS,初步怀疑是驱动问题。
lsusb WiFi Adapter
当然看到别人的老款无线网卡都配置成功了心里难免痒痒的,当然也不能再浪费银子去再买个网卡,于是只好自己摸索,不过天无绝人之路,在N次刷机重装系统后,终于找到了成功的办法,其实关键的文章就在上面那篇文章的一个链接中 《Turn Your Raspberry Pi Into a WiFi Hotspot with Edimax Nano USB EW-7811Un (RTL8188CUS chipset)》
好了,下面我将实践的过程记录下来供大家参考,当然 主要参考了上面两篇文章 ,这里是配置的回忆,我尽量记录详细,遗漏之处望指出。
1. 安装系统(如果系统已经安装可以跳过这一步)
1.1 尽量使用最新系统,首先下载 官方最新镜像 ,然后使用 Win32DiskImager 烧录到SD卡上。注意这里我们选用的是Raspbian。
1.2 Raspberry Pi连接上无线网卡,然后系统镜像刷入SD卡后,我们连接显示器键盘和鼠标进行初始化配置工作,当然没有条件的话推荐直接使用SSH连接Raspberry Pi,这样更方便,因为新系统默认开放了SSH管理。
Raspbian download
连接信息主要如下:
主机名 : raspberrypi
用户名 : pi
密  码 : raspberry
如果你是直接通过SSH连接到Raspberry Pi的话,下面的配置步骤是必要的:
1.2.1 初始化配置,下面的配置只有在新安装的系统内需要,仅做一次。
运行下面的命令,进入配置界面:
sudo raspi-config
Raspberry Configuration Internationalisation Options
推荐更新下面的配置选项( 新配置界面 ):
1 Expand Filesystem
2 Change User Password
4 Internationalisation Options
  I1 Change Locale
  I2 Change Timezone
8 Advanced Options
  A3 Memory Split
  A6 Update
旧配置界面
update
expand_rootfs
change_pass
change_timezone
memory_split
这里要注意 Memory Split/memory_split ,默认预留给图形界面的是 64MB ,作为一台无线路由基本上就用不到图形界面了,很显然 64MB 略有奢侈,我们将其改成 32MB
最后 Finish 完成初始化配置。系统会自动提示重启,如果没有按预期重启,请使用下面的命令重启系统:
sudo shutdown -r now
2. 安装hotspot(hostapd)
sudo apt-get install bridge-utils hostapd
hostapd实现的是无线共享, 但需要注意的是官方提供的程序不兼容RTL8188CUS芯片的无线网卡,不过Edimax团队为我们专门编译了兼容的版本,下面的操作需要替换hostapd为兼容版本。
替换的命令如下:
wget http://www.daveconroy.com/wp3/wp-content/uploads/2013/07/hostapd.zip
unzip hostapd.zip 
sudo mv /usr/sbin/hostapd /usr/sbin/hostapd.bak
sudo mv hostapd /usr/sbin/hostapd.edimax 
sudo ln -sf /usr/sbin/hostapd.edimax /usr/sbin/hostapd 
sudo chown root.root /usr/sbin/hostapd 
sudo chmod 755 /usr/sbin/hostapd
接下来提供两种方案,一种是桥接方式设置热点,有点类似交换机工作原理,将网线口的信号转换为无线,另外一种则是路由方式实现无线上网,和大部分路由器工作方式一样。
3. 桥接的方式设置WiFi热点(方案一)
3.1 安装必备程序
sudo apt-get install bridge-utils
3.2 配置网卡
编辑网卡配置文件:
sudo nano /etc/network/interfaces
注释掉所有的关于无线网卡的部分,最后应该变成下面所示:
#allow-hotplug wlan0
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp
加上下面这段桥接配置:
auto br0
iface br0 inet dhcp
bridge_ports eth0 wlan0
最终的配置主要由以下几个部分组成:
#loopback adapter
auto lo
iface lo inet loopback
#wired adapter
iface eth0 inet dhcp
#bridge
auto br0
iface br0 inet dhcp
bridge_ports eth0 wlan0
3.3 配置hostapd
sudo nano /etc/hostapd/hostapd.conf
配置信息如下:
interface=wlan0
driver=rtl871xdrv
bridge=br0
ssid=My_SSID_Name
channel=1
wmm_enabled=0
wpa=1
wpa_passphrase=MYPASSWORD
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
auth_algs=1
macaddr_acl=0
配置文件具体我就不说了,想必大家看内容也知道各项的含义,保存这个配置文件。
3.4 重启并测试hostapd
sudo reboot
重启完成后,使用下面的命令测试是否正确:
sudo hostapd -dd /etc/hostapd/hostapd.conf
如果没有错误的话,你这时应该能搜索到你所配置的无线信号。然后Ctrl+C退出这个测试。
如果一切正常的话,我们可以设置hostapd的配置文件路径了。
sudo nano /etc/default/hostapd
去掉注释符号并改动下面这行为我们的配置文件路径:
DAEMON_CONF="/etc/hostapd/hostapd.conf"
桥接方式配置完成!
4. 路由的方式设置WiFi热点(方案二)
4.1 安装必备程序
sudo apt-get install udhcpd
udhcpd主要为连接到WiFi的设备自动分配IP地址的,当然你也可以换用你所熟悉的软件。
4.2 配置udhcpd,编辑 /etc/udhcpd.conf ,主要内容如下:
start 192.168.42.2 # This is the range of IPs that the hostspot will give to client devices.
end 192.168.42.20
interface wlan0 # The device uDHCP listens on.
remaining yes
opt dns 8.8.8.8 4.2.2.2 # The DNS servers client devices will use.
opt subnet 255.255.255.0
opt router 192.168.42.1 # The Pi's IP address on wlan0 which we will set up shortly.
opt lease 864000 # 10 day DHCP lease time in seconds
接下来编辑 /etc/default/udhcpd 并且将下面这行注释掉,以使DHCP Server正常工作:
#DHCPD_ENABLED="no"
4.3 配置无线网卡
通过下面的命令给无线网卡设置一个IP地址:
sudo ifconfig wlan0 192.168.42.1
当然为了下次启动仍然有效,我们需要配置 /etc/network/interfaces 文件:
sudo nano /etc/network/interfaces
注释掉所有的关于无线网卡的部分,最后应该变成下面所示:
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp
注意保留 allow-hotplug wlan0 ,英文原文是不保留的,但是我操作下来发现如果不保留这段的话,无线网卡有时无法正常配置IP,最后无线网卡IP的配置信息如下:
allow-hotplug wlan0
iface wlan0 inet static
  address 192.168.42.1
  netmask 255.255.255.0
4.4 编辑hostapd配置
sudo nano /etc/hostapd/hostapd.conf
内容如下:
interface=wlan0
driver=rtl871xdrv
ssid=My_SSID_Name
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=MYPASSWORD
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
4.7 启动IP转向功能以便于开通NAT
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
编辑 /etc/sysctl.conf 改动下面这行:
net.ipv4.ip_forward=1
4.8 配置iptables防火墙
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
到这里路由的NAT功能已经被启用,我们将刚才配置的iptables保存下来以便于下次使用:
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
编辑 /etc/network/interfaces 然后在最后加上下面这行以使每次启动都自动加载iptables配置:
up iptables-restore < /etc/iptables.ipv4.nat
4.9 重启并测试hostapd
sudo reboot
重启完成后,使用下面的命令测试是否正确:
sudo hostapd -dd /etc/hostapd/hostapd.conf
如果没有错误的话,你这时应该能搜索到你所配置的无线信号。然后Ctrl+C退出这个测试。
如果一切正常的话,我们可以设置hostapd的配置文件路径了。
sudo nano /etc/default/hostapd
去掉注释符号并改动下面这行为我们的配置文件路径:
DAEMON_CONF="/etc/hostapd/hostapd.conf"
4.10 启动相应软件,并加入启动项
sudo service hostapd start
sudo service udhcpd start
sudo update-rc.d hostapd enable
sudo update-rc.d udhcpd enable
Raspberry Pi with NetGear
2013年12月12日更新
最近经常发现无线网卡配置的DHCP不能发挥作用,经过排查发现给无线网卡指定的静态IP失败了,也就是说无线网卡没有IP导致DHCP无法工作,在网上找到这篇文章 《Why won't dnsmasq's DHCP server work when using hostapd?》 ,根据内容我将 /etc/default/ifplugd 的内容修改配置如下:
INTERFACES="eth0"
HOTPLUG_INTERFACES="eth0"
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"
重启了几次进行测试,结果一切正常!
Posted in:
  • 计算机应用及维护
  • Unix/Linux/BSD系统
Tagged
  • 网络组建
  • Linux
  • debian
  • 单片机
  • RaspberryPi
  • 无线WiFi
Content licensed under the Creative Commons CC BY 2.5,
unless otherwise stated or granted, code samples licensed under the MIT license.
文章内容基于创作共同性署名 2.5 通用 (CC BY 2.5)许可,未经特别说明的原创代码示例基于MIT许可协议

168 thoughts on this post

  1. 请问你是用树莓派的网口进行学校锐捷上网,然后通过树莓派的usb-wifi把网络共享出来,然后手机、pad可以搜索到无线信号,接入后上网?
    1. 是的,正是这么设计的,类似于路由器,eth0作为WAN口拨号锐捷联网,wlan0作为其他设备上网的LAN口。
      1. 请问一下,如果树莓派不接网线,那么这个wifi热点还会工作吗?应该还是能组成一个局域网吧?只是不能连接外网,是吧?
        1. 理论上是这样的,如果不接网线,WiFi热点依然可以正常工作,然后连接的设备将组成局域网。
          1. 谢谢!我现在有个问题,我用自己的笔记本的无线网卡做了wifi热点,是按照这篇文章http://www.luyouqiwang.com/14868/做的,现在那个有线的本地连接不能分配ip地址了,我设置静态ip地址,他就自动变成192.168.137.1了,我把原来那个无线连接禁用,把新安装的那个无线热点也禁用了,还是一样。而且工具栏右边那个网络连接的图标也不见了。这个问题不知道您遇到过没有?
            1. 抱歉,还真没有遇到这个情况,看到你所描述的IP地址有点像连接共享ICS设置所生成的地址,你对本地连接(可以上网的那个)右击属性,选择“共享”选项卡,然后勾选“允许其他网络用户通过此计算机的 Internet 连接来连接”和“允许其他网络用户控制或禁用共享的Internet连接”试试。
            1. 感谢你的分享,不过经过你这么一描述,我有些迷糊了,你是用笔记本的无线网卡共享WiFi还是用树莓的USB无线网卡共享WiFi的呢?
  2. 你好,我想问你一些关于树莓派通过drcom拨号设置热点分享的一些细节问题,所以我能不能得到你的联系方式比如QQ,微信或者其他的 好让我详细的向你求教?
    1. 抱歉,因为某些原因不太方便使用QQ等社交工具,如果你有什么疑问的话,可以直接通过右上角的电子邮箱与我联系,将所遇到的问题描述发给我:-)
  3. 为什么你用pi做热点可以成功楠?我记得我用win7做热点直接就被卡下来了,还有我们学校的客户端不支持linux系统那不是用不了?
    1. Raspberry Pi上面运行的是基于Linux的类Debian系统,和Windows 7的系统不是一个系统,所以本文叙述的方法不适用于Windows系统,如果你只是在Windows下实现相关功能,直接安装Windows版本的学校拨号客户端,然后安装相应的无线分享的软件即可。
  4. 博主你好,我想问下你是怎么让派通过锐捷脸上校园网的。我把我们校园网的rjsupplicant的linux版在pi上运行,报错。可它在CentOS和ubuntu上都好好的。还有怎么给pi配置ip、掩码之类的呢。额,问了好多,那我还是自己先去Google一圈
    1. 你好,我是这样操作的:下载并编译mentohust,然后编辑配置文件mentohust.conf,最后直接编写一段脚本开机调用mentohust进行拨号的,以前锐捷官方有个Linux拨号程序,后来发现用不了了,现在在学校只有mentohust可以正常使用。 sudo nano /etc/network/interfaces直接编辑网络设置文件可以给pi设置IP和掩码,可以看文中的方法,比如这样的:
      iface eth0 inet static
        address 192.168.42.1
        netmask 255.255.255.0
      就可以给eth0设置静态IP和掩码了。 如果你有其他问题欢迎提出,没事的。
  5. 博主你好,请问能不能给你的这套系统在增加一个WiFi登录认证机制呢?类似于这样”无线天“这样的软件效果,安装WiFi登录认证软件的电脑、智能手机、无线路由器在同一个网络就可以了,不需要设置路由器,也无需特殊设备,能不能实现这样的效果?
    1. 我估计你所需要的是类似于无线Web身份认证上网的东东,开放式无线,连接后弹出Web认证页面进行二次认证。这玩意儿实现主要有NoCatAuth或者NoCatSplash,一般在DD-WRT上成功应用得比较多,可以参考这里。 对于树莓派来说,我没有能够成功编译这两个软件,网上也有替代的方法,我也没有亲自尝试过,感兴趣的话可以查阅这些链接:captive portal using linux and iptables(可能需要代理访问)Using iptables and PHP to create a captive portalCaptive Portal Using PHP and iptables Firewall on Linux。 希望对你有所帮助:-)
  6. 我想问下,有没有什么设备可以增强它的同时在线设备数量,大概增加到五十至一百台
    1. 增加在线设备数量主要的瓶颈在于性能,众所周知的是树莓派的CPU一直是性能的短板,如果你要支持大的吞吐量或者在线设备的话,考虑到服务的稳定性建议换用专业的网络设备,树莓派平时玩玩或者自己用用还是可以的。 倘若在现有硬件配置不变的情况下,最大限度的挖掘树莓派的潜能,只有去考虑精简系统了,搞个类似于路由器用的实时定制系统,或许也可以实现吧。
  7. 楼主,你好,谢谢分享。 我按照你的教程,出了个问题,就是我的无线USB网卡的芯片是RTL8191CU的,是不是hostapd不能在这上面使用呢?必须要下载一个高版本的hostapd?如果是的话,能否告知怎么去下载呢?
  8. 楼主,您好,感谢您的分享。 请问,hostapd是不是不能在RTL8191CU上运行啊,我按照您的教程失败了,有什么解决的方案吗?
    1. 这个比较棘手,一般我开始也是这样,安装官方的hostapd不能直接使用,后来是下载的第三方编译的hostapd包(原文有叙述),如果第三方编译包不可用的话,只有尝试到Realtek网站下载官方的Linux驱动再手动编译了。 需要注意的是,如果是树莓派请查看兼容性列表,因为有些无线网卡可能本身就不支持树莓派。 非常抱歉的是可能是因为这个型号比较新,谷歌上没有找到相关的信息(关键词:RTL8191CU hostapd raspberry)。
  9. 博主你好 编辑hostapd配置 /etc/hostapd/hostapd.conf interface=wlan0 driver=rtl871xdrv 这个不理解 开篇写的是 RTL8188CUS
  10. 非常感谢博主! 按照这篇教程,很顺利的成功了。 之前找到的教程会遇到hostapd无法正常使用的问题 替换后完美解决!
    1. 你好,根据你的描述,可能是树莓派的DHCP服务程序没有配置好,你可以试着给客户端指派一个静态IP然后再试试看。
      1. 博主,你好,IP地址问题已解决,是我的无线网卡没配置好。现在遇到另一个问题,手机连上树莓派AP之后,手机不能上网(树莓派有线接口连接正常),请问,这个该怎么解决。
        1. 可能是iptables或者ip_forward转向没有设置好,建议参考我原文中关于iptables和ip_forward的相关配置。
          1. 这个问题需要这样修复: 下载hostapd源码 nano src/ap/ieee802_11.c 修改两处, 将代码中的 return 注释掉: if (!ok) { hostapd_logger(hapd, mgmt->da, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_NOTICE, "did not acknowledge authentication response"); //return; } if (!ok) { hostapd_logger(hapd, mgmt->da, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_DEBUG, "did not acknowledge association response"); sta->flags &= ~WLAN_STA_ASSOC_REQ_OK; //return; } 重新编译安装,即可修复此问题。
  11. 高手,热点完成后,做过休眠唤醒的动作吗?休眠唤醒后热点不能正常工作了,必须kill hostapd然后reboot hotapd热点才可正常工作。您知道这是怎么回事吗?
    1. 你所描述的问题我目前没有遇到过,只是我之前发现一个奇怪的现象,那就是我的网件(NetGear)无线网卡经常会无法启动,需要从树莓派上拔下再插上才可以,后来重新购买了EDUP的网卡才解决问题,一直以为是网件网卡的问题,但是其在Windows下工作完全正常,不过后来安装到Ubuntu台式机上又出现那种网卡无法启动的现象(网卡灯也亮),根据网上手动激活网卡,或者重新拔插网卡才可以,过了很长时间后,我发现该网卡又神奇的好了,这个问题一直没有找到相关文档叙述,所以也就作罢。 hostapd修改版目前托管到GitHub,据目前你所述,可以看看是不是hostapd的Bug,最新版本在:https://github.com/jenssegers/RTL8188-hostapd 部署方法参考:http://jenssegers.be/blog/43/realtek-rtl8188-based-access-point-on-raspberry-pi 希望对你有所帮助。
  12. 问一下博主用的volumio是哪个版本?我敲命令配置热点的时候,发现很多文件都没不存在,需要自己创建,但是自己创建后又不能成功。。。
  13. 非常感谢您的教程~~我在官方的镜像下完成了撇子 但是配置完成后一直显示密码错误~~~ 改成其他密码还是这样~~ 可能是啥原因啊,不解啊 谢谢
    1. 你是指无线密码错误吗?如果是这样的,你可以检查/etc/hostapd/hostapd.conf配置文件其中的配置项wpa_passphrase=MYPASSWORD,这里MYPASSWORD是你要定义的无线密码。
      1. 谢谢了~估计是这个网卡功率太低~~~走近了才行~~ 非常感谢楼主的帮助啊。因为我的是volumio,所以配置的时候大费周折啊~~还在终于可以了,主要前面要敲上这段命令“sudo apt-get install hostapd usb-modeswitch hostap-utils iw bridge-utils” 随便有两个问题请教,如果用第一种办法的话,4.10的命令需要吗?还是只针对第二种办法的? “ sudo service hostapd start sudo service udhcpd start sudo update-rc.d hostapd enable sudo update-rc.d udhcpd enable ” 因为我用第一种方法,也敲了这4个命令,但是出现了错误,这样会有其他问题吗? “ pi@volumio:~$ sudo service udhcpd start udhcpd: unrecognized service pi@volumio:~$ sudo update-rc.d hostapd enable update-rc.d: using dependency based boot sequencing pi@volumio:~$ sudo update-rc.d udhcpd enable update-rc.d: using dependency based boot sequencing update-rc.d: error: cannot find a LSB script for udhcpd "
        1. 很奇怪,你的命令提示好像是没有安装udhcpd和hostapd这两款软件。 下面两个命令都成功执行了吗? sudo apt-get install hostapd sudo apt-get install udhcpd 对了,hostapd可能需要替换,我原文中有介绍。
  14. 樓主您好 請問您在文章最後面 4.10 启动相应软件,并加入启动项 sudo service hostapd start sudo service udhcpd start 這兩行我好像執行不了 請問這跟我目前有訊號無法連線有關係嗎? 有解決辦法嗎? 謝謝
    1. 你好,感謝您對我Blog的關注,這兩項不能正常啟動,對你的熱點使用是有關係的,其中hostapd是熱點提供軟體,udhcpd是設備連接到無線熱點後自動分配網路IP地址的,特別是hostapd的啟動失敗將會直接導致WiFi熱點無法正常工作。 因為沒有更多的資訊,暫時無法判別你所遇到的問題,建議重新安裝這兩款軟體:
      sudo apt-get update # 更新數據源
      sudo apt-get --purge remove hostapd # 卸載先前安裝
      sudo apt-get install hostapd # 安裝hostapd
      
      # 下面替換hostapd為可用版本
      wget http://www.daveconroy.com/wp3/wp-content/uploads/2013/07/hostapd.zip
      unzip hostapd.zip
      sudo mv /usr/sbin/hostapd /usr/sbin/hostapd.bak
      sudo mv hostapd /usr/sbin/hostapd.edimax
      sudo ln -sf /usr/sbin/hostapd.edimax /usr/sbin/hostapd
      sudo chown root.root /usr/sbin/hostapd
      sudo chmod 755 /usr/sbin/hostapd
      
      sudo apt-get --purge remove udhcpd # 卸載先前安裝
      sudo apt-get install udhcpd # 安裝hostapd
  15. 樓主我又嘗試了重新安裝 可是我發現好像在安裝時就有錯誤 我用的網卡是(D-Link Wireless N150 Pico USB無線網卡) 會是網卡的關係嗎? 我有照片但不會傳上來 不好意思...
    1. 錯誤信息 sudo apt-get install hostapd Reading package lists... Done Building dependency tree Reading state information... Done hostapd is already the newest version. 0 upgraded, 0 newly installed, 0 to remove and 91 not upgraded. 1 not fully installed or removed. After this operation, 0 B of additional disk space will be used. Do you want to continue [Y/n]? y Setting up hostapd (1:1.0-3+deb7u1) ... /etc/init.d/hostapd: 1: /etc/default/hostapd: Defaults: not found /etc/init.d/hostapd: 3: /etc/default/hostapd: See: not found /etc/init.d/hostapd: 4: /etc/default/hostapd: methods: not found /etc/init.d/hostapd: 6: /etc/default/hostapd: Uncomment: not found and: ERROR: cannot open `and' (No such file or directory) hostapd: ERROR: cannot open `hostapd' (No such file or directory) will: ERROR: cannot open `will' (No such file or directory) be: ERROR: cannot open `be' (No such file or directory) started: ERROR: cannot open `started' (No such file or directory) during: ERROR: cannot open `during' (No such file or directory) system: ERROR: cannot open `system' (No such file or directory) boot.: ERROR: cannot open `boot.' (No such file or directory) An: ERROR: cannot open `An' (No such file or directory) example: ERROR: cannot open `example' (No such file or directory) configuration: ERROR: cannot open `configuration' (No such file or directory) can: ERROR: cannot open `can' (No such file or directory) be: ERROR: cannot open `be' (No such file or directory) found: ERROR: cannot open `found' (No such file or directory) at: ERROR: cannot open `at' (No such file or directory) /usr/share/doc/hostapd/examples/hostapd.conf.gz: gzip compressed data, from Unix, max compression /etc/init.d/hostapd: 12: /etc/default/hostapd: Additional: not found /etc/init.d/hostapd: 13: /etc/default/hostapd: Syntax error: "(" unexpected invoke-rc.d: initscript hostapd, action "start" failed. dpkg: error processing hostapd (--configure): subprocess installed post-installation script returned error exit status 2 Errors were encountered while processing: hostapd E: Sub-process /usr/bin/dpkg returned an error code (1)
      1. 你好,出現這個錯誤的原因是默認的配置文件/etc/default/hostapd損壞或者編輯錯誤,注意注释部分起始的#号不要丢失,DAEMON_CONF="/etc/hostapd/hostapd.conf"这一行前面的注释符号#应该去除,并指向配置文件路径。正確的示例應該是這樣的:
        # Defaults for hostapd initscript
        #
        # See /usr/share/doc/hostapd/README.Debian for information about alternative
        # methods of managing hostapd.
        #
        # Uncomment and set DAEMON_CONF to the absolute path of a hostapd configuration
        # file and hostapd will be started during system boot. An example configuration
        # file can be found at /usr/share/doc/hostapd/examples/hostapd.conf.gz
        #
        DAEMON_CONF="/etc/hostapd/hostapd.conf"
        
        # Additional daemon options to be appended to hostapd command:-
        #       -d   show more debug messages (-dd for even more)
        #       -K   include key data in debug messages
        #       -t   include timestamps in some debug messages
        #
        # Note that -B (daemon mode) and -P (pidfile) options are automatically
        # configured by the init.d script and must not be added to DAEMON_OPTS.
        #
        #DAEMON_OPTS=""
        
        注意:完成的配置只有DAEMON CONF="/etc/hostapd/hostapd.conf"這一行前面沒有註釋符號#,其他行均以#號開始。 如果問題依舊,請採取下面的步驟重新安裝hostapd:
        sudo apt-get remove --purge hostapd
        sudo rm /etc/default/hostapd
        sudo apt-get install hostapd
        
        安裝完成後請按要求編輯配置文件/etc/default/hostapd,希望對你有所幫助。
        1. 感謝您的解答 第一個問題已經解決 可否請教您 sudo nano /etc/default/udhcpd 這個檔案內的完整內容嗎? 感謝 (上面那個字是不小心點到的....抱歉)
          1. 感謝您的幫助 我已經成功連接到WIFI了! 我用手機連結後 雖然連結成功 但好像沒有網路... 這是我IP設定有問題嗎?
            1. 不客氣,對于你的問題,建議你先測試壹下連接到該無線的設備是否擁有IP地址(由udhcpd自動分配),對于桌面型計算機可以使用ipconfig或者ifconfig進行測試,手機直接查詢無線信息也可以得到,如果無法獲取IP地址或者IP地址爲0.0.0.0,則很有可能是udhcpd未正常工作。 如果你的無線已經能夠自動分配IP地址,而此時仍然不能連接網路的話,建議檢查你的配置方式,如果是“橋接的方式設置WiFi熱點(方案壹)”則需要按照我原文所描述進行橋接配置,如果是“路由的方式設置WiFi熱點(方案二)”則很有可能是iptables沒有設置好,具體也可以參考原文“配置iptables防火牆”這壹節敘述。
          2. 檔案/etc/default/udhcpd内容:
            # Comment the following line to enable
            # DHCPD_ENABLED="no"
            
            # Options to pass to busybox' udhcpd.
            #
            # -S    Log to syslog
            # -f    run in foreground
            
            DHCPD_OPTS="-S"
            
  16. 樓主不好意思我又有問題了... 我的Wifi在樹莓派重開機後就變得手機抓不太到Wifi訊號,就一直在轉獲取IP位址中...,連不太到Wifi 有辦法讓訊號在每次用時都穩定的方法嗎? 像我今天拿去學校是又不太行了...用了很久又可以連到Wifi上網感覺很不穩定 能否幫忙解決? 感激T^T
    1. 還有就是好像要讓樹梅派開機之後放久ㄧ點就能穩定連結到WiFi 但連結到又是沒有網路功能 那個防火牆設定重新啟動後依然有效的地方我不知道有沒有用錯? 還是有其他地方設定上有錯誤?
      1. 可以使用下面的命令保存iptables的配置:
        sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
        當然在命令前最好要刪除/etc/iptables.ipv4.nat這個文件。 編輯/etc/network/interfaces然後在最後加上下面這行以使每次啟動都自動加載iptables配置:
        up iptables-restore < /etc/iptables.ipv4.nat
    2. 抱歉,你所描述的問題我目前沒有遇到過,不過懷疑是不是和你所使用的網卡有關係,因為我之前發現一個奇怪的現象,那就是我的網件(NetGear)無線網卡經常會無法啟動,需要從樹莓派上拔下再插上才可以,後來重新購買了EDUP的網卡才解決問題,一直以為是網件網卡的問題,但是其在Windows下工作完全正常,不過後來安裝到Ubuntu台式機上又出現那種網卡無法啟動的現象(網卡燈也亮),根據網上手動激活網卡,或者重新拔插網卡才可以,過了很長時間後,我發現該網卡又神奇的好了,這個問題一直沒有找到相關文檔敘述,所以也就作罷。 hostapd修改版目前託管到GitHub,據目前你所述,可以看看是不是hostapd的Bug,最新版本在:https://github.com/jenssegers/RTL8188-hostapd 部署方法參考:http://jenssegers.be/blog/43/realtek-rtl8188-based-access-point-on-raspberry-pi 另外除了可以嘗試上述方法外,你可以嘗試著配置hostapd.conf的hw_mode和ieee80211n兩個參數:
      hw_mode=g
      ieee80211n=1
      wmm_enabled=1
      -------------------------------- ▼ 此項建議基於以下參考文章: Hostapd   http://wiki.gentoo.org/wiki/Hostapd Simple hostapd 802.11n problem - 54Mbit/s bit rate   http://ubuntuforums.org/showthread.php?t=1351234 wifi speed   http://www.raspberrypi.org/forums/viewtopic.php?t=48616&p=508835 希望對你有所幫助。
    3. 對了,我文章最後更新不知道你有沒有做,如果沒有,建議先完成這項步驟再看是否正常: 根據內容將/etc/default/ifplugd的內容修改配置如下:
      INTERFACES="eth0"
      HOTPLUG_INTERFACES="eth0"
      ARGS="-q -f -u0 -d10 -w -I"
      SUSPEND_ACTION="stop"
      1. /etc/default/ifplugd # This file may be changed either manually or by running dpkg-reconfigure. # # N.B.: dpkg-reconfigure deletes everything from this file except for # the assignments to variables INTERFACES, HOTPLUG_INTERFACES, ARGS and # SUSPEND_ACTION. When run it uses the current values of those variables # as their default values, thus preserving the administrator's changes. # # This file is sourced by both the init script /etc/init.d/ifplugd and # the udev script /lib/udev/ifplugd.agent to give default values. # The init script starts ifplugd for all interfaces listed in # INTERFACES, and the udev script starts ifplugd for all interfaces # listed in HOTPLUG_INTERFACES. The special value all starts one # ifplugd for all interfaces being present. INTERFACES="eth0" HOTPLUG_INTERFACES="eth0" ARGS="-q -f -u0 -d10 -w -I" SUSPEND_ACTION="stop" 是否?
  17. 樓主我現在遇到最大的問題還是連接到WIFI但沒有網路... 4.7 启动IP转向功能以便于开通NAT sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward" 编辑/etc/sysctl.conf改动下面这行: net.ipv4.ip_forward=1 4.8 配置iptables防火墙 sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT 到这里路由的NAT功能已经被启用,我们将刚才配置的iptables保存下来以便于下次使用: sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" 编辑/etc/network/interfaces然后在最后加上下面这行以使每次启动都自动加载iptables配置: up iptables-restore da, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_NOTICE, “did not acknowledge authentication response”); //return; } if (!ok) { hostapd_logger(hapd, mgmt->da, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_DEBUG, “did not acknowledge association response”); sta->flags &= ~WLAN_STA_ASSOC_REQ_OK; //return; } 重新编译安装,即可修复此问题。 這個方法能行嗎?他寫的下载hostapd源码該如何下載? 抱歉又要麻煩您了~
    1. 这个问题需要这样修复: 下载hostapd源码 nano src/ap/ieee802_11.c 修改两处, 将代码中的 return 注释掉: if (!ok) { hostapd_logger(hapd, mgmt->da, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_NOTICE, “did not acknowledge authentication response”); //return; } if (!ok) { hostapd_logger(hapd, mgmt->da, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_DEBUG, “did not acknowledge association response”); sta->flags &= ~WLAN_STA_ASSOC_REQ_OK; //return; } 重新编译安装,即可修复此问题。 上面好像不完整所以重貼一次
      1. 抱歉這麼久才回复,你所描述的方法由於條件限制我沒有親試,不過如果你需要重新編譯的話,可以使用hostapd修改版,該版本目前託管到GitHub,最新版本在:https://github.com/jenssegers/RTL8188-hostapd 部署和編譯的方法參考:http://jenssegers.be/blog/43/realtek-rtl8188-based-access-point-on-raspberry-pi 當然你可以在下載好源碼後按照上述辦法先修改源文件,然後再執行make命令,具體編譯和部署可以看Jens segers 的博文。
        1. 沒關係^^ 感謝您的回答 問題已經解決~ 我想請教您有關PHP的問題不知可否? (不知道如何聯絡您 只好在這裡詢問)
          1. 你好,PHP我研究得不多,不过如果你有什麼問題可以提出,我可以試著去幫你解決。
  18. 找了很多英文资料都没有找到RTL8188ucs的解决方案,最后还是楼主的这篇帮到了我,搜到信号太开心了!我用的是EDUP EP-N8508GS,按照楼主的做法非常顺利的成功了~~感谢感谢!
  19. 楼主,感谢你的分享,第一种方案我已经成功运行。但第二种方案,手机始终无法获取IP地址,我udhcpd显示启动了,但hostapd有时候显示Starting advanced IEEE 802.11 management: hostapdioctl[RTL_IOCTL_HOSTAPD]: Invalid argument . 不知道哪里出了问题。还有第二种方案/etc/network/interfaces除了wlan设为静态,eth那些需要设置吗?
    1. 第二种方案是需要hostapd和udhcpd配合的,据你的描述,初步怀疑是hostapd没有正常启动导致的,你可以看下进程里有没有hostapd,另外有没有按文章所述的替换hostapd包,另外这里有可以直接编译的hostapd修复版http://www.jenssegers.be/blog/43/Realtek-RTL8188-based-access-point-on-Raspberry-Pi,可以试试。 正常eth0按你的网络进行配置即可,比如网络是动态IP,那么这里就不需要设置,如果所处的网络需要静态IP,那么按网络环境配置。这里主要是将wlan0口的流量用iptables进行路由到eth0口,而eth0口是可以上网的公共口(类似于路由器的WAN口)。
      1. 你好,设置好hostapd,理论上是可以检测到WiFi的,开启转发并通过iptables可以将无线网口wlan0的流量导入有线网口eth0,如果eth0接入互联网则可以正常上网。
  20. 请问这样使用稳定吗?家里的路由器一BT下载就挂,考虑买个树莓派加usb无线网卡替代原有的路由器。。。
    1. 抱歉,这样使用受到散热等限制可能没有成品路由器稳定,我测试下来超过10个客户端就不稳定了,正常5个客户端以内最长稳定使用记录是6天,如果你追求稳定的路由器的话,强烈建议选择Cisco思科系列的,当然思科系的可能不适合挂BT。 我的建议是你可以使用网络存储器(NAS)分摊BT下载,路由器还是干路由器的事情比较好,毕竟是网络核心部分。
  21. 我想问下就是AP模式 会不会对安卓或者Windows Phone设备造成不兼容 以及Windows 平板呢 而且 第一种方式 是不是只支持一个设备连接
    1. 抱歉,暂时没有做过类似设备的测试(现有Android、Ubuntu、Windows XP、Windows 7、IOS测试通过,暂时没有Windows Phone和Windows平板设备供测试),不过理论上不存在类似的不兼容情况,第一种方式当时我只测试了一台设备的连接,也无法提供更多信息,不过可以确定的是不止可以连接一台设备。
  22. 版主您好,我想請問一下 若透過方案一橋接的方式 使手機可使用樹莓派分享之網路連上外網 而我的樹莓派之eth0 IP為固定IP 請問/etc/network/interfaces該如何配置? 而br0是否依然設置為iface br0 inet dhcp? 謝謝
    1. 抱歉,橋接的辦法只是一開始我搜索網絡得到的一篇文章配置的,當時是eth0通過DHCP獲取動態IP,配置成功後,移植到新的撥號環境的時候發現沒有第二種路由方法簡便,所以就切換到第二種辦法了,第一種辦法也就沒有深入研究,可以嘗試的是,對於eth0靜態IP配置使用如下(僅供參考):
      iface eth0 inet static
        address 192.168.1.100
        netmask 255.255.255.0
  23. 版主您好,我後來有使用方案二之方法 而手機一直無法取得IP 可以請問一下問題出在哪邊嗎??
    1. 類似的問題很有可能是wlan0未配置成dhcp模式或者樹莓派上的DHCP服務程序沒有正常工作,建議檢查這兩處設置。
  24. 我在配置时,用的是edup的,芯片是rtl8192cus,使用RTL8188-hostapd-1.1,可以产生ssid,但是不能连接上,是怎么回事?谢谢!
    1. 你好,如果在设备WiFi中能够看到SSID,但是不能正常连接,则有可能是DHCP动态IP分配出了问题,你可以检查一下原文所述的关于DHCP的部分。
  25. root@kali:~# sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf sudo: unable to execute /usr/sbin/hostapd: No such file or directory 您好,这种情况怎么解决啊?查看过这个路径,文件存在啊。。。 系统的img都从写了也没用啊。。
    1. 不太明白你遇到的问题,看样子是想直接通过hostapd命令的方式启动,如果hostapd文件存在的话,那么还有可能就是文件损坏或非可执行文件,如果你确定/usr/sbin/hostapd是可执行文件的话,那么请加上可执行属性sudo chmod +X /usr/sbin/hostapd。 不过不建议你这么安装和使用hostapd,我的方法是通过apt-get install安装后替换掉hostapd可执行文件实现的,你也可以从我前面评论回复的那个开源修改方案自行编译和安装。 开源修改方案最新版本在:https://github.com/jenssegers/RTL8188-hostapd 部署方法参考:http://jenssegers.be/blog/43/realtek-rtl8188-based-access-point-on-raspberry-pi
  26. 博主, 我参照教程前面的步骤都完成了,但是到这里sudo nano /etc/default/hostapd,我没有找到hostapd这个文件 请赐教,多谢!
    1. 这个文件是通过sudo apt-get install hostapd命令安装后生成的文件,是自带的,建议检查安装是否有问题。
  27. 博主您好! 参照教程我前面的步骤都实现了,但是sudo nano /etc/default/hostapd,我没有找到hostapd文件 请赐教,感谢!
    1. 这个文件是通过sudo apt-get install hostapd命令安装后生成的文件,是自带的,建议检查安装是否有问题。
  28. 楼主您好,有一个地方遇到了问题, sudo nano /etc/hostapd/hostapd.conf这个命令后是空白的,请问这个文件是本来就存在的吗,还是新建的然后自己编辑?
    1. 抱歉,记得不太清楚了,好像是新建的,如果你已经按照我文章步骤操作的话,那么这个配置文件可以新建(内容见文章所述),并修改/etc/default/hostapd指向的引用。
      1. 非常感谢楼主的回复,按照您的教程,在配置etc/network/interfaces 文件时发现和楼主显示的并不一样啊 #loopback adapter auto lo iface lo inet loopback #wired adapter iface eth0 inet dhcp #bridge auto br0 iface br0 inet dhcp bridge_ports eth0 wlan0 您这些是文件最后的代码吗? 我的下面还有一个关于wlan1的
        1. 是桥接方式最后形成的代码,你的之所以出现wlan1,怀疑是你使用了不止一个无线网卡,无线网卡1为wlan0,无线网卡2为wlan1,还有一种情况是wlan0被占用,而wlan1则是真实的网卡,这样原文配置中的wlan0改成wlan1也可以。
  29. 楼主,非常感谢你的帖子,帮我解决了很多问题,实现了wifi热点。现在我想用PPPOE拨号上网,可出现问题了,运行pppoe-startup 提示TIME OUT, 在哪里可以看到出错的日志呢,如何解决?
    1. 抱歉,没有测试过PPPoE方式拨号,建议你查看/var/log路径下关于PPPoE的日志以获取具体报错信息,另外我觉得PPPoE拨号超时有可能不是配置问题,而是拨号猫可能暂时没有响应,可以重新开启拨号猫再试。
  30. 博主你好,我按照路由方式设置之后,能够正常连接,但是经常出现连接两台移动设备,或者连接一台设备进行下载就自动掉线,然后过一会就可以恢复正常,由于对这些东西并不熟悉,也不知道从哪里入手检查问题,目前推测是瞬间速率过高(8MB/s)导致的负载过高?还望博主指点...
    1. 抱歉,暂时没有遇到你所描述的情况,我的配置完成后测试过最大约10台电脑同时联网,没有问题,只是不太稳定,如果5台以内还是妥妥的。建议你使用uptime命令查看近期负载,并检查/var/log的相关日志信息。
  31. 博主你好! 按照你的方法我已经架好了热点,但是由于我的树莓派有线网络连的是学校的VPN,其他设备连上该热点后只能访问校内网,无法访问校外网,但是树莓派是可以ping通外网的,请问该如何解决? 是路由的问题吗?
    1. 你好,通常情况下配置的VPN可能将所有网络流量导入拨号建立的内网,如果内网设置了隔离的话,那么是没有办法访问外网的,根据你的描述,我猜测你可能没有正确配置路由表,正确配置的路由表应当将内网流量转发到VPN,外网流量直接发送互联网出口比如eth0 。 你可以搜索一些有关配置路由表相关的内容。
      1. 博主你好,我又回来了! 补充一下之前说的不能访问外网的情况: 我增加以下规则: sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE sudo iptables -A FORWARD -i ppp0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i wlan0 -o ppp0 -j ACCEPT 之后可以ping通外网,可以用ssh连接外网的VPS,也能用git clone GitHub上的项目,奇怪的是就是不能访问网页,隐隐觉得是端口问题,但不知道如何解决。
        1. 根据你的描述,外网应该是通的,如果单纯不能访问网页的话,我觉得可能有两种情况:一是DNS设置错误或者DNS查询端口53被防火墙拦截,导致域名不能解析,可以试试能不能用IP地址直接访问网页;二是也有可能目的端口80被防火墙拦截,试试能不能telnet Web服务器的80端口。
  32. 您好~ 我之前用您的方法架好了Wifi 但今天我打開PI時 發現我的無線網卡沒亮 我重新測試了一下 出現以下的訊息 是hostapd出問題嗎?
  33. 楊智閎 pi@raspberrypi ~ $ sudo hostapd -dd /etc/hostapd/hostapd.conf random: Trying to read entropy from /dev/random Configuration file: /etc/hostapd/hostapd.conf Line 2: invalid/unknown driver 'rtl871xdrv' 1 errors found in configuration file '/etc/hostapd/hostapd.conf'
    1. 這有可能是你升級了hostapd導致原來的補丁文件被覆蓋,建議重複替換命令:
      wget http://www.daveconroy.com/wp3/wp-content/uploads/2013/07/hostapd.zip
      unzip hostapd.zip
      sudo mv /usr/sbin/hostapd /usr/sbin/hostapd.bak
      sudo mv hostapd /usr/sbin/hostapd.edimax
      sudo ln -sf /usr/sbin/hostapd.edimax /usr/sbin/hostapd
      sudo chown root.root /usr/sbin/hostapd
      sudo chmod 755 /usr/sbin/hostapd
      1. 树莓派3b测试,替换hostapd后没有效果,提示错误 ``` root@raspberrypi:~# hostapd -B -P /run/hostapd.pid /etc/hostapd/hostapd.conf Configuration file: /etc/hostapd/hostapd.conf drv->ifindex=3 l2_sock_recv==l2_sock_xmit=0x0x186e660 ioctl[SIOCSIWMODE]: Invalid argument Could not set interface to mode(3)! Could not set interface to master mode! rtl871xdrv driver initialization failed. ```
  34. 你好,我按照此方法搭建AP,唯一的不同是我的网卡是rt3070的,于是我把驱动换成了nl80211,但目前只能内网通讯,不能连接到外网.
    1. 可以连接无线吗?如果可以的话,那么驱动应该是没有问题的,采用路由方式搭建热点的话还应该注意配置iptables,否则流量不会由wlan0到eth0(通常是外网口)的,具体配置可以看原文所描述,希望对你有所帮助。
    1. 不客气,很高兴我的文章能够帮助到你,当你连接到树莓派的AP后是可以直接访问树莓派的SSH端口的,前提是你开放了SSH服务并且防火墙(例如iptables)不作拦截。
  35. 我现在热点配置成功,但是不是很稳定。就是说pc连接的时候wifi热点会整个崩溃 不知什么原因。
    1. 出现这种情况的问题有很多,建议你查看以下日志记录,提供一些可能的原因:hostapd是否使用的是补丁版,无线网卡是否与树莓派兼容(查看兼容列表),是否使用的是大功率网卡(因为有时大功率网卡可能会出现供电不足的问题)。
  36. 博主你好,请问下如果pi使用pppoe上网,之后再按照您的配置能使连接Wi-Fi的设备访问外网么?现在在pi上能访问外网,在连接到Wi-Fi的设备上不能
    1. 我试了下网线连到路由器上是可以的,稍微明白了些,那如果想要直接使用pppoe的话把博主教程中的eth0改成ppp0就可以了呢?(学的浅,很多都不懂)
      1. 非常抱歉的是我没有配置过PPPoE连接网络,所以并不能给出准确的方案,原来的配置是采用锐捷mentohust拨号的,利用iptables将WiFi的wlan0流量导入eth0,测试下来是正常的;如果你使用PPPoE拨号出现ppp0的虚拟点对点设备的话,应该是将流量导入ppp0,你可以试着修改iptables的相关配置。
        1. 配置得快哭了。。。 就是不能访问外网啊。。。 希望博主可以研究一下然后教教大家! 非常感谢!
          1. 抱歉,主要这段时间树莓派安装在实验室进行测试,过2个月才能拿到,如果可以只有等我拿到后再进行相关实验了。
    1. 其实我测试下来“EDUP EP-MS1558 300M 无线网卡”和树莓派搭配还是比较兼容和稳定的,可以试试哦。
  37. 您好,我按照您说的网桥方法配置,现出现如下问题: 一、如果在/etc/network/interfaces中 加上auto eth0 ,(比您的方法一只多加这一个),执行sudo hostapd -dd /etc/hostapd/hostapd.conf 出现错误 drv->ifindex=3 Configure bridge br0 for EAPOL traffic. ioctl[SIOCSIWMODE]:Invalid argument Could not set interface to mode(3)!Could not set interface to master mode! rtl871xdre driver initialization failed. 二、倘若不加auto eth0,无法上网 三、interfaces中有网桥在的话,eth0的网址会变,局域网10.109.**.**变169.254.*.*,去掉网桥设置,则正常,局域网改变SSH连不上 希望有时间探讨一下,多谢啦
    1. 169.254.*.*这个一般是系统获取不到IP地址时自己给自己分配的临时地址,如果出现这个地址说明DHCP没有发挥作用。遗憾的是树莓派暂时不在身边,所以你的问题难以复现,文中网桥的方式我是试过的,而且首次配置成功的也正是此模式,可以正常上网,不知道你所使用的hostapd是否按文中办法打补丁,貌似官方版本的对于部分无线网卡驱动始终不能正常加载,我有一次将之前补丁版本的hostapd升级到官方最新版本,结果无线立即就出问题了,所以这里需要注意在打好补丁后将hostapd加入禁止升级列表比较好。
      1. 就是之前已经按照楼主说的方法下载第三方的hostapd,还有修复版的了,但是运行中还是总出现问题,于是又重复安装hostapd后才解决了。。重复安装hostapd好多回 。多谢楼主啦,楼主方法很详尽,介绍的很细致,回复得很有耐心
  38. 谢谢楼主,我上回问了几个问题,关于网桥br0和eth0的IP问题,用桥接的方法时,br0作为主机的地址,它是正常的10.109.**.**的,其他的eth0 wlan0是169.254.**.**,利用br0的网址可以与SSH连接,但是具体的原因我还不知道,桥接方法是可以正常上网的,就是连接时间较长。 但是用路由方法时,总是不行,在最后hostapd验证时会出问题。正在解决,希望楼主要有解决方法,指导一下,多谢啦
    1. 有一种感觉是DHCP Server的问题,尤其是自动私有地址169.254.*.*出现,常常发生在无法获取DHCP分配的IP地址情况。综合看来你的hostapd也是有问题的,难道直接用的官方版本?hostapd设置的无线网卡驱动类型是否配置正确?
  39. 楼主,1、用桥接方法会出现问题,会中断,不仅wifi中断,SSH也会中断,然后再启动hostapd 又会出现错误提示:drv->ifindex=3 Configure bridge br0 for EAPOL traffic. ioctl[SIOCSIWMODE]:Invalid argument Could not set interface to mode(3)!Could not set interface to master mode! rtl871xdre driver initialization failed./2、重启reboot之后,树莓派上网出现异常,(试验中,一直用有线连接树莓派上网),然后hostapd后出现 Configure bridge br0 for EAPOL traffic . ioctl[SIOCSIWMODE]:Invalid argument Could not set interface to mode(3)! Could not set interface to master mode! rtl871xdre driver initialization failed.
    1. 抱歉,暂时树莓派不在身边,印象中我首次配置网桥模式是正常的,后来根据项目要求改成了路由模式,目前在实验室测试运行正常有三年时间了,除了中途负载过高重启过。建议你还是看下是否hostapd出现问题,重新安装并打补丁再试试呢?实在不行建议检查一下无线网卡是否在树莓派兼容性列表中,我开始用的NetGear的无线网卡就是不太兼容,经常会出现无法连接情况,换成EDUP后来问题得以解决。
  40. 多谢楼主!上周五,两种方法都调通了,目前为止也很稳定。期间出现了好多问题,感觉基本最后的所有解决方式,就是如果设置步骤没问题的话,hostapd重新安装,然后reboot,重复操作
    1. 就是不知道可不可行,我查到的资料很少,网上好多是成品AP配置IGMP Snooping,但是用树莓派或者linux配置的资料很少,请问这种方式有没有可行性啊
      1. 理论上应该是可以的,毕竟树莓派相当于迷你的小电脑了,高级一点的路由器有的功能树莓派应该都能配置成功。
  41. 您好,可否请教您一下想这样配置要怎么用呢? WIFI信号------>树莓派接收--------->转发到((RJ45口) & (WIFI信号出去))
      1. 不太明白你的需要,似乎你是想将无线的数据通过树莓派自带的网口进行相互的传输,那么文章的配置应该是可以的,原文就是树莓派自带的RJ45网口连接的互联网,再无线客户端与有线网口连接的网络进行数据传输。
  42. 您好楼主,我已经设置成功,并且用手机可以连接上网啦。我想知道使用什么命令才能看到树莓派给我的手机分配的IP地址是什么呢?
    1. 采用arp命令,找到Flags Mask为C且HWaddress对应的你手机无线网卡MAC地址,前面的Address就是IP地址了。
    1. 你好,感谢你的关注,我侧边栏使用的NeoEase开发的插件,具体可以点击这里;内容页的评论不是插件实现的,是主题自带的。
  43. 楼主你好,问个问题。我想用树莓派配置成个路由器,树莓派的网口接外网。另外给树莓派插了一个USB有线网卡,一个USB无线网卡。但是一直是接在USB有线网卡的网络可以上网,无线设备连接USB无线网卡就不能上网。看了一下IP地址,连在USB有线网卡和连在USB无线网卡的设备都分配了IP地址。如果拔掉了USB有线网卡或者只连接USB无线网卡,无线设备就可以上网。。。我也试图把USB有线网卡和USB无线网卡桥接。。结果发现都上不去网了。。我用的hostapd和isc-dhcp-server这两个软件。楼主知道需要怎么配置吗?是不是数据转发有问题?
    1. 你好,感谢你的关注,抱歉的是我并没有这样配置过,所以并不能提供可行方案,我的想法是这样的,你有线网卡和无线网卡分配配置不一样的IP地址段,比如有线网卡是192.168.13.1~192.168.13.254,无线网卡配置为192.168.12.1~192.168.12.254,子网掩码都是255.255.255.0,然后修改iptables将这两个端口的流量导入eth0,如我文章所示iptables参考配置,但是你可能需要修改相关参数,分配设置USB有线网卡和无线网卡,可以试试。
        1. 抱歉,暂时树莓派不在身边也无法进行相关实验,假设无线接口是wlan0,USB网卡是eth1,树莓派自带网络接口是eth0,eth0是互联网出口,我只能依葫芦画瓢的提供下面代码:
          sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
          sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
          sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
          sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
          sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
          祝你成功!
  44. 博主您好,我按照您的方法成功搞定了第一种方案,但是第二种方案用手机连接AP热点总是无法分配IP,想问一下您知道如何解决么?
    1. 一是hostapd需要使用修改版,二是注意采用我文章最后2013年12月12日更新所叙述的配置办法
  45. 您好,两个方法都已经成功运行,但是用 第二种方式,也就是路由方式时,在实验环境中遇到了一个问题: 实验环境: host A(IP 192.168.2.3)——H3C路由器——树莓派eth0(IP 192.168.3.3) wlan0(配置为路由 设置静态地址为 192.168.42.1)——host B(dhcp 为 192.168.42.12) 现在问题是,host B可以ping通 host A,但是host A ping不通host B host A 可以与 eth0 ping通,host B可以与eth0 wlan0 hostA ping通。 请问怎样可以互相ping通
    1. 你好,根据你的描述,感觉有点儿复杂,建议你采用tracert(Windows)或者traceroute(Linux/Unix)跟踪路由,然后配置路由表应该可以实现。
  46. 您好,用网桥模式配置的时候,可以搜到信号,但总是无法连接,请问可能是什么原因呢
  47. 您好,1、首先说明一下,昨天反应的网桥方法问题,就是出现wifi,但是并不能连接,后重装了系统,再设置,设置成功。 2、但是现在还有问题。我配置网桥AP的主要用途是,利用wifi,接收视频数据,在接收视频数据(用VLC播放器)时,只要断开wifi连接,就不能再次连接,除非重新启动树莓派,请问有没有好办法解决这问题? 3、并且在接收视频的质量并不好,会频繁出现视频的抖动。 4、一直认为是树莓派的CPU问题,但是后来用第二种路由模式,并没有出现视频抖动问题。之所以不选择路由模式,是因为路由模式只能一端ping通另一端,两端不能互ping。请问这有没有办法解决?(查阅资料,有人说这是nat的原因,有些事路由表原因,但是经过努力都没有好的办法来解决这个问题)。 5、请问您有什么建议么?非常感谢百忙之中阅读
    1. 抱歉,网桥模式我没有实际使用,仅仅是配置成功后就重新改用路由模式了,所以对于网桥模式可能的问题我所掌握的信息不多,至于你所说的ping问题,如果两台电脑同时连接树莓派,并且树莓派作为出口网关路由,则可以通过设置树莓派路由表实现,如果两台电脑除了连接树莓派外还连接其他网络或者间接连接树莓派则需要同时设置两台电脑的路由表实现互通,如果一台电脑连接树莓派,另外一台电脑在别的网络,则需要做端口映射以穿透NAT。 另树莓派玩玩可以,但真的不适合做路由器用,我试用下来在十几台上网设备连接的情况下经常会高负载崩溃。
  48. 你好,我有个问题不知道怎么回事,我用的是第二种方法。 最后测试的时候出现这样的问题。 random: Trying to read entropy from /dev/random Configuration file: /etc/hostapd/hostapd.conf drv->ifindex=3 l2_sock_recv==l2_sock_xmit=0x0x1efd648 ioctl[SIOCSIWMODE]: Invalid argument Could not set interface to mode(3)! Could not set interface to master mode! rtl871xdrv driver initialization failed. 看不大懂,不知道哪里的问题,求解决,谢谢
    1. 有没有做Patch还是用的官方版本的hostapd,原版的和一些网卡不兼容,另外再看看是不是权限问题。

 from https://archive.is/HSODT#selection-219.2-8815.51