【路由器】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 許可協議。轉載請注明出處!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM