起因

起了把家里路由器更新到新版本OpenWRT的念头很久了,周末终于克服自己的懒病,下载了OpenWRT 19.07.4的安装包,更新Linksys WRT1900ACS路由器的系统。

修改了IP地址,把Wifi打开后,驾轻就熟地修改了相关的配置,增加了第三方源,准备开始安装你懂的SS和ChinaDNS等组件。没想到往常屡试不爽的opkg install命令返回了安装失败提示:

Incompatible with the architectures configured

仔细比对了所有的配置,确认没有错误,但是安装新增的第三方包时总是报错。

解决方法

试了N多种方法,还是不行,正准备放弃装回原来ROM时,突然发现运行opkg print-architecture返回的CPU架构型号是
arch all 1
arch noarch 1
arch arm_cortex-a9_vfpv3-d16 10

比原来系统打印出来的架构型号多了一个d16,而第三方源的库里貌似没有arm_cortex-a9_vfpv3-d16这样一个型号的源,尝试修改/etc/opkg.conf文件,把原来CPU型号列表增加不带d16行。
arch all 1
arch noarch 1
arch arm_cortex-a9_vfpv3 8
arch arm_cortex-a9_vfpv3-d16 10

再运行opkg install,包装成功。

厌倦了登录服务器经常提示有N个补丁需要更新,需要重新启动之类的,可以通过服务器自动更新解决。

1.安装自动更新支持包

安装unattended-upgrades包。

sudo apt install unattended-upgrades

2.配置自动更新

编辑配置文件

sudo vi /etc/apt/apt.conf.d/50unattended-upgrades

该文件前半段长这样子:

最重要的是把“updates”这一行注释去掉。

“${distro_id}:${distro_codename}-updates”;

建议把自动清理不用内核文件的行也同时打开。

Unattended-Upgrade::Remove-Unused-Kernel-Packages “true”;
Unattended-Upgrade::Remove-Unused-Dependencies “true”;

自动重启及时间看个人喜好打开。

3.启用自动更新

sudo vi /etc/apt/apt.conf.d/20auto-upgrades

按需要修改内容

APT::Periodic::Update-Package-Lists “1”;
APT::Periodic::Download-Upgradeable-Packages “1”;
APT::Periodic::AutocleanInterval “3”;
APT::Periodic::Unattended-Upgrade “1”;

4.确认是配置是否起作用

用dry run方式看自动更新配置是否起作用

sudo unattended-upgrades –dry-run –debug

一无聊又搞事情,把一台CentOS机器直接从6升级到7,结果升级后要安装东西时,用yum update出现了错误,显示python(abi) = 2.6 is needed by (installed) python-argparse-1.2.1-2.el6.centos.noarch。

放狗搜了半天,试了几种方法还是搞不好。仔细分析具体信息,应该是系统残留的CentOS6包导致的,删除所有的el6包解决问题。

rpm --erase --nodeps $(for pkg in $(rpm -qa | grep '\.el[56]\.' | grep -v kmod | grep -v kernel); do rpm -q $pkg --qf '%{NAME} ' ; done)

对于度娘百度云的鸡贼限速实在无话可说,对于合作伙伴把ISO文件放在度盘让俺去下载的丧心病狂行径更加是深恶痛绝。哥忍着病疼周末加班处理问题居然要花大量时间去等工具下载完成。叔可忍婶不可忍,只能想办法把东西下载回来。

开搞。

 

[heading]1.先安装Chrome百度网盘助手插件[/heading]

在https://github.com/acgotaku/BaiduExporter下载BaiduExporter.crx,手动安装到Chrome。

 

 

[heading]2.安装Aria2[/heading]

[highlight dark=”no”]sudo apt-get install aria2[/highlight]

 

 

[heading]3.下载文件[/heading]

打开度盘,选中你要下载的文件,选择导出下载菜单的文本导出。把显示的文件内容复制下来,然后在粘贴到命令框即可下载。

 

如果被度娘断开连接,可以重新输入命令实现断点续传。

[heading]1.问题描述[/heading]

Ubuntu 16.04 Server LTS升级内核时,每次都跑出来“W: mdadm: /etc/mdadm/mdadm.conf defines no arrays”的提示。明明没有用RAID,查了mdadm.conf也有没有任何相关的配置。虽然不影响使用,但是强迫症患者还是觉得很不爽。

[heading]2.解决办法[/heading]

先删除mdadm.conf文件

[highlight dark=”no”]# rm /etc/mdadm/mdadm.conf[/highlight]

再用update-initramfs命令,自动生成新的mdadm.conf文件。

[highlight dark=”no”]# update-initramfs -u[/highlight]

天下太平。

[heading]1.问题描述[/heading]

对于俺这种升级强迫症患者,Ubuntu的/boot分区接近100%是常见的事。日前发现公司一台测试服务器又提示/boot空间快满。习惯性的想删除内核文件释放空间,运行命令,结果与自己期望相悖,系统报空间不,没法删除旧内核文件。
[highlight dark="no"]# sudo apt-get remove linux-image-4.4.0-28-generic[/highlight]
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
linux-headers-4.4.0-24 linux-headers-4.4.0-24-generic linux-headers-4.4.0-28 linux-headers-4.4.0-28-generic linux-headers-4.4.0-31 linux-headers-4.4.0-31-generic
linux-image-4.4.0-31-generic linux-image-extra-4.4.0-31-generic
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
linux-image-4.4.0-28-generic linux-image-extra-4.4.0-28-generic
0 upgraded, 0 newly installed, 2 to remove and 89 not upgraded.
3 not fully installed or removed.
After this operation, 218 MB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 217969 files and directories currently installed.)
Removing linux-image-extra-4.4.0-28-generic (4.4.0-28.47) ...
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.4.0-28-generic /boot/vmlinuz-4.4.0-28-generic
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.4.0-28-generic /boot/vmlinuz-4.4.0-28-generic
update-initramfs: Generating /boot/initrd.img-4.4.0-28-generic

gzip: stdout: No space left on device
E: mkinitramfs failure cpio 141 gzip 1
update-initramfs: failed for /boot/initrd.img-4.4.0-28-generic with 1.
run-parts: /etc/kernel/postinst.d/initramfs-tools exited with return code 1
dpkg: error processing package linux-image-extra-4.4.0-28-generic (–remove):
subprocess installed post-removal script returned error exit status 1
Removing linux-image-4.4.0-28-generic (4.4.0-28.47) …
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 4.4.0-28-generic /boot/vmlinuz-4.4.0-28-generic
update-initramfs: Deleting /boot/initrd.img-4.4.0-28-generic
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 4.4.0-28-generic /boot/vmlinuz-4.4.0-28-generic
Generating grub configuration file …
Found linux image: /boot/vmlinuz-4.4.0-63-generic
Found initrd image: /boot/initrd.img-4.4.0-63-generic
Found linux image: /boot/vmlinuz-4.4.0-59-generic
Found initrd image: /boot/initrd.img-4.4.0-59-generic
Found linux image: /boot/vmlinuz-4.4.0-38-generic
Found initrd image: /boot/initrd.img-4.4.0-38-generic
Found linux image: /boot/vmlinuz-4.4.0-31-generic
Found initrd image: /boot/initrd.img-4.4.0-31-generic
Found memtest86+ image: /memtest86+.elf
Found memtest86+ image: /memtest86+.bin
done
Errors were encountered while processing:
linux-image-extra-4.4.0-28-generic
E: Sub-process /usr/bin/dpkg returned an error code (1)

[heading]2.解决方法[/heading]

运行以下命令先清除空间,确认/boot分区已有足够空余。
[highlight dark="no"]# sudo apt-get clean
# df -h[/highlight]

再用以下命令确定现在所用内核及已安装内核文件,清除不需要的内核文件。


[highlight dark="no"]# uname -a
# dpkg --get-selections|grep linux-image
# sudo apt-get remove linux-image-4.4.0-28-generic[/highlight]

计划把公司应用后台的数据库服务也统一迁移到docker上,因此起了在docker上部署Oracle数据库的念头。记得以前在docker hub上看到过现成的数据库image,上去一搜,发现不是版本太低就是说被O记要求删除。既然是这样,那O记官方有没以支持呢?放狗一搜,发现O记官方在github上有专门的docker images项目,包含了Java、数据库、应用等等的镜像生成文件。就算是自己生成镜像文件,这些资料也对写Dockerfile很有参考价值。

在github上下载Oracle数据库的docker文件,在OTN下载好Oracle Database 12C的安装包,把zip文件置于OracleDatabase/dockerfiles/12.0.0.2目录下,然后开始Oracle数据库docker的无脑安装 。

1.运行dockerfiles下的buildDockerImage.sh命令

从Oracle Linux的slim-7版本生成数据库镜像文件,该命令支持生成Oracle数据库企业版、标准版和XE版本。俺使用的是企业版。


# ./buildDockerImage.sh -v 12.1.0.2 -e -i

该脚本命令参数说明如下:

-v: version to build
Choose one of: 11.2.0.2 12.1.0.2
-e: creates image based on 'Enterprise Edition'
-s: creates image based on 'Standard Edition 2'
-x: creates image based on 'Express Edition'
-i: ignores the MD5 checksums

开始配置环境,复制安装文件,静默安装数据库,最后生成镜像。大概需要10来分钟时间。

[highlight dark=”no”]注:在生成数据库镜像前,请特别留意Docker的存储驱动配置必须btrfs或overlay2,如果使用aufs在生成过程中会出现各种问题,俺还特意在github上特意开了issue讨论这个问题。[/highlight]

2.在docker容器中运行Oracle数据库


docker run --name \
-p :1521 -p :5500 \
-e ORACLE_SID= \
-e ORACLE_PDB= \
-e ORACLE_CHARACTERSET= \
-v [:]/opt/oracle/oradata \
oracle/database:12.1.0.2-ee

Parameters:
–name: The name of the container (default: auto generated)
-p: The port mapping of the host port to the container port.
Two ports are exposed: 1521 (Oracle Listener), 5500 (OEM Express)
-e ORACLE_SID: The Oracle Database SID that should be used (default: ORCLCDB)
-e ORACLE_PDB: The Oracle Database PDB name that should be used (default: ORCLPDB1)
-e ORACLE_CHARACTERSET:
The character set to use when creating the database (default: AL32UTF8)
-v The data volume to use for the database.
Has to be owned by the Unix user “oracle” or set appropriately.
If omitted the database will not be persisted over container recreation.

[heading]1.问题描述[/heading]

Docker安装后默认的Storage Driver是AUFS,把存储驱动改成overlay2后,系统重启发现Docker daemon无法启动,查看状态提示是docker目录存在多个有效驱动,要求指定存储驱动。[highlight dark=”no”]Error starting daemon: error initializing graphdriver: /data/docker contains several valid graphdrivers: aufs, overlay; Please cleanup or explicitly…[/highlight]

尝试删除Docker目录的aufs目录,结果提示[highlight dark=”no”]rm: cannot remove ‘aufs’: Device or resource busy[/highlight]

[heading]2.原因[/heading]

查找挂载目录,发现 cat /proc/mounts | grep "docker",发现原来是aufs目录被挂载。

[heading]3.解决方法[/heading]
卸载该目录,[highlight dark=”no”] umount /var/lib/docker/aufs[/highlight],问题解决。

懒癌发作,直到春节假期才下定决心把公司的基础架构都迁移到Docker上,随之而来的是一大堆应用重新部署及系统重构的工作。公司大量的应用是基于Oracle数据库构建,所以安装Oracle Database变成了首要任务。虽然安装配置数据库是小菜一碟,但是习惯了登录OTN网站下载安装文件然后照步骤安装,在Linux环境下碰到的第一个问题是在Console的环境下没有浏览器,而下载Oracle 数据库安装文件需要登录OTN网站并同意Oracle的License协议方能下载。

虽然可能利用cookies export这些工具来实现,但是习惯了使用最简单的方法解决问题,直接利用Firefox浏览器可以达到这个目的。在工作计算机上用Firefox登录OTN网站,同意协议后点击下载你所需的数据库安装文件,当下载开始后点击暂停下载,然后在下载任务上右键,选择复制下载链接。

然后登录到Linux终端,用Wget加上复制的链接就可以实现在Linux终端下载OTN文件。

[heading]前言[/heading]
一直念叨着要把家里的无线路由改成能自动科学上网,但是平时在各种设备上习惯了用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卡,修改密码等。
[highlight dark="no"]$ sudo raspi-config[/highlight]

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,老老实实的做下来才能正常工作。

上传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.

2.本文科学上网设置部分引用于Tony Lee的博客文章用树莓派打造无线中继科学上网路由器,感谢Tony的分享,同在魔都,有缘的话自当结识。