【路由器】OpenWrt 配置使用

因国家法律规定,部分内容已删除,完整内容请查看文章末尾链接

Web 界面

一般 OpenWrt 安装好之后会已经默启用了 Web 管理界面(LuCI),默认地址是 192.168.1.1,默认账号是 root,无密码,直接点击登录即可进入

汉化

默认界面是英文的,可以在 系统-软件 中搜索中文包安装进行汉化

  • 点击 UPDATE LIST... 耐心等待软件包的更新
  • 然后在 Filter: 下的输入框中输入 luci-i18n-base-zh-cn,在筛选出来的结果中点击 INSTALL...,安装勾上 Overwrite files from other package(s),然后点击 INSTALL,耐心等待安装完成之后刷新网页(Ctrl+F5)可以看见大部分界面已经汉化了
  • 同理安装 luci-i18n-opkg-zh-cn 包用于 系统-软件 界面的汉化
  • 同理安装 luci-i18n-firewall-zh-cn 包用于 网络-防火墙 界面的汉化

root 密码

进入管理界面后进入 系统-管理-密码 界面修改路由器密码,同时也是系统的 root 账号的密码

ssh

然后在 系统-管理-ssh 可以配置 ssh 登录,参考配置如下

  • 接口:不指定 → 内网以及外网都可以 ssh 登录
  • 端口:22 → ssh 默认端口,不做修改
  • 密码验证:不勾选 → 推荐使用 ssh 登录
  • 允许 root 用户凭密码登录:不勾选 → 推荐使用 ssh 登录
  • 网关端口:根据需要勾选

按照上面配置完成后将只能通过 ssh 密钥进行登录,所以还得在 系统-管理-ssh密钥 添加设备的公钥

升级 LuCI

ssh 登入路由器后执行以下命令:

# 更新软件源
opkg update
# luci-compat 包有时可以帮助解决一些兼容性问题,推荐一同安装
opkg install luci luci-base luci-compat

美化

原始的 bootstrap 主题个人不太喜欢,在空间足够的情况下我个人额外安装了 material,主题的切换在 系统-系统-语言和界面

opkg update
opkg install luci-theme-material

锐捷认证

很多学校校园网通常采用锐捷认证,并且限制了用户账号的登陆数量,但是我们可以通过在路由器上进行锐捷认证来接入校园网,之后连接路由器的所有设备都会直接接入校园网而不需要认证了

MentoHUST

MentoHUST 是华中科技大学的 HustMoon 最初在校内 BBS 白云黄鹤上发布的一款可以在 Linux 系统上进行锐捷认证的软件。不过原始项目已经归档,不在开发,GitHub 上有加入 v4 支持的新项目

而在 OpenWrt 可以通过 Github 上的两个项目手动编译 .ipk 文件,然后 opkg install xxx.ipk 进行安装即可

手动编译 ipk 文件的过程可以参考这里

MiniEAP

MiniEAP 是一个实现了标准 EAP-MD5-Challenge 算法的 EAP 客户端,支持通过插件来修改标准数据包以通过特殊服务端的认证。同时含有支持锐捷 v3 (v4) 算法的插件,可以用来进行锐捷认证

而在 OpenWrt 可以通过 Github 上的两个项目手动编译 .ipk 文件,然后 opkg install xxx.ipk 进行安装即可

补充:如果想要掉线自动重新认证,在配置文件中不要配置 no-auto-reauth,参考该 minieap@issue#43

防火墙

防火墙规则的详细配置可以参考 官方的介绍 以及部分 例子

开放端口

以开放 80 端口,用于外网直接访问 Web 界面为例:

  1. 首先要在 网络-防火墙-通信规则 点击新增,进行如下配置

    Allow-LuCI-WAN

    • 名称:可以随意设置
    • 协议:根据需要进行选择即可
    • 源区域:选择 WAN 表示是从外网进行访问
    • 源地址以及源端口:主要用于限制来访的设备,可以根据需要进行配置
    • 目标区域:选择 设备 代表这是一个入站的规则
    • 目标地址:因为是访问设备,此时不需要配置
    • 目标端口:Web 的默认端口是 80
    • 操作:开放端口,当然是选择接受
  2. 然后在 状态-防火墙 根据需要对 IPv4、IPv6 防火墙进行重启即可

如果这时外网还是不能访问 LuCI 的 Web 界面,可以尝试路由器重启,确认路由器的 IP 是否能够 ping 通,以及确认 80 端口有没有被运营商封禁

端口转发

以将 Windows 的远程连接的端口 3389 为例:

  1. 首先要在 网络-防火墙-端口转发 点击新增,进行如下配置

    Win-Remote

    • 名称:可以随意设置
    • 协议:根据需要进行选择即可
    • 源区域:选择 WAN 表示是从外网进行访问
    • 外部端口:这里配置成 13389
    • 目标区域:选择 LAN
    • 内部 IP 地址:配置成内网需要远程连接的主机
    • 内部端口:远程连接的默认端口是 3389
  2. 然后在 状态-防火墙 根据需要对 IPv4、IPv6 防火墙进行重启即可

后续就可以通过访问路由器 WAN_IP:13389 来远程连接内网的 Windows 主机了

IPv6

在校园网环境下发现 WAN 口默认能自动获取到 IPv6 地址(但是 /128 的地址),并且在路由器上测试也能正常访问 IPv6 网站,但是局域网内的设备不能正常访问 IPv6 网站,于是选择 NAT6 的方式来解决

参考 官网的 NAT6 文档,需要在路由器内依次进行如下配置:

  1. 安装 kmod-ipt-nat6 包

    # Install packages
    opkg update
    opkg install kmod-ipt-nat6
    
  2. 配置 IPv6 ULA 前缀,使得内网设备默认使用 IPv6

    # Using IPv6 by default
    NET_ULA="$(uci get network.globals.ula_prefix)"
    uci set network.globals.ula_prefix="d${NET_ULA:1}"
    # 默认 network.lan.ip6assign 配置可能有误,需要根据 ula_prefix 重新配置
    IP6_ASSIGN="$(echo ${NET_ULA} | grep -E '(\d+)$' -o)"
    uci set network.lan.ip6assign="${IP6_ASSIGN}"
    uci commit network
    /etc/init.d/network restart
    
  3. 配置默认 IPv6 路由

    # Announcing default IPv6 route
    uci set dhcp.lan.ra_default="1"
    uci commit dhcp
    /etc/init.d/odhcpd restart
    
  4. 配置防火墙

    # Configure firewall
    uci set $(uci show firewall | sed -n -e "/\.name='wan'$/s//.masq6='1'/p" | sed -n -e "1p")
    uci set $(uci show firewall | sed -n -e "/\.name='Allow-ICMPv6-Forward'$/s//.enabled='0'/p" | sed -n -e "1p")
    uci commit firewall
    
    # Configure firewall
    cat << "EOF" > /etc/firewall.nat6
    # NAT6 + masquerading firewall script
    # https://github.com/akatrevorjay/openwrt-masq6
    # trevorj <github@trevor.joynson.io>
    #
    # You can configure in /etc/config/firewall per zone:
    # * IPv4 masquerading
    #     option masq 1
    # * IPv6 masquerading
    #     option masq6 1
    # * IPv6 privacy extensions
    #     option masq6_privacy 1
    
    set -e -o pipefail
    
    . /lib/functions.sh
    . /lib/functions/network.sh
    . /usr/share/libubox/jshn.sh
    
    log() {
        logger -t nat6 -s "${@}"
    }
    
    get_ula_prefix() {
        uci get network.globals.ula_prefix
    }
    
    validate_ula_prefix() {
        local ula_prefix="${1}"
        if [ $(echo "${ula_prefix}" | grep -c -E -e "^([0-9a-fA-F]{4}):([0-9a-fA-F]{0,4}):") -ne 1 ] ; then
            log "Fatal error: IPv6 ULA ula_prefix=\"${ula_prefix}\" seems invalid. Please verify that a ula_prefix is set and valid."
            return 1
        fi
    }
    
    ip6t() {
        ip6tables "${@}"
    }
    
    ip6t_add() {
        if ! ip6t -C "${@}" &> /dev/null; then
            ip6t -I "${@}"
        fi
    }
    
    nat6_init() {
        iptables-save -t nat \
        | sed -e "
            /\sMASQUERADE$/d
            /\s[DS]NAT\s/d
            /\s--match-set\s\S*/s//\06/
            /,BROADCAST\s/s// /" \
        | ip6tables-restore -T nat
    }
    
    masq6_network() {
        # ${config} contains the ID of the current section
        local network_name="${1}"
    
        local device
        network_get_device device "${network_name}" || return 0
    
        local done_net_dev
        for done_net_dev in ${DONE_NETWORK_DEVICES}; do
            if [ "${done_net_dev}" = "${device}" ]; then
                log "Already configured device=\"${device}\", so leaving as is."
                return 0
            fi
        done
    
        log "Found device=\"${device}\" for network_name=\"${network_name}\"."
    
        if [ "${zone_masq6_privacy}" -eq 1 ]; then
            log "Enabling IPv6 temporary addresses for device=\"${device}\"."
    
            log "Accepting router advertisements on ${device} even if forwarding is enabled (required for temporary addresses)"
            echo 2 > "/proc/sys/net/ipv6/conf/${device}/accept_ra" \
            || log "Error: Failed to change router advertisements accept policy on ${device} (required for temporary addresses)"
    
            log "Using temporary addresses for outgoing connections on interface ${device}"
            echo 2 > "/proc/sys/net/ipv6/conf/${device}/use_tempaddr" \
            || log "Error: Failed to enable temporary addresses for outgoing connections on interface ${device}"
        fi
    
        append DONE_NETWORK_DEVICES "${device}"
    }
    
    handle_zone() {
        # ${config} contains the ID of the current section
        local config="${1}"
    
        local zone_name
        config_get zone_name "${config}" name
    
        # Enable masquerading via NAT6
        local zone_masq6
        config_get_bool zone_masq6 "${config}" masq6 0
    
        log "Firewall config=\"${config}\" zone=\"${zone_name}\" zone_masq6=\"${zone_masq6}\"."
    
        if [ "${zone_masq6}" -eq 0 ]; then
            return 0
        fi
    
        # IPv6 privacy extensions: Use temporary addrs for outgoing connections?
        local zone_masq6_privacy
        config_get_bool zone_masq6_privacy "${config}" masq6_privacy 1
    
        log "Found firewall zone_name=\"${zone_name}\" with zone_masq6=\"${zone_masq6}\" zone_masq6_privacy=\"${zone_masq6_privacy}\"."
    
        log "Setting up masquerading nat6 for zone_name=\"${zone_name}\" with zone_masq6_privacy=\"${zone_masq6_privacy}\""
    
        local ula_prefix="$(get_ula_prefix)"
        validate_ula_prefix "${ula_prefix}" || return 1
    
        local postrouting_chain="zone_${zone_name}_postrouting"
        log "Ensuring ip6tables chain=\"${postrouting_chain}\" contains our MASQUERADE."
        ip6t_add "${postrouting_chain}" -t nat \
            -m comment --comment "!fw3" -j MASQUERADE
    
        local input_chain="zone_${zone_name}_input"
        log "Ensuring ip6tables chain=\"${input_chain}\" contains our permissive DNAT rule."
        ip6t_add "${input_chain}" -t filter -m conntrack --ctstate DNAT \
            -m comment --comment "!fw3: Accept port forwards" -j ACCEPT
    
        local forward_chain="zone_${zone_name}_forward"
        log "Ensuring ip6tables chain=\"${forward_chain}\" contains our permissive DNAT rule."
        ip6t_add "${forward_chain}" -t filter -m conntrack --ctstate DNAT \
            -m comment --comment "!fw3: Accept port forwards" -j ACCEPT
    
        local DONE_NETWORK_DEVICES=""
        config_list_foreach "${config}" network masq6_network
    
        log "Done setting up nat6 for zone=\"${zone_name}\" on devices: ${DONE_NETWORK_DEVICES}"
    }
    
    main() {
        nat6_init
        config_load firewall
        config_foreach handle_zone zone
    }
    
    main "${@}"
    EOF
    cat << "EOF" >> /etc/sysupgrade.conf
    /etc/firewall.nat6
    EOF
    

    经过此步骤后会生成一个 /etc/firewall.nat6 脚本,并且加入了 /etc/sysupgrade.conf,保证系统升级后也不会丢失该脚本

    # Configure firewall
    uci -q delete firewall.nat6
    uci set firewall.nat6="include"
    uci set firewall.nat6.path="/etc/firewall.nat6"
    uci set firewall.nat6.reload="1"
    uci commit firewall
    /etc/init.d/firewall restart
    
    # Configure firewall
    uci set firewall.@zone[1].masq6="1"
    uci set firewall.@zone[1].masq6_privacy="1"
    uci commit firewall
    /etc/init.d/firewall restart
    

USB

很多路由器有 USB 端口,通过插入 U 盘或者接入磁盘、SSD 等设备可以拓展存储空间,这样就可以安装更多的插件,或者搭建一个简单的 FTP、SMB 服务器用于共享数据

安装 USB 驱动

依次执行以下命令进行驱动基本包的安装

opkg update
opkg install kmod-usb-core
insmod usbcore
opkg install kmod-usb-storage

如果设备是 USB 2.0

opkg install kmod-usb2
insmod ehci-hcd

如果设备是 USB 3.0

opkg install kmod-usb3
insmod xhci-hcd

通常移动硬盘或者移动 SSD 还需要安装 UAS/UASP 支持

opkg install kmod-usb-storage-uas

然后热插拔存储设备,通常就能在 /dev 目录下看见 sda 设备了

自动挂载

  • 安装块设备工具包

    opkg install block-mount
    
  • 分区

    个人已经提前将存储设备划分了两个分区,一个分区较小(sda5)用于后续的 Extroot,剩余的空间(sda6)全用于存储个人数据

  • 创建文件系统

    推荐移动磁盘用 ext4 文件系统,而移动 SSD 推荐使用 f2fs 文件系统

    分区和创建文件系统可以参考 官网的指导

  • 配置挂载

    配置挂载可以通过直接在网页端的 系统-挂载点 进行手动配置,比较直观,如图所示:

    Mount-sda6

    • 已启用:勾选
    • UUID:推荐使用 UUID 来进行挂载
    • 挂载点:也就是挂载的位置,通常在 /mnt 目录下新建一个文件夹

Extroot

有时候安装太多包会导致本地空间不足,此时可以通过将包安装在 USB 设备上,也可以通过 Extroot 的方式将 USB 设备的空间直接配置成 overlay 分区,后者更为推荐

  1. 修改 fstab,将原本挂载的 overlay 设备挂载到新的目录 /rwm

    DEVICE="$(sed -n -e "/\s\/overlay\s.*$/s///p" /etc/mtab)"
    uci -q delete fstab.rwm
    uci set fstab.rwm="mount"
    uci set fstab.rwm.device="${DEVICE}"
    uci set fstab.rwm.target="/rwm"
    uci commit fstab
    
  2. 修改 fstab,配置 USB 设备挂载成 overlay 分区

    其中部分部分操作在上节已经执行过,可以略去

    # 查看分区信息
    # block info
    
    # 确定分区并制作文件系统
    DEVICE="/dev/sda5"
    # mkfs.ext4 ${DEVICE}
    
    eval $(block info ${DEVICE} | grep -o -e "UUID=\S*")
    uci -q delete fstab.overlay
    uci set fstab.overlay="mount"
    uci set fstab.overlay.uuid="${UUID}"
    uci set fstab.overlay.target="/overlay"
    uci commit fstab
    
  3. 将原本 overlay 分区数据复制到 USB 设备上,重启设备

    mkdir -p /tmp/cproot
    mount --bind /overlay /tmp/cproot
    mount ${DEVICE} /mnt
    tar -C /tmp/cproot -cvf - . | tar -C /mnt -xf -
    umount /tmp/cproot /mnt
    reboot
    

FTP

配置好 USB 后,就可以配置 FTP 来共享 USB 设备

  1. 首先安装 vsftpd 包

    opkg install vsftpd
    
  2. 修改配置文件 /etc/vsftpd.conf,这里给出个人的配置,可以参考

    background=YES
    listen=YES
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    local_umask=022
    check_shell=NO
    #dirmessage_enable=YES
    #ftpd_banner=Welcome to MINI FTP service.
    session_support=NO
    #syslog_enable=YES
    #userlist_enable=YES
    #userlist_deny=NO
    #userlist_file=/etc/vsftpd/vsftpd.users
    #xferlog_enable=YES
    #xferlog_file=/var/log/vsftpd.log
    #xferlog_std_format=YES
    ###
    ### TLS/SSL options
    ### example key generation: openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd_privkey.pem -out /etc
    #ssl_enable=YES
    #allow_anon_ssl=NO
    #force_local_data_ssl=NO
    #force_local_logins_ssl=NO
    #ssl_tlsv1=YES
    #ssl_sslv2=NO
    #ssl_sslv3=NO
    #rsa_cert_file=/etc/vsftpd/vsftpd_cert.pem
    #rsa_private_key_file=/etc/vsftpd/vsftpd_privkey.pem
    # 共享的目录位置
    local_root=/mnt/ext4
    pasv_enable=YES
    pasv_min_port=10090
    pasv_max_port=10100
    
  3. 然后参考之前的开放端口,打开 20、21、10090-10100 端口就可以在外网访问 FTP 服务器了

    Allow-FTP-WAN

  4. 之后重启 vsftpd 服务即可使用

    /etc/init.d/vsftpd restart
    

P.S. 连接 ftp 服务器的账号密码就是路由器的 root 账号密码

SMB

使用 Samba 来共享的设备可以在 Windows 的文件资源管理器中挂载,使用起来和本地磁盘一样(在局域网内)

  1. 安装 samba4-server 以及 LuCI 管理界面

    opkg install samba4-server
    opkg install luci-app-samba4 luci-i18n-samba4-zh-cn
    
  2. 在网页端的 服务-网络共享 中进行配置,个人配置如下,可以参考

    Samba

  3. 之后重启 samba4 服务即可使用

    /etc/init.d/samba4 restart
    

P.S. 连接 Samba 服务器的账号密码也是路由器的 root 账号密码

BT 下载

transmission 是一个轻量级跨平台的 BT 下载客户端

  1. 安装 transmission

    opkg install transmission-daemon
    opkg install transmission-cli
    opkg install transmission-web   # web 界面,可选
    opkg install transmission-remote
    opkg install luci-app-transmission luci-i18n-transmission-zh-cn
    
  2. 直接修改 /etc/config/transmission,或者在网页端的 服务-Transmission 进行配置,下面给出个人配置,可以参考

    Transmission

    config transmission
        option config_overwrite '1'
        option mem_percentage '50'
        option nice '10'
        option alt_speed_enabled 'false'
        option alt_speed_time_enabled 'false'
        option bind_address_ipv4 '0.0.0.0'
        option bind_address_ipv6 '::'
        option blocklist_enabled 'false'
        option cache_size_mb '2'
        option dht_enabled 'true'
        option download_queue_enabled 'true'
        option download_queue_size '4'
        option encryption '1'
        option idle_seeding_limit_enabled 'false'
        option lazy_bitfield_enabled 'true'
        option lpd_enabled 'false'
        option message_level '1'
        option peer_limit_global '240'
        option peer_limit_per_torrent '60'
        option peer_port '51413'
        option peer_port_random_on_start 'false'
        option peer_socket_tos 'default'
        option pex_enabled 'true'
        option port_forwarding_enabled 'true'
        option preallocation '1'
        option queue_stalled_enabled 'true'
        option queue_stalled_minutes '30'
        option ratio_limit '2.0000'
        option rename_partial_files 'true'
        option rpc_bind_address '0.0.0.0'
        option rpc_enabled 'true'
        option rpc_host_whitelist_enabled 'false'
        option rpc_port '9091'
        option rpc_url '/transmission/'
        option rpc_whitelist_enabled 'false'
        option scrape_paused_torrents_enabled 'true'
        option script_torrent_done_enabled 'false'
        option seed_queue_enabled 'false'
        option speed_limit_down_enabled 'false'
        option speed_limit_up_enabled 'false'
        option start_added_torrents 'true'
        option umask '18'
        option utp_enabled 'true'
        option scrape_paused_torrents 'true'
        option watch_dir_enabled 'false'
        option enabled '1'
        option user 'root'
        option group 'root'
        option upload_slots_per_torrent '10'
        option download_dir '/mnt/ext4/transmission'
        option incomplete_dir_enabled 'true'
        option incomplete_dir '/mnt/ext4/transmission/incomplete'
        option trash_original_torrent_files 'true'
        option rpc_authentication_required 'true'
        option rpc_username 'rpc_username'
        option rpc_password 'rpc_password'
        option ratio_limit_enabled 'true'
        option config_dir '/etc/transmission'
    
  3. 之后重启 transmission 服务即可使用

    /etc/init.d/transmission restart
    

连接的账号密码为自行配置的 RPC 连接的账号密码

默认的 Web 界面 比较简陋,并且不能配置 tracker,个人推荐使用
transgui
RPC 连接使用

如果需要远程访问,则需要将 rpc_port 配置的端口开放,具体流程参考 上文

参考资料

本文作者: ywang_wnlo
本文链接: https://ywang-wnlo.github.io/posts/51140c4a.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

posted @ 2022-04-26 18:06  ywang_wnlo  阅读(5002)  评论(0编辑  收藏  举报