Shadowsocks-利用樹莓派(Raspberry Pi)做具有Shadowsocks功能的Gateway
標籤: DAZN, DNSmasq, geoblock, RaspberryPi樹莓派, Router, shadowsocks, VPN, 路由器
Shadowsocks-DAZN日文版是我最近愛用的線上體育播放平台,他幾乎囊括了所有知名的足球聯賽的比賽,例如英超、西甲、意甲、土超還有日本的J League,都在這個平台。加上還有NFL、F1、網球台維斯杯等賽事,以及比賽回看的功能,真的是物超所值!但是DAZN這個平台也是出了名的難搞,DAZN非常挑VPN,幾乎國外的大廠都中箭落馬,後來我就選了日本國內的Interlink這家VPN廠商的服務,之前也用的非常好。
直到最近,DAZN開始擋Interlink的IP,所以我就換了另一家日本國內的VPN廠商-良之助。可是良之助只有提供Shadowsocks功能的VPN,沒有提供一般連線速度最快的PPTP協定,這就產生了一個困擾。原先我可以利用我的Raspberry Pi製作一個具有PPTP功能的wifi router,然後在連線到這個router,再把DAZN的影像投影至電視上。但是換成Shadowsocks協定,就比較不能用這樣的方式建立wifi router,將DAZN的影像投影。
後來,我在網路上看到有人利用Shadowsocks的Redirect功能,製作一個Gateway,讓在同一個網域的機器,可以藉由設定Gateway的方式,讓網路流量流到這個Gateway,達到VPN或翻牆的目的。他的概念如下:

於是我就想到我有一台Raspberry Pi 剛好空著,可以拿來做Shadowsocks的Gateway,所以以下就是我的步驟。
1.先用一片16G或32G的Micro SD,把抓取Raspberry Pi 的Buster版本的映像檔,用Etcher燒到Micro SD上。用Buster版本的好處是可以利用Repository的方式來更新、安裝,不用再自己自行製作deb包,來安裝Shadowsocks-libev。
2.先更新Repository並進行更新作業
Sudo apt update
Sudo apt upgrade
然後安裝Shadowsocks-libev
Sudo apt-get install shadowsocks-libev
3.在目錄下創建/etc/redir.json並將以下內容貼上。local_address必須使用0.0.0.0,使用127.0.0.1會出問題。另外,服務器地址要用IP的方式(例如60.138.248.203),而不是用像tw.yahoo.com的方式填寫。
Sudo nano /etc/redir.json
將以下內容貼上
{
“server”:”服务器地址”,
“server_port”:服务器开放的端口,
“local_address”:”0.0.0.0″,
“local_port”:1080,
“password”:”密码”,
“timeout”:600,
“method”:”aes-256-cfb”,
“fast_open”:false
}
4.改寫/etc/sysctl.conf
Sudo nano /etc/sysctl.conf
將
#net.ipv4.ip_forward=1
改為
net.ipv4.ip_forward=1
然後製作兩個腳本
Sudo nano iptables.sh
將以下內容貼上
#!/bin/bash
# Create new chain
iptables -t nat -N SHADOWSOCKS
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
# Ignore your shadowsocks server’s addresses
# It’s very IMPORTANT, just be careful.
iptables -t nat -A SHADOWSOCKS -d 服务器ip地址 -j RETURN
# 这一步非常重要!到服务端的出口数据不要再进行重定向,否则进入死循环
#去除内网地址
iptables -t nat -A SHADOWSOCKS -d 0.0.0.0 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 127.0.0.1 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 8.8.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/254.0.0.0 -j RETURN
#还可以加如国内ip段参见 https://gist.github.com/wen-long/8644507
# Anything else should be redirected to shadowsocks’s local port
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT –to-ports 1080
# Apply the rules
#iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS
# 对于本机全局代理必须是加入到OUTPUT链中,上面这句可以不加,至此脚本结束
製作清理脚本 flash.sh
Sudo nano flash.sh
將以下內容貼上
#!/bin/bash
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
5.安裝dnsmasq及networkmanger
Sudo apt-get install network-manager dnsmasq
要在networkmanger中啟動dnsmasq
Sudo nano /etc/NetworkManager/NetworkManager.conf
將
dns=dnsmasq貼在前面有[main]文字的下面。
[main]
dns=dnsmasq
修改默认的dns配置文件
Sudo nano /etc/reslov.conf
將以下內容貼上
nameserver 127.0.0.1
創建/etc/reslov.dnsmasq
Sudo nano /etc/reslov.dnsmasq
將以下內容貼上
nameserver 127.0.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4
编辑/etc/dnsmasq.conf
Sudo nano /etc/dnsmasq.conf
在最後的地方加入
conf-dir=/etc/dnsmasq.d/,*.conf
listen-address=192.168.1.104
bind-interfaces
cache-size=100000
domain-needed
resolv-file=/etc/resolv.dnsmasq
listen-address的地方請改為你的Raspberry Pi目前所在的IP位置。
啟動程序
Sudo systemctl enable dnsmasq
Sudo systemctl start dnsmasq
Ss-redir -u -c /etc/redir.json -f /var/run/shadowsocks.pid
Sudo sh ./iptables.sh
應用實例
在Apple TV上,可以先進入一般->網路->wifi設定,之後點選手動設定。
將IP和MASK填入先前的設定值,然後把Gateway和DNS都填入樹莓派網關的IP。手機上也是一樣的設定,這裡就不再贅述。
然後,如果沒有意外,就可以把DAZN的訊號投射到APPLE TV上了。
2020/02/27新增內容-如何停止/啟動SS-redir
如果你是使用vps,例如Vultr之類的服務商,他們的主機的IP都是固定的,所以基本上Shadowsocks的連線都是穩定的。可是我另外一個Shadowsocks的服務商,他的Server IP就是浮動的,主要是因為對岸的GFW的原因,所以IP必須要是浮動的才能躲過封鎖。但是這也衍伸出一個問題,我要如何重新啟動SS-redir?
當然你可以一直不停的重開機,但是萬一他一個小時浮動一次,這樣不只你覺得厭煩,你的機器(樹莓派)可能也會招架不住。於是我就上網搜尋,找到了一個解決之道。
首先先輸入,
ps -aux | less
然後再用上下方向鍵,尋找SS-redir的PID代碼。請找尋pi以及ss-redir -u -c /etc/redir.json -f /var/run/shadowsocks.pid之前的PID數字。以下圖為例,這次的PID代碼為3913。

接著輸入#Q,離開ps -aux | less的畫面。
然後要利用kill指令來停止SS-redir。
kill -9 <PID代碼>
停止完成之後,再次啟動SS-redir
ss-redir -u -c /etc/redir.json -f /var/run/shadowsocks.pid
如果沒問題的話,你的Shadowsocks應該又可以重新連線了。
延伸閱讀:
ss-redir+dnsmasq+iptables 透明代理






2 Replies to “Shadowsocks-利用樹莓派(Raspberry Pi)做具有Shadowsocks功能的Gateway”