OpenWrt

OpenWrt

Tips & Solutions

必须安装的软件包

opkg update
opkg install coreutils-nohup curl

  • coreutils-nohup: nohup

获取 WAN IP / 默认网关 IP 等

# 获取 WAN IP(OpenWRT 独有)
ubus call network.interface.wan status | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
# 获取某个网卡(iface) IP (Linux 通用)。如果是 PPPoE 拨号方式上网,那么 pppoe-wan 网卡 IP 就是 WAN IP
ip addr | grep pppoe-wan | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1
# 获取默认网关 IP (Linux 通用)
ip route show 0/0 | head -n1 | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

Use DDNS for PPPoE WAN

使用 DDNS 以远程管理 OpenWRT 路由器。

dynu.com

# vi /lib/netifd/ppp-up
IP=`ubus call network.interface.wan status | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}';`
curl -k --user username:password "https://api.dynu.com/nic/update?hostname=user.dynu.com&myip=${IP}"
# myip 参数可省,默认为此 http 请求的 src IP。
# username 和 password 也可以通过 dynu API URL 里的 query parameters 传递。
  • 可以使用自己的某个二级域名 CNAME 到 DDNS 服务商提供的域名上去。
  • 要想远程连接路由器,还必须修改 OpenWrt 的 iptables 防火墙配置以允许来自 WAN 的 INPUT 流量。

PPPoE ip-up-script

推荐方法:使用 Hotplug 脚本。当某个网卡状态发生变化(up/down)时,OpenWrt 会用 Shell 执行 /etc/hotplug.d/iface 里所有脚本。

/etc/hotplug.d/iface 目录里的所有脚本文件名规范是"优先级-名称",如 "01-mvifcreate","95-ddns"。优先级数字较小的先执行。被执行的脚本会通过环境变量接收到以下参数:

  • $INTERFACE: 状态发生变化的网卡名
  • $ACTION: 网卡事件名,枚举: ifup, ifdown

脚本示例:

#!/bin/sh
[ "$ACTION" == ifup ] && echo Up

95-ddns

#!/bin/sh
case "$ACTION" in
ifup)
/etc/init.d/ddns enabled && /usr/lib/ddns/dynamic_dns_updater.sh -n "$INTERFACE" -- start
;;
ifdown)
/usr/lib/ddns/dynamic_dns_updater.sh -n "$INTERFACE" -- stop
;;
esac

不推荐方法:

/lib/netifd/ppp-up

这是 PPPoE 拨号成功时执行的脚本。在这里可以做:

  • 重新连接 VPN
  • 调用 DDNS 的 (http) api 以更新路由器 WAN IP。

PPPoE 重新连接

/etc/init.d/network restart

允许指定 IP 从 WAN 访问路由器 ssh

首先在路由器管理界面 -> 系统 -> 管理 -> Dropbear 实例,将 Dropbear(ssh server)监听接口改为 "未指定" 并 "保存&应用" 即可。然后设置防火墙规则,有两种方式:

方式1: iptables

# 每个白名单 IP 添加一条 iptables 规则
iptables -I INPUT 1 -s 1.2.3.4 -j ACCEPT

方式2: iptables + ipset

ipset create trust hash:ip
ipset add trust 1.2.3.4
# add more ip

iptables -I INPUT 1 -m set --match-set trust src -j ACCEPT

允许从 WAN 连接路由器 Web UI

中国国内的宽带一般封了 80 等端口,所以如果需要从公网访问路由器 Web 管理界面时,除非更改默认的 80 端口,否则需要额外映射一个端口到 80:

# 亲测傻逼电信把 8080 也封了。下面示例用 8081 端口。
iptables -t nat -I PREROUTING 1 -i pppoe-wan -p tcp --dport 8081 -j REDIRECT --to-port 80

然后可以使用 http://IP_or_DDNS_DOMAIN:PORT/ 访问路由器 Web UI。

备注:需要配合上面的“允许指定 IP 从 WAN 访问路由器 ssh”使用。

KMS

opkg install vlmcsd luci-app-vlmcsd

# 之后刷新web界面,在网络中找到vlmcsd设置
# 勾选自动激活
# 系统就会在/etc/dnsmasq.conf 添加当前路由器主机名的SRV记录
# 这样就不需要任何设置就可以自动激活系统了

IPv6

2018-05 测试电信宽带能够 pppoe 拨号获取到 WAN IPV6,分配到的是一个 240e::/64 地址块。但是某些版本 OpenWRT 固件配置有问题,虽然能获取到 IPV6 地址,但却无法通过 IPV6 上网,表现为 ping IPV6 地址时直接失败(但通过 VPS 能 ping 通路由器的的 IPV6 地址)。

修复:添加默认 ipv6 路由:

# pppoe-wan 是 WAN 接口名
ip -6 route add from :: dev pppoe-wan

然后在 Web UI 里:

接口配置(Network - Interface):清空 ULA-prefix。

接口配置 - LAN - DHCP 服务器 - IPV6 设置里,将 "RA"(路由通告服务), "DHCPV6", "NDP" 这三个选项均设为 "Relay" (中继模式)即可。


Last update: 2018-06-12 03:55:22 UTC