avatar

基于Armbian搭建旁路由


家庭科学上网的方案有很多,本文介绍基于旁路由的方案,我选择这种方案的原因是,对主路由和家庭网络几乎无侵扰,能满足家庭普通成员的上网需求,也能满足我常常需要科学上网的需要,最重要的是相比于用主路由做透明代理,这种方案是比较稳定的,就算出了问题也不至于将家庭网络搞瘫痪。

1. 设备

我用的是斐讯N1, 网络上的大多数方案都是斐讯N1刷openwrt, 然后基于openwrt来配置旁路由,方案比较简单,只需要在页面上做配置即可。但是我的N1装的是armbian系统,不想再对它刷机了, 因此直接基于armbian来搭建旁路由。

我的N1还装了一个usb无线网卡,放在弱电箱里快两年了,放在弱电箱里的好处是我几乎感觉不到它的存在,但却有一个几乎永不会下线的服务器。该N1通过无线网卡上网,接口名称是Wlan0。

2. 网络拓扑

1主路由:192.168.31.1(提供DHCP、上网)
2N1:     192.168.31.89(Wi-Fi 接入主路由)
3SOCKS5:127.0.0.1:1080(运行在 N1 本地)
4其它设备:网关设为 192.168.31.89

其它设备发出的所有 TCP 流量 → N1 → 转发到 SOCKS5 → 出网

3. N1 Armbian的配置

3.1 首先开启ip转发

1sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
2sudo sed -i 's/^#net.ipv4.ip_forward=.*/net.ipv4.ip_forward=1/' /etc/sysctl.conf

3.2 安装redsocks2

不要装redsocks, 它对https的处理有问题,无法做到透明转发,因此会被很多网站识别出来报安全问题, 需要编译安装redsocks2

1git clone [email protected]:kaizushi/redsocks2.git
2apt install libevent-dev libssl-dev build-essential
3cd redsocks2
4make

make之后会成功编译redsocks2文件,基于该程序做一个systemd service

1install redsocks2 /usr/bin/redsocks2

vim /etc/systemd/system/redsocks2.service

写入如下内容

 1[Unit]
 2Description=Transparent redirector of any TCP connection to proxy using your firewall
 3
 4[Service]
 5Type=forking
 6EnvironmentFile=/etc/conf.d/redsocks2
 7User=root
 8ExecStartPre=/usr/bin/redsocks2 -t -c $REDSOCKS_CONF
 9ExecStart=/usr/bin/redsocks2 -c $REDSOCKS_CONF
10Restart=on-abort
11
12[Install]
13WantedBy=multi-user.target

vim /etc/conf.d/redsocks2

写入如下内容

1# 指定 redsocks2 配置文件路径
2REDSOCKS_CONF="/etc/redsocks2/redsocks2.conf"

vim /etc/redsocks2/redsocks2.conf

写入如下内容, 注意这里的type是socks5, 因为我的本地启的是socks5的代理,如果是SSR,V2ray之类的,请参考最下面的参考链接修改配置文件

 1base {
 2    log_debug = off;
 3    log_info = on;
 4    log = "syslog:daemon";
 5    daemon = on;
 6    redirector = iptables;
 7}
 8
 9redsocks {
10    local_ip = 0.0.0.0;
11    local_port = 12345;
12    ip = 127.0.0.1;
13    port = 1080;
14    type = socks5; // I use socks5 proxy for GFW'ed IP
15    // autoproxy = 1; // I want autoproxy feature enabled on this section.
16    // timeout is meaningful when 'autoproxy' is non-zero.
17    // It specified timeout value when trying to connect to destination
18    // directly. Default is 10 seconds. When it is set to 0, default
19    // timeout value will be used.
20    // NOTE: decreasing the timeout value may lead increase of chance for
21    // normal IP to be misjudged.
22    // timeout = 13;
23    //type = http-connect;
24    //login = username;
25    //password = passwd;
26}

然后启动服务

1systemctl enable redsocks2
2systemctl start redsocks2

3.3 配置iptables转发规则

把接收到的 TCP 流量重定向给 redsocks。

 1# 清理旧规则
 2sudo iptables -t nat -F
 3sudo iptables -F
 4
 5# 启用iptable_nat模块
 6echo "iptable_nat" | sudo tee /etc/modules-load.d/iptable_nat.conf
 7
 8# 新建链
 9sudo iptables -t nat -N REDSOCKS
10
11# 忽略本地及局域网流量(不要代理内网)
12sudo iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
13sudo iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
14sudo iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
15sudo iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
16sudo iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
17sudo iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
18sudo iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
19sudo iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
20
21# 其他 TCP 流量重定向到 redsocks
22sudo iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345
23
24# DNS 代理劫持
25sudo iptables -t nat -A PREROUTING -i wlan0 -p udp --dport 53 -j REDIRECT --to-ports 12345
26
27
28# 把 PREROUTING 的流量交给 REDSOCKS 处理
29sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp -j REDSOCKS

保存规则

1sudo apt install iptables-persistent -y
2sudo netfilter-persistent save

4. 测试验证

在另一台设备上设置:

1网关:192.168.31.89
2DNS:192.168.31.89(或公共 DNS)

打开浏览器访问 http://ipinfo.io/ip
应显示 SOCKS5 出口 IP;

查看 redsocks2 日志:

1sudo journalctl -u redsocks2 -f

若有连接日志说明转发正常。

参考链接

  1. redsocks2

评论列表:

暂无评论 😭