摘要
在不改动电信光猫前提下,尽量少的配置以实现二级路由后面的设备可以自由访问互联网。 在实践过程中,看了很多文章和片段,尽量消化后,记录于此。
网络拓扑
互联网 <— 光猫 <—- WNBR4300(LEDE) <—-各种设备
配置
光猫默认是路由模式(route), ip是 192.168.1.1。 此设备在默认情况下是无法修改的,如果需要高级配置,比如把IPTV/VoIP等功能在二级路由之后使用起来,需要拿到光猫更高权限密码,先将光猫改为桥接模式(bridge),再作更多配置。暂时留个坑,以后填。
WNBR4300是二级路由,刷LEDE(类似OpenWRT),采用默认配置,即级联的路由器。只需将LAN的默认ip地址修改下,避免和光猫地址(192.168.1.1)冲突. WNBR4300的LAN IP地址是192.168.2.1.
为了能访问某些网站,二级路由里,最少的配置是开启shadowsocks和dnsmasq服务.
安装LEDE基本设置
安装
设备介绍和对应的lede固件在 https://lede-project.org/toh/hwdata/netgear/netgear_wndr4300_v1 可以找到。首次安装需要选择这个 https://downloads.lede-project.org/releases/17.01.3/targets/ar71xx/nand/lede-17.01.3-ar71xx-nand-wndr4300-ubi-factory.img 。
下载后,可以用netgear原生的图形界面里的更新系统按钮,把这个固件上传上去,之后便可自动安装。安装结束后,默认没有wifi,按一下设备上的wifi按键,即可开启wifi,接入点是“LEDE”,无密码。官方推荐是用网线直连,先配置好了再开启wifi。其实用wifi也可以,但最好尽快把安全选项配置好。
浏览器里输入192.168.1.1,显示lede的管理界面,登入进去后改root密码,并设置wifi连接和密码
建立wifi
用图形话界面也可以配置,可以省却用ssh登录的麻烦。或者ssh登录后命令行管理,下面是配无线网络的接入点名,协议和密码
uci set wireless.radio0.country='CN'
uci set wireless.default_radio0.network=lan
uci set wireless.default_radio0.encryption=psk-mixed
uci set wireless.default_radio0.key='我是密码'
uci set wireless.default_radio0.ssid=LEDE2G
uci set wireless.radio1.country='CN'
uci set wireless.default_radio1.network='lan'
uci set wireless.default_radio1.encryption='psk-mixed'
uci set wireless.default_radio1.key='我是密码'
uci set wireless.default_radio1.ssid=LEDE5G
修改LAN IP使能正常工作
uci set dhcp.lan.ra_management='1'
uci set network.lan.ipaddr='192.168.2.1'
至此,路由器已经可以作为二级路由正常工作,其他连接此路由的设备应该可以正常上网了。
配置源
LEDE是个完整的linux系统,所以配置好源,就可以顺利的安装软件了。
去掉签名检查 /etc/opkg.conf
#option check_signature 0
设置国内镜像 /etc/opkg/distfeeds.conf
src/gz reboot_core http://mirrors.ustc.edu.cn/lede/releases/17.01.3/targets/ar71xx/nand/packages
src/gz reboot_base http://mirrors.ustc.edu.cn/lede/releases/17.01.3/packages/mips_24kc/base
src/gz reboot_luci http://mirrors.ustc.edu.cn/lede/releases/17.01.3/packages/mips_24kc/luci
src/gz reboot_packages http://mirrors.ustc.edu.cn/lede/releases/17.01.3/packages/mips_24kc/packages
src/gz reboot_routing http://mirrors.ustc.edu.cn/lede/releases/17.01.3/packages/mips_24kc/routing
src/gz reboot_telephony http://mirrors.ustc.edu.cn/lede/releases/17.01.3/packages/mips_24kc/telephony
添加自定义的源 /etc/opkg/customfeeds.conf
安装shadowsocks并能工作
安装包
opkg update
opkg install iptables-mod-nat-extra iptables-mod-tproxy ipset
opkg install Shadowsocks-libev luci-app-shadowsocks
两点注意
-
注意,选择正确的版本:
[email protected]:/etc/init.d# opkg list | grep shadowsocks
luci-app-shadowsocks - 1.8.1-1 - LuCI Support for shadowsocks-libev.
shadowsocks-libev-server - 3.1.0-1 - Shadowsocks-libev is a lightweight secured socks5 proxy for embedded devices and low end boxes.
luci-app-shadowsocks-without-ipset - 1.8.1-1 - LuCI Support for shadowsocks-libev.
shadowsocks-libev - 3.1.0-1 - Shadowsocks-libev is a lightweight secured socks5 proxy for embedded devices and low end boxes.
-
注意,此时可能会无法联入互联网,可以先关闭shawdowsocks服务(最好在界面里配置)
[email protected]:/etc/opkg# uci changes
-shadowsocks.cfg043a58.main_server
shadowsocks.cfg043a58.main_server+='nil'
-shadowsocks.cfg0615fe.server
shadowsocks.cfg0615fe.server+='nil'
-shadowsocks.cfg08b3be.server
shadowsocks.cfg08b3be.server+='nil'
配置ss: /etc/config/shadowsocks
这一步可以在ui界面的service–>shadowsocks里配置,对应的文本内容如下
config general
option startup_delay '0'
config transparent_proxy
option mtu '1492'
list main_server 'cfg0a4a8f'
option udp_relay_server 'cfg0a4a8f'
option local_port '1080'
config socks5_proxy
option mtu '1492'
list server 'cfg0a4a8f'
option local_port '1081'
config port_forward
option local_port '5353'
option destination '8.8.8.8:53'
option mtu '1492'
list server 'cfg0a4a8f'
config servers
option fast_open '0'
option timeout '60'
option encrypt_method 'rc4-md5'
option alias 'bwh'
option server '我是开了ss服务的vps的ip'
option server_port '443'
option password '我是ss服务密码'
config access_control
option self_proxy '1'
option wan_bp_list '/etc/ignore.list'
option lan_target 'SS_SPEC_WAN_AC'
配置 /etc/ignore.list
这里的有两行,是设定一个不需要转发的ip列表,参考
shadowsocks.cfg0c4417.wan_bp_list='/etc/ignore.list'
shadowsocks.cfg0c4417.lan_target='SS_SPEC_WAN_AC'
参考文献里生产这个列表的核心代码是:
wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | \
awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > \
/tmp/ignore.list
mv /tmp/ignore.list /etc/
启动ss服务
配置好后,ss就应该工作正常了.
配置自动更新
参考文献里的办法是建立自动更新脚本/root/update_ignore_list, 并用cron来定时调用
注: 并不建议频繁更新此列表
新建一个文件 /root/update_ignore_list 写入如下内容:
#!/bin/sh
set -e -o pipefail
wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | \
awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > \
/tmp/ignore.list
mv /tmp/ignore.list /etc/
if pidof ss-redir>/dev/null; then
/etc/init.d/shadowsocks rules
fi
使用 chmod +x /root/update_ignore_list 添加可执行权限
打开路由器管理页面 系统 - 计划任务 填写如下内容(每周日 04:30 执行):
30 4 * * 0 /root/update_ignore_list>/dev/null 2>&1
更新安装的软件
opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade
原理
路由和桥接
VLAN
dnsmasq
安装dnsmasq
opkg remove dnsmasq && opkg install dnsmasq-full
dnsmasq配置
cache-size=65536 #设置缓存大小
log-queries #记录DNS查询事件,在openwrt上可以通过logread查看日志,便于观察工作状态
neg-ttl=3600 #如果上流DNS服务器没有返回TTL,则用这个代替
log-async #如果写日志时被阻塞,开启这个选项后可以保证dnsmasq的其它功能正常工作
server=114.114.114.114 #添加114.114.114.114作为备选上流DNS服务器
server=119.29.29.29 #添加DNSpod作为备选服务器
all-servers #向所有上流服务器发送查询,先返回的结果被采用。
dnsmasq 格式
* 使用不受污染的DNS解析该域名,可以将此IP改为自己使用的DNS服务器
server=/google.com/127.0.0.1#5353
* 将解析出来的IP保存到名为gfwlist的ipset表中
ipset=/google.com/gfwlist
配置dnsmasq表
可以设置两张表,一张白表,一张黑表。
gfwlist的制作
配置路由
-
创建名为gfwlist,格式为iphash的集合 ipset -N gfwlist iphash
-
匹配gfwlist中ip的nat流量均被转发到shadowsocks端口 iptables -t nat -A PREROUTING -p tcp -m set –match-set gfwlist dst -j REDIRECT –to-port 1080
-
匹配gfwlist中ip的本机流量均被转发到shadowsocks端口 iptables -t nat -A OUTPUT -p tcp -m set –match-set gfwlist dst -j REDIRECT –to-port 1080
ss服务脚本: /etc/init.d/Shadowsocks
理解下
#!/bin/sh /etc/rc.common
START=95
STOP=15
SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1
SERVICE_PID_FILE=/var/run/shadowsocks.pid
TUNNEL_PID_FILE=/var/run/ss-tunnel.pid
CONFIG=/etc/shadowsocks-libev/config.json
DNS=8.8.8.8:53
TUNNEL_PORT=5353
start() {
# Proxy Mode
service_start /usr/bin/ss-redir -c $CONFIG -b 0.0.0.0 -f $SERVICE_PID_FILE
# Tunnel
service_start /usr/bin/ss-tunnel -c $CONFIG -b 0.0.0.0 -u -l $TUNNEL_PORT -L $DNS -f $TUNNEL_PID_FILE
}
stop() {
# Proxy Mode
service_stop /usr/bin/ss-redir
# Tunnel
service_stop /usr/bin/ss-tunnel
}
最新版本的ss中的ss-rule的作用
ss-rule的输入参数是ignore.list,他的作用就是建立iptable的rule。 用ipset list查看一下,大致就明白了。所以可以省去手工做这个事情了。
Name: ss_spec_src_ac
Type: hash:mac
Revision: 0
Header: hashsize 64 maxelem 65536
Size in memory: 64
References: 2
Members:
Name: ss_spec_src_bp
Type: hash:mac
Revision: 0
Header: hashsize 64 maxelem 65536
Size in memory: 64
References: 2
Members:
Name: ss_spec_src_fw
Type: hash:mac
Revision: 0
Header: hashsize 64 maxelem 65536
Size in memory: 64
References: 2
Members:
Name: ss_spec_dst_sp
Type: hash:net
Revision: 6
Header: family inet hashsize 64 maxelem 65536
Size in memory: 1216
References: 3
Members:
198.51.100.0/24
198.18.0.0/15
224.0.0.0/4
100.64.0.0/10
192.0.0.0/24
0.0.0.0/8
172.16.0.0/12
127.0.0.0/8
192.88.99.0/24
192.168.0.0/16
240.0.0.0/4
192.0.2.0/24
192.175.48.0/24
192.31.196.0/24
255.255.255.255
10.0.0.0/8
192.52.193.0/24
Name: ss_spec_dst_bp
Type: hash:net
Revision: 6
Header: family inet hashsize 2048 maxelem 65536
Size in memory: 136184
References: 2
Members:
103.34.72.0/22
103.46.116.0/22
45.122.92.0/22
103.45.56.0/22
163.53.188.0/22
60.204.0.0/16
202.14.127.0/24
202.38.2.0/23
202.116.96.0/19
参考
参考项目