RouterOS6.36rc21 开始支持 raw——

*) firewall - added pre-connection tracking filter - "raw"  table, that allow to protect connection-tracking from unnecessary traffic;

料想其与 iptables 的该特性优势一致(可提升性能),
于是尝试将以前写在主表的部分规则移到了 raw 表:

/ip firewall raw
add chain=prerouting action=drop packet-size=1492-65535 log=no protocol=icmp comment="Drop oversized unfragmented packets"
add chain=prerouting action=drop in-interface=all-ppp icmp-options=8:0 log=no protocol=icmp comment="Drop pings from WAN"
add cchain=prerouting action=drop in-interface=all-ppp dst-port=53 log=no protocol=tcp comment="Drop tcp DNS queries from WAN"
add chain=prerouting action=drop in-interface=all-ppp icmp-options=8:0 log=no protocol=icmp comment="Drop udp DNS queries from WAN"
add chain=prerouting action=drop tcp-flags=fin,syn log=no protocol=tcp comment="SYN-FIN attack protection"
add chain=prerouting action=drop tcp-flags=syn,rst log=no protocol=tcp comment="SYN-RST attack protection"
add chain=prerouting action=drop tcp-flags=fin,psh,urg,!syn,!rst,!ack log=no protocol=tcp comment="X-Mas attack protection"
add chain=prerouting action=drop tcp-flags=fin,!syn,!rst,!psh,!ack,!urg log=no protocol=tcp comment="NMAP FIN attack protection"
add chain=prerouting action=drop tcp-flags=fin,syn,rst,ack,urg,!psh log=no protocol=tcp comment="NMAP Push attack protection"
add chain=prerouting action=drop tcp-flags=fin,psh,urg,!syn,!rst,!ack log=no protocol=tcp comment="NMAP FIN/PSH/URG attack protection"
add chain=prerouting action=drop tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg log=no protocol=tcp comment="NULLflags attack protection"
add chain=prerouting action=drop tcp-flags=fin,syn,rst,psh,ack,urg log=no protocol=tcp comment="ALLflags attack protection"

前言

为了提升 OSMC 的使用体验而购买了 Raspberry Pi 2 Model B
于是淘汰了一台 v1Model B 下来(下称 RPi )。
看着 <span style="direction: rtl; unicode-bidi: bidi-override;">egdeLSS</span> 的 Pro 套餐配额每月剩一大半着实心疼,
决定用 RPi 架个家庭网关给 PS4 和 AppleTV 加加速

RPi 上的配置

我的 RPi 安装 Raspbian Jeesie Lite
其它系统大同小异。

配置 <span style="direction: rtl; unicode-bidi: bidi-override;">egdeLSS</span>

先去 <span style="direction: rtl; unicode-bidi: bidi-override;">egdeLSS</span> 官网下载适配 RPi 的 Cli 转换器(下称 SE )并给予执行权限,
执行时会报错 No such file or directory
疑是依赖未解决。
尝试找出依赖:

head -1 SE | cat -A
...
/lib/ld-linux.so.3
...

看来缺少 /lib/ld-linux.so.3
尝试解决

ln -s /lib/ld-linux-armhf.so.3 /lib/ld-linux.so.3

再次执行不再报错。

配置文件示例可见官网,
细节调整可参考 <span style="direction: rtl; unicode-bidi: bidi-override;">yxorPAH</span> 的文档。
其关键的配置项如下:











- 阅读剩余部分 -

前言

 QuChao.com 的 Stapled OCSP Response

去年末“赶时髦”申请了 Let's Encrypt(下称 LE )的免费证书,
遗憾的是还不支持泛域名 ECC 证书(后者已被支持,中间证书则尚未提供),
不过一切都在进行之中。
有兴趣者请密切关注其论坛。

其中间证书虽已让被广泛支持的 IdenTrust 根证书 交叉签发,
然而它仍旧只是个刚“出道”的 CA ,
不少服务器和本地程序还未信任其证书,
一些朋友可能与我一样在配置 ssl_stapling_file 时遇到一些困难,
于是我将这部分配置过程从笔记里摘出来与大家分享、探讨。

关于 OCSP Stapling 的资料很多,
自己也还在学习之中,
这里仅给出一些链接:
简单地说它是一种的优化手段——
将原本需要客户端实时发起的 OCSP 请求转嫁给服务端;
利用 NginX 的 ssl_stapling_file 指令更可将业已缓存的查询结果直接返回,
使得缓存的更新时间更可加控。

环境

我使用的环境如下:

其中 NginX 版本最为关键,
它从 1.3.7+ 开始支持该特性。

  • CentOS/7.2.x
  • NginX/1.9.x
  • OpenSSL/1.0.1e

启用 OCSP Stapling

我们假定你已从 LE 申请到了证书,
并能正常提供服务。<!--more-->

推荐在服务器上使用 ACME-Tiny 来申请、续期证书。

我的配置参考了 H5BPNginX Boilerplate Configs
在其 /directive-only/ssl-stapling.conf 中推荐定义如下:

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/certs/quchao.com/chained.pem;
resolver 8.8.8.8 8.8.4.4 216.146.35.35 216.146.36.36 valid=60s;
resolver_timeout 2s;

ssl_certificate 指令指定了完整的证书链,
ssl_trusted_certificate 可省略。

上述配置即方便地开启了 OCSP Stapling 特性。
当客户端访问时 NginX 将去指定的证书中查找 OCSP 服务的地址,
获得响应内容后通过证书链下发给客户端。

可通过此工具来查看证书的有效期及撤销状态,
配置成功可看到 (STAPLED) 状态关键词。

启用 ssl_stapling_file

2016-12-27 特别提示
目前由于 LE 的 OCSP 不支持多证书合并响应,
此指令也无法多次使用,
因此多证书情形下无法工作!

接下来我们更进一步——
直接将 OCSP 响应存成文件,
NginX 将其随证书下发而不实时查询。

首先我们需要找到 OCSP 服务地址:

chained.pem 即网站完整的证书链。

openssl x509 -in /path/to/certs/quchao.com/chained.pem -text | grep "OCSP - URI:" | cut -d: -f2,3

得到的地址是 http://ocsp.int-x1.letsencrypt.org/
自 26th Mar, 2016 已启用 http://ocsp.int-x3.letsencrypt.org/已兼容 WinXP )。

接着获取 OCSP 响应并写入 ocsp.resp 文件:

openssl ocsp -no_nonce \
             -respout /path/to/certs/quchao.com/ocsp.resp \
             -issuer /path/to/certs/lets-encrypt-x3-cross-signed.pem \
             -cert /path/to/certs/quchao.com/quchao.com_chained.pem \
             -url http://ocsp.int-x3.letsencrypt.org/ \
             -header "HOST" "ocsp.int-x3.letsencrypt.org"

注意相关文件的权限;
lets-encrypt-x3-cross-signed.pemLE中间证书
有些 openssl 版本不支持指定 -header 参数,请选择合适的版本。

若运行时报错如下:

Response Verify Failure
140060623058848:error:27069076:OCSP routines:OCSP_basic_verify:signer certificate not found:ocsp_vfy.c:85:

则服务器可能并未信任 LE 的根证书或中间证书;
有多种途径解决:

  • 直接将这些证书加入系统的 ca-bundle.crt 里;
  • 生成一个专用的 bundle 。

下载相关根证书和中间证书

它们是:

  • 根证书:DST Root CA X3
  • 根证书:ISRG Root X1
  • 中间证书:Let’s Encrypt Authority X1 (分别被上述两个根证书签发)
  • X1 的候补中间证书:Let’s Encrypt Authority X2
  • 中间证书:Let’s Encrypt Authority X3 (兼容 WinXP)
  • X3 的候补中间证书:Let’s Encrypt Authority X4

不管采用哪种方式,
我们先将证书全部保存到本地。

mkdir -p /path/to/tmp/
cd /path/to/tmp/
curl -o ./DST_Root_CA_X3.pem -L https://ssl-tools.net/certificates/dac9024f54d8f6df94935fb1732638ca6ad77c13.pem

curl -O -L https://letsencrypt.org/certs/isrgrootx1.pem

curl -O -L https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem
curl -O -L https://letsencrypt.org/certs/letsencryptauthorityx3.pem
curl -O -L https://letsencrypt.org/certs/lets-encrypt-x4-cross-signed.pem
curl -O -L https://letsencrypt.org/certs/letsencryptauthorityx4.pem

curl -O -L https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem
curl -O -L https://letsencrypt.org/certs/letsencryptauthorityx1.pem
curl -O -L https://letsencrypt.org/certs/lets-encrypt-x2-cross-signed.pem
curl -O -L https://letsencrypt.org/certs/letsencryptauthorityx2.pem

方法一:将它们加入系统的 ca-bundle.crt

以 CentOS/7 为例。

mv /path/to/tmp/*.pem /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

执行完毕可看看 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt 是否已包含上述证书。

方法二:生成专用的 ca-bundle.pem

我使用该方式。

cat /path/to/tmp/*.pem > /path/to/certs/ca-bundle.pem

特别注意
letsencryptauthorityx2.pem 文件为 Dos 格式,
会导致 concat 后 PEM 格式错误,
请尝试将其转换为 Unix 格式(末尾增加换行)后重新生成 Bundle 。

再次尝试缓存 ocsp.resp 文件

此时再执行:

openssl ocsp -no_nonce \
             -respout /path/to/certs/quchao.com/ocsp.resp \
             -issuer /path/to/certs/lets-encrypt-x3-cross-signed.pem \
             -cert /path/to/certs/quchao.com/quchao.com_chained.pem \
             -CAfile /path/to/certs/ca-bundle.pem \
             -VAfile /path/to/certs/ca-bundle.pem \
             -url http://ocsp.int-x3.letsencrypt.org/ \
             -header "HOST" "ocsp.int-x3.letsencrypt.org"

注意新增的 -CAfile-VAfile 参数。

若无其它意外,
你会看到如下结果:

Response verify OK
/path/to/certs/quchao.com/chained.pem: good
    This Update: Jan 17 06:00:00 2016 GMT
    Next Update: Jan 24 06:00:00 2016 GMT

证明 OCSP 请求缓存成功,
且告知了过期时间。

开启特性

接下来放心大胆地在 NginX 配置中增加一行:

ssl_stapling_file /path/to/certs/quchao.com/ocsp.resp;

重载配置后,
执行如下命令测试:

echo QUIT | openssl s_client -connect quchao.com:443 -status 2> /dev/null | grep -A 17 'OCSP response:' | grep -B 17 'Next Update'

若得到类似 OCSP Response Status: successful 的答复即算成功。(亦可通过之前的工具进行验证)

定期更新

我们注意到响应内容中有一行 Next Update: Jan 24 06:00:00 2016 GMT
表示我们所缓存的响应内容将于这个时间点过期。
为了避免过期的情形,
我们可以编写脚本并设定 CronJob 来一劳永逸地解决问题。

脚本

如下是我所使用的脚本(参考),
使用时请注意相关文件的路径权限问题。

#!/bin/bash
#############################
#
# OCSP Cache Updater v0.2.1
#   by Qu Chao
#
# ---------------------------
#
# Usage:
#   % update_ocsp_cache "example.com"
#
# ---------------------------
#
# v0.1.0 - Initialization.
# v0.2.0 - Use X3 intermediate certs by default.
# v0.2.1 - Add generation of intermediates as an option.
#
#############################

if [ -z $1 ]; then
    echo -e "No domain is specified!" >&2
    exit 1
fi

############################
# CONFIGS
############################
#LE_DIR="/usr/local/etc/nginx/ssl"

LE_DIR="/etc/nginx/ssl"
GEN_NUM="x3"

############################
# DEFAULTS
############################
DOMAIN=$1
CERT_DIR="${LE_DIR}/${DOMAIN}"
CHAINED_CERT="${CERT_DIR}/chained.pem"

ISSUER_CERT="${LE_DIR}/lets-encrypt-${GEN_NUM}-cross-signed.pem"
CA_FILE="${LE_DIR}/ca-bundle.pem"
OCSP_RESP_FILE="${CERT_DIR}/ocsp.resp"
OCSP_REPLY_FILE="${CERT_DIR}/ocsp.reply"

############################
# MAIN
############################
# Functions
existence_pattern_check(){
    [ -n "$1" ] && [ -e "$1" ] && ( [ "${2:-file}" = "file" ] && ( [ -f "$1" ] || [ -L "$1" ] ) || [ -d "$1" ] ) && [ -r "$1" ]
}

# Params Validation
if ! existence_pattern_check "${LE_DIR}" "dir"; then
    echo -e "Let's Encrypt folder is missing!" >&2
    exit 1
elif ! existence_pattern_check "${CERT_DIR}" "dir"; then
    echo -e "Domain cert folder is missing!" >&2
    exit 1
elif ! existence_pattern_check "${CHAINED_CERT}" || ! existence_pattern_check "${ISSUER_CERT}" || ! existence_pattern_check "${CA_FILE}"; then
    echo -e "Required certs file is missing!" >&2
    exit 1
fi

# Get OCSP URI & HOST
OCSP_URL=$(openssl x509 -in "${CHAINED_CERT}"  -text | grep "OCSP - URI:" | cut -d: -f2,3)
OCSP_HOST=$(echo "${OCSP_URL}" | awk -F/ '{print $3}')

# Output OCSP response
openssl ocsp -no_nonce \
             -respout "${OCSP_RESP_FILE}.new" \
             -issuer "${ISSUER_CERT}" \
             -cert "${CHAINED_CERT}" \
             -CAfile "${CA_FILE}" \
             -VAfile "${CA_FILE}" \
             -url "${OCSP_URL}" \
             -header HOST "${OCSP_HOST}" > "${OCSP_REPLY_FILE}" 2>&1

# Check if it's all okay?
if  grep -q "Response verify OK" "${OCSP_REPLY_FILE}" && grep -q "${CHAINED_CERT}: good" "${OCSP_REPLY_FILE}" ; then
    if  cmp -s "${OCSP_RESP_FILE}.new" "${OCSP_RESP_FILE}" ; then
        # No news is good news
        rm "${OCSP_RESP_FILE}.new"

        echo -e "OCSP cache is up-to-date!"
    else
        # Update the cache file
        mv "${OCSP_RESP_FILE}.new" "${OCSP_RESP_FILE}"

        # reload nginx's config
        /usr/sbin/nginx -s reload

        echo -e "OCSP cache is updated!"
    fi
else
    # Bad things happen all the time
    cat "${OCSP_REPLY_FILE}" >&2

    echo -e "Failed to update OCSP cache!" >&2
fi

# Make a backup
mv "${OCSP_REPLY_FILE}" "${OCSP_REPLY_FILE}.old"
echo -e "Detailed log located at ${OCSP_REPLY_FILE}.old"

将脚本保存为 /path/to/certs/scripts/update_ocsp_cache.sh 并赋予执行权限。

计划任务

接下来新增一个 Hourly CronJob :

1 * * * * /path/to/certs/scripts/update_ocsp_cache.sh quchao.com 2>&1 >/dev/null | (test -s /dev/stdin && /usr/bin/mail -s "$HOSTNAME - Hourly OCSP Cache Update" mail@to.me || echo 'OCSP Cache is Up-to-date!')

这样一来,
服务器每小时都会尝试缓存新的 OCSP 响应,
当响应内容有变化便会自动更新缓存重载配置
若过程中发生异常则会通过 mailx 邮件通知我们上线处理。

更新日志

20160327 - LE 中间证书已改用 X3 (兼容 WinXP ),OCSP 服务器亦有调整;本文已更新。












































- 阅读剩余部分 -

前言

ROS 中配置完 PCC 后的 PPPoE 流量

目前公司有近百台设备,
申请两条电信 100M 光纤,
之前几个月一直分成两个网络在使用,
除了偶尔某条线过于繁忙之外也没什么不便。

最近我搭了内网的研发测试环境,
势必要将设备统一到同个办公内网。
索性买了一台与家里型号相同的 RB850Gx2
准备除了合并网络之外顺便做多线负载均衡。

介绍

ROS 官网介绍了多种 LB 方案
用得较多的分 PCC (Per Connection Classifier) 和 Nth 两种;
我理解二者的区别主要在于:前者基于 IP 而后者基于连接,
因此后者从流量角度来说更为均衡,而前者稳定性更佳;
办公网当然是稳定压倒一切。

配置

官网教程通常选用固定 IP 做示例,
咱们动态 IP 用户需要稍作调整 (参考此文),
记录如下——<!--more-->

标记所有从 WAN 口进入且未经标记的流量

注意规则中的 no-mark 是系统保留字,代表未经标记的连接。
WAN_1WAN_2 是 ROS 中对两个 WAN 口的命名,若有更多 WAN 规则可类推。

/ip firewall mangle
add chain=input action=mark-connection new-connection-mark=WAN_1 passthrough=no in-interface=PPPOE-Out_1 connection-mark=no-mark comment="Mark All Incoming WAN Connections w/o Any Marks"
add chain=input action=mark-connection new-connection-mark=WAN_2 passthrough=no in-interface=PPPOE-Out_2 connection-mark=no-mark

将相同的标记打到出口流量上

/ip firewall mangle
add chain=output action=mark-routing new-routing-mark=WAN_1 passthrough=no out-interface=PPPOE-Out_1 connection-mark=WAN_1 comment="Attach the Same Routing Mark to the Outgoing Connections with the Incoming One"
add chain=output action=mark-routing new-routing-mark=WAN_2 passthrough=no out-interface=PPPOE-Out_2 connection-mark=WAN_2

PCC

Ether-Master-Local 请设置为 LAN 口的 Master Port (或是 Bridge 模式下的接口);
若有更多 WAN 规则可类推。

/ip firewall mangle
add chain=prerouting action=mark-connection new-connection-mark=WAN_1 passthrough=yes dst-address-type=!local in-interface=Ether-Master-Local connection-mark=no-mark per-connection-classifier=both-addresses:2/0 log=no log-prefix="" comment="Split the Internal Connections Equally Amongst All WANs"
add chain=prerouting action=mark-connection new-connection-mark=WAN_2 passthrough=yes dst-address-type=!local in-interface=Ether-Master-Local connection-mark=no-mark per-connection-classifier=both-addresses:2/1 log=no log-prefix=""

让不同标记的流量走不同的路由

/ip firewall mangle
add chain=prerouting action=mark-routing new-routing-mark=WAN_1 passthrough=no in-interface=Ether-Master-Local connection-mark=WAN_1 comment="Attach A Routing Mark to the Marked Connections"
add chain=prerouting action=mark-routing new-routing-mark=WAN_2 passthrough=no in-interface=Ether-Master-Local connection-mark=WAN_2

导向不同的出口网关

设置不同 distance 值做 Fail Over 。

/ip route
add dst-address=0.0.0.0/0  gateway=PPPOE-Out_1 routing-mark=WAN_1 distance=1
add dst-address=0.0.0.0/0  gateway=PPPOE-Out_1 routing-mark=WAN_2 distance=2

NAT

亦可去掉 out-interface 合成一条。

/ip firewall nat
add chain=src-nat  out-interface=PPPOE-Out_1 action=masquerade
add chain=src-nat  out-interface=PPPOE-Out_1 action=masquerade

至此配置完毕。















- 阅读剩余部分 -

安装

OSMC 的前身是 Raspbmc
有关 Raspbmc 、OpenELECXBian 的多方面对比可参看此文

下载镜像

我使用的 Raspberry Pi Model B (下简称 RPi ),请根据手中设备选择镜像并调整相关步骤。

OSMC 官网 下载适配 Raspberry Pi 1 (ARM11 平台) 的 DiskImage 文件。

将镜像写入 SD 卡

官方建议尽量使用 Class 10 的 SD 卡。

确认 SD 卡的分区名:

$ df -h
Filesystem      Size   Used  Avail Capacity  iused  ifree %iused  Mounted on
/dev/disk1     111Gi  108Gi  2.9Gi    98% 28397796 760858   97%   /
devfs          186Ki  186Ki    0Bi   100%      644      0  100%   /dev
map -hosts       0Bi    0Bi    0Bi   100%        0      0  100%   /net
map auto_home    0Bi    0Bi    0Bi   100%        0      0  100%   /home
/dev/disk2s1    69Mi   37Mi   32Mi    55%        0      0  100%   /Volumes/UNTITLED

<!--more-->假设 SD 卡分区名是 disk2s1
取消挂载该分区:

$ sudo diskutil unmount /dev/disk2s1
Volume UNTITLED on disk2s1 unmounted

将之前下载的 img 写入该分区:

注意替换为镜像文件的正确路径,假设文件名为 OSMC_TGT_rbp1_20150412.img

$ sudo dd bs=1m if=/Path/to/the/OSMC_TGT_rbp1_20150412.img of=/dev/rdisk2
256+0 records in
256+0 records out
268435456 bytes transferred in 18.087894 secs (14840614 bytes/sec)

弹出 SD 卡:

$ sudo diskutil eject /dev/rdisk2
Disk /dev/rdisk2 ejected

启动

将 SD 卡插入 RPi 并插入网线后通电,
系统将自行安装并启动。

遥控方法非常多:

  • 推荐通过支持 HDMI CEC 的设备遥控器进行配置;
  • 可使用 Kodi Remote 通过网络遥控;
  • 亦可通过网页进行遥控。

配置

OSMC 基于 Debian 二次开发,基本配置不多赘述。

Hostname

$ sudo hostname Watsberry
$ sudo vi /etc/hosts
::1             Watsberry localhost6.localdomain6 localhost6
127.0.1.1       Watsberry
...
$ sudo vi /etc/hostname
Watsberry
$ hostname
$ hostname -f

更新源

备份后编辑源列表:

$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
$ sudo vi /etc/apt/sources.list

修改内容为:

deb http://mirrordirector.raspbian.org/raspbian jessie main contrib non-free rpi
deb http://apt.osmc.tv jessie main
deb http://archive.raspbian.org/raspbian jessie main contrib non-free rpi
deb-src http://archive.raspbian.org/raspbian jessie main contrib non-free rpi

再修改配置:

$ sudo vi /etc/apt/preferences

内容为:

Package: *
Pin: release n=wheezy
Pin-Priority: 900
Package: *
Pin: release n=jessie
Pin-Priority: 300
Package: *
Pin: release o=Raspbian
Pin-Priority: -10

现在可以更新:

sudo apt-get update -y
sudo apt-get upgrade -y

SSH

官方说明 ,可知默认用户名密码均为 osmc

首次登录

假设设备当前 IP 是 192.168.1.xxx ,请根据网段情况自行调整。

尝试登录:

$ ssh osmc@192.168.1.xxx

首次登录会自动设置 localeen_US.UTF-8
然后更改密码:

$ passwd

设置密钥登录

远程新建个人 .ssh 目录:

$ mkdir .ssh
$ chmod 700 ~/.ssh

本地通过 scp 上传公钥:

$ scp -P 22 ~/.ssh/id_rsa.pub osmc@192.168.1.xxx:~/.ssh/id_rsa_localbox.pub

远程对其进行授权:

$ cd ~/.ssh
$ cat id_rsa_localbox.pub >> authorized_keys
$ rm id_rsa_localbox.pub
$ chmod 644 ~/.ssh/authorized_keys

大功告成。

新启 Session 尝试连接成功后再禁止密码登录。

NFS

服务端设置

假设 NAS 当前 IP 是 192.168.1.yyy
目标共享目录是 /volume1/videos

NAS 上新建用户 osmc
并设置好相关目录的访问权限。

接着在配置文件 /etc/exports 中增加一行:

/volume1/videos    192.168.1.0/24(rw,async,no_wdelay,insecure,root_squash,insecure_locks,sec=sys,anonuid=1025,anongid=100)

anonuidanongid 需设置成 NAS 系统 nobody 用户的 UIDGID ,更多选项请参考鸟哥的教程

尝试使配置立即生效:

$ /usr/sbin/exportfs -arv

确认是否成功:

$ showmount -e 192.168.1.yyy
Exports list on 192.168.1.yyy:
/volume1/videos                      192.168.1.0/24

客户端设置

假设计划在 OSMC 上将视频目录挂载至 /mnt/videos

先设置文件夹权限:

$ sudo mkdir -p /mnt/videos
$ sudo chmod 755 /mnt/videos
$ sudo chown osmc:osmc /mnt/videos

再根据情况修改测速脚本 test_nfs.shvia

EXPORT="192.168.1.yyy:/volume1/videos"
MNTDIR="/mnt/videos"
TESTFILE="test.mov"

NFSPROTO="udp"
if [[ -n "$1" ]]; then
        NFSPROTO="tcp"
fi
echo "Testing transfer speed of $NFSPROTO on file $EXPORT/$TESTFILE"
echo
for rsize in 8192 16384 32768 65536 131072 262144
do
        if mount | grep $MNTDIR > /dev/null; then
                  sudo umount $MNTDIR
        fi
        sudo mount -t nfs -o rsize=$rsize,$NFSPROTO,cto,noatime,intr,nfsvers=3 $EXPORT $MNTDIR
        mntedrsize=$(cat /proc/mounts | grep $MNTDIR | grep -oE "rsize=[0-9]{4,6}" | grep -oE "[0-9]{4,6}")
        echo $MNTDIR mounted @ rsize \($((mntedrsize/1024))K\), requested rsize \($((rsize/1024))K\)
        sudo dd if=$MNTDIR/$TESTFILE of=/dev/null | grep "copied"
        echo
done
sudo umount $MNTDIR

分别以 udptcp 协议进行测试:

$ ./test_nfs.sh
...
$ ./test_nfs.sh tcp
...

从执行结果中选出最优组合。

假设 udprsize=65536 的组合速度最优。

修改 /etc/fstab 以求启动时挂载,
加上如下一行:

192.168.1.yyy:/volume1/videos /mnt/videos nfs defaults,rsize=65536,udp,cto,noexec,nosuid,nodev,noauto,noatime,intr,x-systemd.automount,nfsvers=3 0 0

请务必加上 nfsvers=3 ,因为 Raspbmc v13.1 五月第二次更新之后默认使用 NFSv4 版本协议进行挂载。

强制重新挂载:

sudo mount -av

无线网络

我使用 TPLink TL-WN725N v2 网卡,其型号为 rtl8188eu

安装驱动

以下两种方式可任选一种。

下载安装

首先查看当前的系统内核版本:

$ uname -a
Linux raspbmc 3.12.21 #2 PREEMPT Wed Jun 11 04:53:06 UTC 2014 armv6l GNU/Linux

得知内核版本为 3.12.21
可以直接下载对应的网卡驱动,
查表可得文件名为 8188eu-20140509.tar.gz
开始安装驱动:

$ wget https://dl.dropboxusercontent.com/u/80256631/8188eu-20140509.tar.gz
$ tar -zxvf 8188eu-20140509.tar.gz
$ sudo install -p -m 644 8188eu.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless
$ sudo insmod /lib/modules/$(uname -r)/kernel/drivers/net/wireless/8188eu.ko
$ sudo depmod -a

编译安装

Repository for stand-alone RTL8188EU driver 下载源文件,
上传并解压,
并将 firmware 移至相应目录:

内核高于 3.10.33+ 则可略过。

$ sudo mv rtl8188eufw.bin /lib/firmware/rtlwifi/
$ sudo chown root:root /lib/firmware/rtlwifi/rtl8188eufw.bin

然后进入源码目录开始编译:

$ make all
$ sudo make install

编译过程亦可参考这里

连接无线网络

首先确认无线网卡已安装完毕:

$ lsusb | grep Realtek
Bus 001 Device 004: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter

确认模块已加载:

$ lsmod | grep 8192
8192cu                458968  0 

安装无线连接的必备包:

$ sudo apt-get install wireless-tools wpasupplicant firmware-realtek 

确认无线配置信息:

$ iwconfig
wlan0     unassociated  Nickname:"<WIFI@REALTEK>"

搜索附近的 Wifi

$ iwlist wlan0 scan

连接至某个 SSID

假设 SSID 是 QuChao.com ,密码是 XXXXXXXXXX

$ wpa_passphrase QuChao.com XXXXXXXXXX
network={
    ssid="QuChao.com"
    #psk="XXXXXXXXXX"
    psk=XXXXXXXXXX0b07e09c22ad51dXXXXXXXXXXd3e343f57d437feecXXXXXXXXXX37
}

将回显内容写入 /etc/wpa_supplicant/wpa_supplicant.conf

network={
    ssid="QuChao.com"
    scan_ssid=1
    proto=WPA2
    key_mgmt=WPA-PSK
    pairwise=CCMP TKIP
    group=CCMP TKIP
    #psk="XXXXXXXXXX"
    psk=XXXXXXXXXX0b07e09c22ad51dXXXXXXXXXXd3e343f57d437feecXXXXXXXXXX37
}

然后配置 /etc/network/interfaces
填入以下内容进行自动连接:

auto lo
iface lo inet loopback

iface eth0 inet dhcp

auto wlan1
allow-hotplug wlan1
iface wlan1 inet dhcp
pre-up wpa_supplicant -B w -D wext -i wlan1 -c /etc/wpa_supplicant/wpa_supplicant.conf
post-down killall -q wpa_supplicant

iface default inet dhcp













- 阅读剩余部分 -