使用树莓派搭建透明代理、搭建本地DNS服务器及使用cloudflareAPI实现DDNS教程

写在前面

我的网件路由器拿来当AP用了,所以没法使用梅林固件的插件进行魔法上网。手机电脑都还好,但是ns就比较蛋疼了,不挂代理下载慢的跟蜗牛一样,而且不知道为什么国内的一些dns会把ns访问的域名解析到美帝的节点去,所以就想了这么一出。(题目又臭又长请见谅)

准备工作

硬件

  • 树莓派4b(别的也行,反正差不多)
  • 陈年MacBookAir
  • Windows电脑一台(下面我会解释为什么有Mac还要加台Windows的电脑)
  • 网线一根
  • sd卡一张(大小随意,我用的是闪迪64gb A1的卡)
  • 读卡器
  • 树莓派对应充电线(4是type-c,之前是microUSB)

软件

~~分享站暂时下线,目前有点小问题 ~~已重新上线

烧录系统

这一步其实很简单,把上面提到的Ubuntu的固件下载下来,然后在balenaEtcher中就可以一键刷入。
我的Mac不知道为什么这个软件用不了,正好家里有另一台笔记本能用就懒得折腾了。
Select image那选中我们所要烧录的固件–>Select drive选中我们所要烧录到的sd卡(做这一步的时候建议把别的什么储存卡之类的拔掉,并仔细确认选中的是对的。不要问我为什么)–>点右边的flash等待完成刷入。

树莓派开机及使用

将sd卡插到树莓派上,接上网线,插上供电线即可
等待网口的黄灯闪烁说明已将成功了
这时候我们需要登陆到路由器管理页面查看树莓派的ip(如果是动态ip的话需要将树莓派ip固定下来)
我的树莓派内网IP是192.168.1.149
在ssh工具里填写好IP,同时使用的用户名是ubuntu,默认密码为ubuntu。第一次连接后会要求强制更改密码。
在接下去使用的过程中,需要使用root用户,请使用sudo -i将自己的用户更改为root
首先需要更改源,因为Ubuntu的官方源在国内还是比较慢的(后面还会降到更慢的)

替换源

这里我们需要将文件中的所有源的地址更改为国内源的地址

vim /etc/apt/sources.list    #打开文件

按i开启编辑模式,将文件中的所有网址替换为以下任意一种

中科大源

mirrors.ustc.edu.cn   #中科大源

###############  你也可以选择先删光文件内容直接复制以下内容  ############

deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

阿里云源

mirrors.aliyun.com    #阿里云源

###############  你也可以选择先删光文件内容直接复制以下内容  ############

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

163源

mirrors.163.com      #163源

###############  你也可以选择先删光文件内容直接复制以下内容  ############

deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse

清华源

mirrors.tuna.tsinghua.edu.cn     #清华源

###############  你也可以选择先删光文件内容直接复制以下内容  ############

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

结束后按esc退出编辑模式并输入:wq保存并退出
修改后更新源

sudo apt-get update
sudo apt-get upgrade

搭建本地DNS服务器

搭建本地DNS服务器使用的是Dnsmasq

安装Dnsmasq

apt-get install dnsmasq

配置Dnsmasq

dnsmasq.conf

打开配置文件

vim /etc/dnsmasq.conf

按i打开编辑模式
去掉strict-order前面的#号
设置listen-address,配置如下:

listen-address=127.0.0.1,逗号后的这里请填写树莓派的内网IP地址

修改缓存大小(就在目前打开的文件中添加以下内容即可)

cache-size=10000

resolv.conf

打开文件

vim /etc/resolv.conf

添加上游dns,格式如下

nameserver 此处填写DNS地址,注意和前面的nameserver之间要有一个空格

查询顺序自上而下,可以多添加几个上游DNS地址
esc退出编辑模式
输入:wq保存并退出

启动

启动

service dnsmasq restart

查看运行状态

service dnsmasq status

没有报错就说明安装成功了

搭建透明代理

这里我们使用的是大名鼎鼎的clash

安装clash

找到armv7的包,复制链接并使用wget下载到机器(个人建议用能魔法上网的电脑先下载好之后上传到树莓派上,这里不介绍怎么传了)

mkdir /home/clash
cd /home/clash
wget 此处填入前面找到的安装包的下载链接,比如写这篇文章时的是https://github.com/Dreamacro/clash/releases/download/v0.19.0/clash-linux-armv7-v0.19.0.gz

gunzip clash-linux-armv7-v0.19.0.gz     #解压包,记得把文件名替换成你下载的文件的文件名
mv clash-linux-armv7-v0.19.0 /usr/local/bin/clash     #将解压好的文件夹移动至/usr/local/bin/clash

chmod +x /usr/local/bin/clash    #给权限

配置文件

配置文件怎么来的不解释,这里默认大家已经有配置文件了。
假设我们手上有一个配置文件(文件名为a.yaml,文件路径为/home/clash/a.yaml),且目前我们处于/home/clash这个文件夹中
重命名配置文件

mv a.yaml config.yaml

打开并修改配置文件

vim config.yaml

将文件中的这两个配置修改成如下

allow-lan: true    #即允许来自局域网的连接

external-controller: 0.0.0.0:9090    #可以外部控制

保存并退出

启动clash

clash -d /home/clash

无错误输出的就是成功了

守护程序

这里介绍service,也可以选用pm2(推荐)

cd /etc/systemd/system
vim clash.service

在文件中添加如下内容

# This is about to control clash's start|stop|restart|status|enable
[Unit]
Description=Clash Service
After=network.target

[Service]
ExecStart=/usr/local/bin/clash -d /home/clash
Restart=on-abort
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

要注意ExecStart=/usr/local/bin/clash -d /home/clash这行使用的命令,如果按我的教程做的不需要修改,如果配置文件位置不一样的请自行做调整
启动

systemctl start clash

查看运行状态

systemctl status clash

开机自启

systemctl enable clash

小结

这样就完成了clash的设置,局域网内的设备就可以通过配置文件里设置的端口设置代理进行魔法上网了。(默认http是7890,socks是7891,请自行查看配置文件设置的端口)
想要外网访问的话需要路由器支持端口转发,请自行设置。
这里不介绍web管理页面怎么弄了,非常简单,GitHub上把文件下载到电脑点开文件夹里的index.html文件就能用(管理页面会要求填ip和端口号,ip是树莓派内网ip,端口号是之前在修改配置文件时提到的external-controller: 0.0.0.0:9090这里的9090)。

使用cloudflareAPI实现DDNS

事情是这样的,本来我想弄完上面两样就收工的,然后想想得折腾折腾让外网也能正常访问。但我家宽带是动态ip我使用的主路由是TP-LINK的企业级路由,虽然支持使用ddns但是只能使用固定那几家的(花生壳啥的),但我不想用。正好我有域名,且是cloudflare托管,就使用cloudflare的api来实现ddns。
这里使用到的脚本来自这位大神的这篇文章(利用 CloudFlare API 实现自动 DDNS 功能|支持IPv4|IPv6),我家是IPv4所以我去掉了IPv6的内容,如需要请前往原文查看IPv6相关设置,这里就不多介绍了。

脚本

#!/bin/bash

auth_email="cloudflare账号邮箱"
auth_key="api秘钥"
zone_name="根域名"
record_name="绑定公网ip的子域名"

record_type="A"
ip=$(curl -s http://members.3322.org/dyndns/getip)
ip_file="ip.txt"
id_file="cloudflare.ids"
log_file="cloudflare.log"
log() {
	if [ "$1" ]; then
		echo -e "[$(date)] - $1" >> $log_file
	fi
}
log "Check Initiated"

if [ -f $ip_file ]; then
	old_ip=$(cat $ip_file)
	if [ "$ip" == "$old_ip" ]; then
		echo "IP has not changed."
		exit 0
	fi
fi

if [ -f $id_file ] && [ $(wc -l $id_file | cut -d " " -f 1) == 2 ]; then
	zone_identifier=$(head -1 $id_file)
	record_identifier=$(tail -1 $id_file)
else
	zone_identifier=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$zone_name" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json" | grep -Po '(?<="id":")[^"]*' | head -1 )
	record_identifier=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records?name=$record_name&type=$record_type" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json"  | grep -Po '(?<="id":")[^"]*')
	echo "$zone_identifier" > $id_file
	echo "$record_identifier" >> $id_file
fi

update=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json" --data "{\"id\":\"$zone_identifier\",\"type\":\"$record_type\",\"name\":\"$record_name\",\"content\":\"$ip\"}")

if [[ $update == *"\"success\":false"* ]]; then
	message="API UPDATE FAILED. DUMPING RESULTS:\n$update"
	log "$message"
	echo -e "$message"
	exit 1
else
	message="IP changed to: $ip"
	echo "$ip" > $ip_file
	log "$message"
	echo "$message"
fi

使用方法

先确定自家宽带目前的公网ip,并添加到CloudFlare的DNS记录中(不要打开CDN)
并在概述处找到api,获取Global API Key的秘钥

制作脚本

cd /home
vim cfapi.sh

填入上面提到的脚本,并将上面有中文的四行依次填入中文所示的信息后保存并退出。

执行

chmod +x cfapi.sh
./cfapi.sh

如果下面这个输出了宽带公网ip或显示ip为改变则说明成功了

输出了这个
IP changed to: ****
或者这个
IP has not changed.
就是成功了

定时运行

我家路由器每天四点重启,所以每天四点都会更新IP,我们需要做的就是让脚本定时运行,保证实时更新。

service cron start  #启动定时执行工具
crontab -e  #编辑配置

第一次执行会显示让你选择使用的编辑工具,填对应数字并回车就行,我选择的是2(vim)
接着的操作和之前使用vim完全一样
这里我们填入以下命令

0 5 * * *  /home/cfapi.sh >/dev/null 2>&1

即每天五点运行一次脚本(具体含义可参考这篇文章
保存并退出
重启程序

service cron restart

完成。

后记

折腾完了我也身心舒畅了,你说折腾这个有啥用其实也真没什么用。但也算是学到了不少新的知识吧。
写这篇文章花了我两个小时,从晚上八点半写到晚上十点半,真的累。创作不易,欢迎大家支持和资瓷。


使用树莓派搭建透明代理、搭建本地DNS服务器及使用cloudflareAPI实现DDNS教程
https://blog.xianyu.one/2020/04/06/Linux/tutorial/rpi4-socks-ddns-dns/
作者
咸鱼
发布于
2020年4月6日
许可协议