Padavan 固件配置 6plat 的 6in4 隧道开启内网 IPv6 支持

上个周末入手了一台斐讯 K2,然后刷机了 Padavan 固件
开启了 SS 和 Adbyby 之后,发现路由器 CPU 负载和空闲内存都还很理想,所以就申请了 6Plat 个人用企业账号(需填写《6Plat企业模块申请单》,申请方为个人,附上姓名、身份证号码和手机,另外还需要公网 IP,动态 IP 需要设置 DDNS)。
发送申请邮件后,很快就收到配置信息,有五项配置,分别是:

  • 6plat 端公网 IPv4 地址:118.145.*.*
  • 6plat 端 6in4 隧道 IPv6 地址:*:*:*::1/64
  • 您的设备 6in4 隧道 IPv6 地址:*:*:*::2/64
  • 您可用 IPv6 网段:*:*:*::/48
  • IPv6 防污染 DNS:240c::6666

但 Padavan 是 WAN 中配置 IPv6,相关配置项目名称并不是一一对应,特别是 IPv6 内网地址的配置。

  • IPv6 连接类型: Tunnle 6in4
  • IPv6 硬件加速:
  • 6in4 远程端点 (IPv4): 118.145.*.* 对应 6plat 端公网 IPv4 地址
  • 隧道 MTU: 1480
  • 隧道 TTL: 64
  • IPv6 外网地址: *:*:*::2 对应 您的设备 6in4 隧道 IPv6 地址,不需要 /64 见下
  • IPv6 外网前缀长度: 64
  • IPv6 外网默认网关: *:*:*::1 对应 6plat 端 6in4 隧道 IPv6 地址,不需要 /64 见上
  • DNSv6 服务器 1: 240c::6666 对应 IPv6 防污染 DNS
  • DNSv6 服务器 2: 2001:4860:4860::8888 备用的 Google IPv6 DNS
  • DNSv6 服务器 3: 2001:4860:4860::8844 备用的 Google IPv6 DNS
  • IPv6 内网地址: *:*:*:1::1 对应 您可用 IPv6 网段,只需要选用一个子网段,所以在原有配置中间加了一个 :1
  • IPv6 内网前缀长度: 64 只使用了 /64
  • 启用 LAN 路由器通告:
  • 启用 LAN DHCPv6 服务器: Stateless (*)

网站开启 HSTS 与 HPKP

HSTS 是 HTTP Strict Transport Security,即 HTTP 严格传输安全。也就是强制使用 https 访问网站。之前有过配置,但现在 Chrome 有内置离线数据库支持 HSTS,直接在 Chrome 安装时就知道指定的域名开启了 HSTS。
HPKP 是 HTTP Public Key Pinning,即 HTTP 公钥固定。让浏览器可以缓存服务器证书指纹,因为服务器证书会经常性更新,所以一般提供的指纹是上级颁发者的中级证书指纹。
加上前段时间配置了 IPv6 访问,现在剩下的就只有 DNSCrypt 没有配置了。

使用 Caddy 和 Dnspod 自动申请 Let’s Encrypt 证书

Let’s Encrypt 申请证书的 ACME 协议支持三种认证,分别是:

  1. 基于 80 端口的 http-01
  2. 基于 443 端口的 tls-sni-02
  3. 无需端口的 dns-01

dns-01 需要在 DNS 服务器增加对应的 TXT 记录来完成验证。

Caddy 现在有官方的 tls.dns.dnspod 插件支持托管在 Dnspod 的域名使用 dns-01 来申请 Let’s Encrypt 证书。

首先,需要在 Dnspod 用户中心的安全设置中申请 API Token,复制其 ID 和 TOKEN。

然后,修改 Caddy 服务配置脚本,比如 sysvinit 系统的 /etc/init.d/caddyexport CADDYPATH=/etc/ssl/caddy 后面增加一行:


export DNSPOD_API_KEY="$ID,$TOKEN"

就是用 ID 和 TOKEN 以英文逗号分割的字符串。

最后,就是在对应的 Caddyfile 文件配置中启用:


tls {
dns dnspod
}

如果有配置多个域名,第一次启动会比较缓慢。因为需要每个域名依次申请证书。

题外话:

  • 树莓派 1 代在下载 Caddy 时需要在 PLATFORM 选择 Linux ARMv6,然后在 PLUGINS 中选择 tls.dns.dnspod 即可。
  • 如果 Dnspod 自己支持 DDNS 接口,不过一般路由器比如 TP-LINK 系都会支持花生壳 DDNS,自动在路由连接时登记,比定时脚本要靠谱很多。自己的域名只需要在 Dnspod 中 CNAME 到花生壳的免费域名。
  • 一般情况,运营商不会开放 80 端口,但 443 端口是开放的。只需要在路由器将 443 端口转发给内网设备。
  • Caddy 可以作为前端反向代理系统的其他的 http 服务,只需要每个服务多建一个域名即可。

完全使用 Let’s Encrypt 证书

因为众所周知的原因,StartSSL 已经不合适再继续使用了。而且 Let’s Encrypt 也足够好用。

Ubuntu 下直接使用 ppa:certbot/certbot 即可。只是因为脚本各种更新导致配置凌乱,现在应该稳定了。

并且,出于安全原因,90 天有效的证书似乎更好~

服务器升级到 ubuntu 16.04,php 7.0

上半年就计划升级了,但是正好遇上换工作,连 GitLab 的事情都耽搁下来,也就一直拖着。

工作的事情算是稍微告一段落,至少可以把自己用编码上摘出来。再加上前段时间把开发环境也试着转移到 xenial 的 7.0 下。所以,最终决定把服务器转移,并升级到新系统、新环境。

看了一下博客,已经是半年时间没有写过任何东西。长期以来,这里只是偶尔间随笔一样的东西。但这段时间都没坚持。

毕竟,最近越来越感觉到生活的压力。

将私人的 git 仓库从 gitlab 切换成 gogs

只有 1G 内存的 openvz VPS 又不能自由配置 swap 实在是跑不起 GitLab。
常年 90% 以上的内存占有率导致 php5-fpm 总是新进程申请不到足够的内存可用,导致 nginx 502。

考虑到私人 git 所需功能不多,就将原本跑在树莓派上的 gogs 迁移到 vps。然后直接在服务器上找到原来 gitlab 的 bare 目录,一个一个 git push –mirror 到 gogs 地址。

树莓派网关代理

参考文章树莓派二代 dnsmasq ipset iptables shadowsocks 网关代理将gfwlist转换成带ipset的dnsmasq规则,适用于OpenWrt智能上网使用ipset让openwrt上的shadowsocks更智能的重定向流量的补充终于折腾好了。

先简单说下原理。一般来说,正常的上网是通过路由器拨号上网并充当网关进行 NAT 转发,实现本地局域网内多台设备同时上网。而问题在于,路由器一般功能有限无法提供更加智能的网关业务处理。除非路由器支持第三方固件升级,如 OpenWrt 或 DDWrt 等。实际上,除开路由器网关,可以使用其他电脑(比如树莓派)充当二级网关,来解决此问题。

原有的网络拓扑是路由器 IP 为 192.168.1.1,通过路由器上的 DHCP 指定网关为 192.168.1.1,主 DNS 服务器为 119.29.29.29 备选 DNS 服务器为 114.114.114.114。

修改后的网络拓扑是路由器 IP 为 192.168.1.1,树莓派 IP 为 192.168.1.2,通过路由器上的 DHCP 指定网关为 192.168.1.2,主 DNS 服务器为 192.168.1.2 备选 DNS 服务器为 119.29.29.29。树莓派的网关为 192.168.1.1,手工指定主 DNS 服务器为 119.29.29.29 备选 DNS 服务器为 114.114.114.114。

所以第一步需要将树莓派设置为 iface eth0 inet static,执行 sudo nano /etc/network/interfaces,修改内容如下:

auto lo

iface lo inet loopback

auto eth0
#iface eth0 inet dhcp
iface eth0 inet static
        address 192.168.1.2
        netmask 255.255.255.0
        network 192.168.1.0
        gateway 192.168.1.1

然后,执行 sudo nano /etc/resolv.conf,修改内容如下:

nameserver 119.29.29.29
nameserver 114.114.114.114

下一步是打开 NAT 网关,执行 sudo nano /etc/sysctl.conf,修改指定行为:

net.ipv4.ip_forward=1

检查 sudo nano /etc/iptables.up.rules,如果有 8080 转发,请禁止

:POSTROUTING ACCEPT [0:0]
#-A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8081
#-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
COMMIT

NAT 需要重启才能生效。这样,树莓派可以充当一个普通的网关代理,但没有 DNS 服务。此时可以将客户端网关修改为 192.168.1.2,DNS 服务器指定为 119.29.29.29 检查是否可以上网。

我们知道,通过域名访问任何一项网络服务,都先必须解析域名。现在要做的就是,树莓派使用 dnsmasq 提供局域网的 DNS 服务,使用特殊的规则解析指定的域名,并将解析到的 IP 加入 ipset 规则组,然后 iptables nat 使用 ipset 指定的规则组自动走 shadowsocks 的代理线路进行访问。从而达到我们的目的。

需要安装的包有:sudo apt-get install ipset dnsmasq shadowsocks-libev

我们并不需要 shadowsocks-libev 自带的 server 服务,执行 sudo update-rc.d shadowsocks-libev remove 禁止自动启动服务。

替代的是使用 ss-redir 连接 shadowsocks 代理服务器(通常会使用的是 ss-local 来开启 socks 代理,但 redir 会减少 socks 代理开销)。

手工建立 shadowsocks-redir 服务,执行:

sudo cp /etc/init.d/shadowsocks-libev /etc/init.d/shadowsocks-redir
sudo cp /etc/default/shadowsocks-libev /etc/default/shadowsocks-redir
sudo cp /etc/shadowsocks-libev/config.json.dpkg-old /etc/shadowsocks-libev/redir.json

需要 sudo nano /etc/init.d/shadowsocks-redir 将相关 shadowsocks-libev 改为 shadowsocks-redir,以及 ss-server 改为 ss-redir

# Provides:          shadowsocks-redir
DESC=shadowsocks-redir       # Introduce a short description here
NAME=shadowsocks-redir       # Introduce the short server's name here
DAEMON=/usr/bin/ss-redir     # Introduce the server's location here

sudo nano /etc/default/shadowsocks-redir 修改 CONFFILE

CONFFILE="/etc/shadowsocks-libev/redir.json"

sudo nano /etc/shadowsocks-libev/redir.json 配置 local_address 和端口,需要绑定 0.0.0.0 和 1080 端口(建议)

{
    "server":"example.com",
    "server_port":10307,
    "local_address":"0.0.0.0",
    "local_port":1080,
    "password":"password"
}

开启服务,并设置自动启动服务

sudo service shadowsocks-redir start 
sudo update-rc.d shadowsocks-redir defaults

可以使用 sudo netstat -nlp | grep redir 查看服务端口是否正常。

使用 sudo ipset -N ss iphash 创建新的 ipset 规则组,因为系统重启后 ipset 数据会丢失,建议将 ipset -N ss iphash 加入到 /etc/init.d/networkingstart> 中,如

case "$1" in
start)
        if init_is_upstart; then
                exit 1
        fi
        ipset -N ss iphash
        process_options
        check_ifstate

否则,修改 iptables 默认规则后,会导致 ss 规则找不到,从而无法启动网络。

修改 iptables nat 规则,sudo iptables -t nat -A PREROUTING -p tcp -m set --match-set ss dst -j REDIRECT --to-port 1080

因为 iptables 重启后规则失效,需要修改 sudo nano /etc/iptables.up.rules

:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -m set --match-set ss dst -j REDIRECT --to-port 1080
COMMIT

下一步就是配置 dnsmasq,首先打开 sudo nano /etc/dnsmasq.conf,修改

# Include another lot of configuration options.
#conf-file=/etc/dnsmasq.more.conf
conf-dir=/etc/dnsmasq.d

然后创建一个 google 的规则 sudo nano /etc/dnsmasq.d/google.conf 内容为

server=/.googleapis.com/208.67.222.222#5353
ipset=/.googleapis.com/ss
server=/.google.com/208.67.222.222#5353
ipset=/.google.com/ss

使用 sudo service dnsmasq restart 重启服务,并将客户端的网关和 DNS 服务器都改为 192.168.1.2 即可以直接访问 google。

最后一步就是每天自动更新 gfwlist 规则为 dnsmasq 配置了。执行 sudo nano /etc/cron.daily/dnsmasq-gfwlist.py,内容为 https://gist.github.com/larryli/bf0671b41ede5d77c52862f57fff6159

所有测试没问题后,请将路由器 DHCP 服务器,将网关设置为 192.168.1.2,DNS 服务器为 192.168.1.2 即完成所有配置。