在 Banana Pi R2 上安装 Ubuntu 并设置 NAT、DNS 缓存服务器和 DHCP 服务器

下载操作系统镜像文件

下载 2017-09-04-ubuntu-16.04-mate-desktop-bpi-r2-sd-emmc-v1.2.0.img.zip

解压缩 zip 文件

unzip 2017-09-04-ubuntu-16.04-mate-desktop-bpi-r2-sd-emmc-v1.2.0.img.zip

dd 到 SD 卡

下面的命令是在 macOS 上的示例,其它操作系统请自行修改。

列出磁盘以便找到 SD 卡对应的设备路径

diskutil list

unmount disk

注意替换下面的 diskN。

diskutil unmountDisk diskN

注意替换下面的 diskN,且 of 参数不要写错,否则 of 参数所指磁盘数据会丢失。

sudo dd if=2017-09-04-ubuntu-16.04-mate-desktop-bpi-r2-sd-emmc-v1.2.0.img of=/dev/diskN bs=1m conv=sync

开机

将 SD 卡插入 Banana Pi R2,按住电源按钮几秒钟,直到电源插孔旁边的三个指示灯中间那个红灯长时间亮起。

电源按钮按下时,标有 R、G、B 的三个指示灯会长时间亮起;按下约8秒,标有 B 的指示灯熄灭,电源插孔旁的蓝色和绿色指示灯依次闪烁一下后,紧挨的红色指示灯长时间亮起,此时保持电源按钮按下约1秒后,接在 HDMI 接口的显示屏上会有内容显示,此时可以松开电源按钮。

操作系统默认用户名/密码为 pi/bananapi 和 root/bananapi。

设置网络接口

添加文件 /etc/network/interfaces.d/eth0,内容为:

auto eth0
iface eth0 inet static
	address 10.5.2.1
	network 10.5.2.0
	netmask 255.255.255.0

执行下面的命令使得上述对网络接口 eth0 的配置生效:

service networking restart

允许 IPv4 转发

添加文件 /etc/sysctl.d/60-ipv4-forward.conf,内容为:

net.ipv4.ip_forward=1

并执行下面的命令使得 IPv4 转发生效:

service procps start

(或者每次开机后都执行命令 echo 1 > /proc/sys/net/ipv4/ip_forward。)

配置 iptables

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -A FORWARD -i eth1 -o eth0 -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

注意这些 iptables 的设置在操作系统重启后并不会保持。可以使用 iptables-save、iptables-restore 和 iptables-persistent 来转存、恢复和持久化 iptables 规则。

安装 iptables-persistent

apt install iptables-persistent netfilter-persistent

安装结束后会询问是否保存 iptables 规则,选择保存就可以了。它将规则保存于目录 /etc/iptables/。
在修改了 iptables 规则后,需要重新保存,可使用命令:

service netfilter-persistent save

安装和配置 DNS 缓存服务器和 DHCP 服务器

安装 dnsmasq

apt install dnsmasq

添加文件 /etc/dnsmasq.d/dhcp.conf,内容为:

dhcp-range=10.5.2.50,10.5.2.150,12h

使用如下命令重启 dnsmasq 使得 dhcp-range 配置生效:

service dnsmasq restart

Advertisements

#banana-pi-r2, #bpi-r2, #dhcp, #dnsmasq, #iptables, #iptables-persistent, #linux, #nat, #netfilter-persistent

一个适用于 CN 网络的 VPN 解决方案

部署图

说明

  • VPN Clients 是位于 CN 网络的 VPN 客户端。
  • ns.example.net 和 vpn.example.net 可以是同一台机器,应位于防火墙(即 the Great Firewall,下同)内。
  • radius.example.net 和 pgsql.example.net 位置无所谓,但是最好和 vpn.example.net 很近或者位于同一台机器,以便获得更短的延时。
  • ss-server.example.net 应位于防火墙外。

安装

ss-server.example.net
安装 shadowsocks-libev 服务器端
pgsql.example.net
在 FreeBSD 上安装 PostgreSQL
radius.example.net
在 FreeBSD 上安装 FreeRADIUS
ns.example.net
使用 dnsmasq 和 shadowsocks-libev 构建一个干净的域名服务器
vpn.example.net
strongSwan 的安装和配置

#cisco-ipsec, #dnsmasq, #freebsd, #freeradius, #gfw, #gfwlist, #gfwlist2dnsmasq-awk, #ikev2, #ipsec, #iptables, #letsencrypt, #postgresql, #shadowsocks-libev, #ss-redir, #ss-server, #ss-tunnel, #strongswan, #ubuntu, #vpn

使用 dnsmasq 和 shadowsocks-libev 构建一个干净的域名服务器

需要两台服务器。

一台位于离我们近的机房,这个机房可以是位于有域名服务器缓存污染的防火墙内。(当然如果不是有污染的环境,也没有必要写这篇文章。)

一台位于没有域名服务器缓存污染的防火墙外。

我们把这两台服务器分别取名为 ns.example.net 和 ss-server.example.net。

不能直接使用防火墙外的域名服务器作为客户端的域名服务器,是因为当域名解析数据包经过防火墙时会被投毒。

使用 dnsmasq 来分流不同的域名解析请求,是因为如果全部定向到防火墙外的域名服务器,对某些使用 CDN 的网站,特别是防火墙内的网站将会被解析得到距离我们较远的服务器的 IP。

在 ns.example.net 上安装和运行 dnsmasq 和 ss-tunnel(包含在 shadowsocks-libev),在 ss-server.example.net 上安装和运行 ss-server(包含在 shadowsocks-libev)。

部署图如下:

版本信息

本文测试环境:

  • Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-72-generic x86_64)
  • shadowsocks-libev 2.6.3

ss-server.example.net 的安装

见:安装 shadowsocks-libev 服务器端

ns.example.net 的安装

dnsmasq

轻量级 DNS 转发器、DHCP 和 TFTP 服务器。我们利用它的 DNS 转发功能。

安装

apt install dnsmasq

配置

确保文件 /etc/dnsmasq.conf 包含了如下代码,它通常位于最后一行:

# Include all files in a directory which end in .conf
conf-dir=/etc/dnsmasq.d/,*.conf

gfwlist2dnsmasq.sh

创建一个脚本文件 /usr/local/bin/gfwlist2dnsmasq.sh (chmod +x),内容如下:

#!/bin/sh
dnsmasqconf="/etc/dnsmasq.d/gfwlist.conf"
tmpconf="/tmp/gfwlist.conf.`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1`"
curl -s -o /tmp/gfwlist.txt \
	https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt \
	&& base64 -d /tmp/gfwlist.txt \
	| awk -f $(cd "$(dirname "$0")"; pwd)/gfwlist2domainlist.awk \
		- /usr/local/etc/user_rule.txt \
	| grep -F -v -f "/usr/local/etc/skip_domain.txt" \
	| awk -f $(cd "$(dirname "$0")"; pwd)/domainlist2dnsmasq.awk \
		-v "noipset=noipset" \
		- \
	> "${tmpconf}" 2>/dev/null

diff -I '#.*' "${dnsmasqconf}" "${tmpconf}" || \
	(cp "${tmpconf}" "${dnsmasqconf}" && service dnsmasq restart)

rm "${tmpconf}"

该脚本会生成 dnsmasq 配置文件 /etc/dnsmasq.d/gfwlist.conf 让 dnsmasq 将 gfwlist 中的域名的解析转发到 127.0.0.1:5353 端口。

gfwlist2domainlist.awk 和 domainlist2dnsmasq.awk 可以从 gfwlist2dnsmasq.awk 获得。

/usr/local/etc/user_rule.txt 可以用来存放额外的想交由 127.0.0.1:5353 端口解析的域名列表,
/usr/local/etc/skip_domain.txt 可以用来存放在 gfwlist 列表中,但是不想交由 127.0.0.1:5353 端口解析的域名。

在 /etc/rc.local 的 exit 0 之前添加,使其在开机时运行一次:

/usr/local/bin/gfwlist2dnsmasq.sh

由于 gfwlist 是不断更新的,所以可以在 /etc/crontab 中添加,以便每天早上4点20分更新一次:

20 4	* * *	root	/usr/local/bin/gfwlist2dnsmasq.sh

ss-tunnel

安装

同:安装 shadowsocks-libev 服务器端

启动

在 /etc/rc.local 的 exit 0 之前添加如下代码,以便开机时自动运行一个监听在 127.0.0.1:5353 端口,请求会通过隧道转到 8.8.8.8:53 上。

/usr/local/bin/ss-tunnel -c /usr/local/etc/shadowsocks-libev/config.json -l 5353 -L 8.8.8.8:53 -u -A > /dev/null 2>&1 &

测试

在 ns.example.net 上可以通过如下命令来测试 ss-tunnel 创建的隧道是否正常工作:

root@ns:~# nslookup 
> server 127.0.0.1
Default server: 127.0.0.1
Address: 127.0.0.1#53
> set port=5353
> www.google.com
Server:		127.0.0.1
Address:	127.0.0.1#5353

Non-authoritative answer:
Name:	www.google.com
Address: 172.217.25.4
> exit

#dnsmasq, #gfwlist, #gfwlist2dnsmasq-awk, #shadowsocks-libev, #ss-server, #ss-tunnel, #ubuntu