banner
miaoer

miaoer

喵二の小博客 https://www.miaoer.net xLog 分站
telegram
bilibili
follow

武漢大学の寮キャンパスネットワーク OpenWrt インターネット認証

引言#

ご存知の通り、WHU のキャンパスネットワークは 3 台のデバイスに制限されており、夜の 7 時以降は直接速度制限が 20Mbps になります。

したがって、もし寮にネットワークポートがあり、そのポートが正常にインターネットに接続できる場合、OpenWrt を搭載したルーターを外部接続することで、体験が倍増します。それは、あなたの寮が 1 つのアカウントを共有してネット料金を分担できるだけでなく…… 古い校友の米家デバイスに接続でき、夜の 7 時以降に他の人が速度制限されているときに、自分だけがネットワークの世界を自由に楽しむことができるのです。本当に素晴らしいです!

現在、使用可能なネットポートがある寮は基本的に新しく建てられたもので、例えば信部 18 舎などがあります。他の寮については自分で探索する必要があります。まずはコンピュータでネットポートが使用できるかテストし、使用できる場合は、別のデバイスを用意してインストールすれば良いです。

インストール準備#

この方法を採用する場合、以下の準備を整える必要があります:

  1. OpenWrt システムを搭載したルーター / ソフトルーター
  2. 認証スクリプト
  3. SSH ソフトウェア(できれば sftp 付き)

この記事では、喵二酱がコンパイルした CatWrt を例にとり、システム面では基本的に要求はありません。

スクリプトは bash および curl に依存しています。もしあなたがオリジナルの OpenWrt を使用している場合は、コンポーネントがすでにインストールされているか自分で確認する必要があります。また、curl が事前にインストールされている場合は、再インストールしない方が問題を避けられます。

1

ネットワーク認証のスクリプトは Github でオープンソースとして公開されており、プロジェクトリンクはこちらです:https://github.com/7Ji/auto-whu-standard

ここでは、その中の auto-whu.sh を直接使用し、少し修正すれば使用できます。


スクリプトは以下の通りです:

#!/bin/bash
# Online check
check_online() {
    ping -w1 -W1 -c 1 baidu.com 1>/dev/null 2>&1 
    [[ $? = 0 ]] && echo "ネットワークはすでに接続されています" && return 0
    return 1
}
# Check online and immediately exit if is running by systemd
check_online && [[ $? = 0 ]] && [[ ! -z "$INVOCATION_ID" ]] && exit
echo "警告: すでにオンラインの状態でauto-whuを実行するのは危険です。ログインリクエストが多すぎるとアカウントが禁止される可能性があります。systemdとバンドルされたサービスおよびタイマーファイルを使用してauto-whuを管理してください。詳細はリポジトリを確認してください: https://github.com/7Ji/auto-whu-standard"
# Help message
help () {
    echo "使用法: $0 -u [username] -p [password] -n [network] -m [manual network] -u [url] -c [config file] -f -s -h"
    echo "      -u ユーザー名、13桁の数字である必要があります"
    echo "      -p パスワード、空でない任意の値"
    echo "      -n ネットワーク、0から3の単一桁の数字、0はCERNET、1は中国電信、2は中国聯通、3は中国移动"
    echo "      -m 手動で指定されたネットワーク名、-nオプションを置き換えます"
    echo "      -c 設定ファイル、設定ファイルのパス"
    echo "      -a eportal認証URL、完全に理解していない限り設定しないでください"
    echo "      -f フォアグラウンドモード、systemdチェックを無視します"
    echo "      -s ユーザー名、パスワード、ネットワークの整合性チェックをスキップします"
    echo "      -h このメッセージを表示します"
    echo "      *他のすべての引数は設定ファイルで提供された値を上書きします"
}
# Check arguments
[[ $# = 0 ]] && help && exit
while [[ $# -ge 1 ]]; do
    if [[ "$1" = '-u' ]]; then
        ARG_USERNAME="$2"
        shift
    elif [[ "$1" = '-p' ]]; then
        ARG_PASSWORD="$2"
        shift
    elif [[ "$1" = '-n' ]]; then 
        ARG_NETWORK="$2"
        shift
    elif [[ "$1" = '-m' ]]; then
        ARG_NETWORK_MANUAL="$2"
        shift
    elif [[ "$1" = '-a' ]]; then
        ARG_URL="$2"
        shift
    elif [[ "$1" = '-c' ]]; then
        ARG_CONFIG="$2"
        shift
    elif [[ "$1" = '-f' ]]; then
        ARG_IGNORE_SYSTEMD='1'
    elif [[ "$1" = '-s' ]]; then
        ARG_IGNORE_SANITY='1'
    elif [[ "$1" = '-h' ]]; then
        help && exit
    fi
    shift
done    
# Check and read configuration file if neccessary
if [[ ! -z "$ARG_CONFIG" ]]; then
    [[ ! -f "$ARG_CONFIG" ]] && echo "ERROR: 提供された設定ファイル '$ARG_CONFIG' は存在しません。"
    [[ ! -r "$ARG_CONFIG" ]] && echo "ERROR: 設定ファイル '$ARG_CONFIG' を読み取ることができません。権限を確認してください"
    source "$ARG_CONFIG"
fi
[[ ! -z "$ARG_USERNAME" ]] && USERNAME=$ARG_USERNAME
[[ ! -z "$ARG_PASSWORD" ]] && PASSWORD=$ARG_PASSWORD
[[ ! -z "$ARG_NETWORK" ]] && NETWORK=$ARG_NETWORK
[[ ! -z "$ARG_NETWORK_MANUAL" ]] && NETWORK_MANUAL=$ARG_NETWORK_MANUAL
[[ ! -z "$ARG_URL" ]] && URL=$ARG_URL
[[ ! -z "$ARG_IGNORE_SYSTEMD" ]] && IGNORE_SYSTEMD='1'
[[ ! -z "$ARG_IGNORE_SANITY" ]] && IGNORE_SANITY='1'
# Default value downgrading
[[ -z "$NETWORK" && -z "$NETWORK_MANUAL" ]] && NETWORK='0' && echo "ネットワーク番号も手動ネットワーク名も設定されていません。デフォルトのネットワークを0(CERNET)に設定します"
[[ -z "$URL" ]] && URL='http://172.19.1.9:8080/eportal/InterFace.do?method=login' && echo "デフォルトのeportial認証URL 'http://172.19.1.9:8080/eportal/InterFace.do?method=login' を使用しています"
# Check systemd
if [[ -z "$INVOCATION_ID" && "$IGNORE_SYSTEMD" != 1 ]]; then
    echo "このスクリプトを手動または非systemd環境で実行しています。このスクリプトをsystemdで管理する方が良いです。"
    echo "このスクリプトを正しく使用する方法については、githubリポジトリを確認してください: https://github.com/7Ji/auto-whu-standard"
    echo "設定ファイルでIGNORE_SYSTEMD='1'を設定するか、-f引数を使用してこのチェックを無視できます"
fi
# Check intergrity or sanity. return code 1 for insanity.
if [[ "$IGNORE_SANITY" != 1 ]]; then
    echo "ユーザー名、パスワード、ネットワークの整合性チェックを開始します。設定ファイルでIGNORE_SANITY='1'を設定するか、-n引数を使用してこのチェックを無視できます。"
    [[ ! "$USERNAME" =~ ^[0-9]{13}$ ]] && echo "ERROR: 提供されたユーザー名 '$USERNAME' は13桁の数字ではありません" && exit 1
    [[ -z "$PASSWORD" ]] && echo "ERROR: 空のパスワードを指定しました" && exit 1
    [[ ! "$NETWORK" =~ ^[0-3]$ && -z "$NETWORK_MANUAL" ]] && echo "ERROR: 指定されたネットワーク番号はサポートされていません。0-3のみがサポートされています。0はCERNET(デフォルト)、1は中国電信、2は中国聯通、3は中国移动です" && exit 1
    echo "整合性チェックに合格しました。"
fi
# Network number conversion
if [[ -z "$NETWORK_MANUAL" ]]; then
    if [[ "$NETWORK" = 0 ]]; then
        NETWORK_STRING=Internet
    elif [[ "$NETWORK" = 1 ]]; then
        NETWORK_STRING=dianxin
    elif [[ "$NETWORK" = 2 ]]; then
        NETWORK_STRING=liantong
    else   
        NETWORK_STRING=yidong
    fi
else
    NETWORK_STRING=$NETWORK_MANUAL
fi
# Authorization
echo "認証を試みています..."
curl -d "userId=$USERNAME&password=$PASSWORD&service=$NETWORK_STRING&queryString=`curl baidu.com | grep -oP "(?<=\?).*(?=\')" | sed 's/&/%2526/g' | sed 's/=/%253D/g'`&operatorPwd=&operatorUserId=&validcode=&passwordEncrypt=false" $URL 1>/dev/null 2>&1 
check_online && [[ $? = 0 ]] && exit
echo "認証に失敗しました。アカウント情報、クレジット、ネットワーク接続を確認する必要があります"

食用方法#

新しいスクリプトを作成し、自分で名前を付けることができます。ここでは統一してauto-whu.shという名前を使用し、スクリプトの内容をコピーします。

sftp ツールを使用してこのスクリプトを Catwrt の/usr/sbin/ディレクトリにアップロードし、次のコマンドを使用して

chmod 777 /usr/sbin/auto-whu.sh

スクリプトに実行権限を付与します。

ここでは、Termius などの sftp ファイル転送機能を持つ SSH クライアントを使用できます。もちろん、好みに応じて vi、vim、nano などで別のエディタにコピーしても構いません。

2

テストコマンド#

コマンドラインで直接実行して

/usr/sbin/auto-whu.sh -u your_student_account -p your_password -n 0 -f

認証を行います。

コマンドを実行した後、デバイスが正常にオンラインになると、次のように出力されます:

image-20241221140333731

root@CatWrt:~# /usr/sbin/auto-whu.sh -u your_student_account -p your_password -n 0 -f
警告: すでにオンラインの状態でauto-whuを実行するのは危険です。ログインリクエストが多すぎるとアカウントが禁止される可能性があります。systemdとバンドルされたサービスおよびタイマーファイルを使用してauto-whuを管理してください。詳細はリポジトリを確認してください: https://github.com/7Ji/auto-whu-standard
デフォルトのeportial認証URL 'http://172.19.1.9:8080/eportal/InterFace.do?method=login' を使用しています
ユーザー名、パスワード、ネットワークの整合性チェックを開始します。設定ファイルでIGNORE_SANITY='1'を設定するか、-n引数を使用してこのチェックを無視できます。
整合性チェックに合格しました。
認証を試みています...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   521  100   521    0     0   130k      0 --:--:-- --:--:-- --:--:--  254k
認証に失敗しました。アカウント情報、クレジット、ネットワーク接続を確認する必要があります

デバイスがすでにオンラインの場合、再認証すると次のように出力されます:

image-20241221140257011

root@CatWrt:~# /usr/sbin/auto-whu.sh -u your_student_account -p your_password -n 0 -f
ネットワークはすでに接続されています
警告: すでにオンラインの状態でauto-whuを実行するのは危険です。ログインリクエストが多すぎるとアカウントが禁止される可能性があります。systemdとバンドルされたサービスおよびタイマーファイルを使用してauto-whuを管理してください。詳細はリポジトリを確認してください: https://github.com/7Ji/auto-whu-standard
デフォルトのeportial認証URL 'http://172.19.1.9:8080/eportal/InterFace.do?method=login' を使用しています
ユーザー名、パスワード、ネットワークの整合性チェックを開始します。設定ファイルでIGNORE_SANITY='1'を設定するか、-n引数を使用してこのチェックを無視できます。
整合性チェックに合格しました。
認証を試みています...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (52) サーバーからの空の応答
ネットワークはすでに接続されています

この方法では、デバイスが再起動した後、自動的に認証が解除され、キャンパスネットワークアカウントのデバイス数を占有します。無感認証のスイッチはこの状況には影響しません。したがって、再起動するたびに、以前のデバイスを蹴り出し、デバイスのバックエンドに入ってコマンドを実行する必要があります。

自動起動の追加#

テストが完了し、問題がないことを確認した後、自動起動タスクを追加します。これにより、再起動するたびに以前のデバイスを蹴り出すだけで、ルーターが自動的に認証を行います。操作方法は以下の通りです:

システム - 起動項目を開きます。

image-20241221135800402

一番下までスクロールし、exit0の前に行を追加します /usr/sbin/auto-whu.sh -u your_student_account -p your_password -n 0 -f

image-20241221135905771

これで、スクリプトコマンドがデバイスの起動とともに実行されます。

まとめ#

上記の操作を経て、WHU の寮で快適にキャンパスネットワークを使用できるようになります。もちろん、できれば 1 つのアカウントが望ましいです。

image

スクリプトパラメータ - 付録#

-u [username] ログインユーザー名を指定します。13 桁の数字である必要があります。

-p [password] パスワードを指定します。空のフィールドであってはなりません。

-n [network] ログインネットワークタイプを指定します。0-3 の整数で、0は教育ネットワーク(デフォルト)、1は電信、2は聯通、3は移動です。

-m [network_manual] 手動でネットワーク名を指定します。-nパラメータを上書きします。例えば、教育ネットワークはここで-m Internetとなります。後にネットワーク状況が変わらない限り、または auto-whu を非武大キャンパスネットワーク環境で使用する予定がない限り、このパラメータを使用すべきではありません。

-c [config file] 設定ファイルのパスを指定します。ユーザー名、パスワード、ネットワークタイプ、手動ネットワーク名、認証 URL、systemd のチェック、各変数の合法性などが読み取られます。これらのオプションは、コマンドラインで提供されたパラメータによって上書きされます(例えば、-uは設定ファイルのUSERNAME項目を上書きします)。

-a [authorization URL] eportal の認証 URL です。非武大キャンパスネットワーク環境のユーザーにのみこの項目を指定することをお勧めします。自分でパケットキャプチャを行い、武大キャンパスネットワークの認証方法が変更された場合は、このリポジトリをフォークして修正し、プルリクエストを提出してください。

-f フォアグラウンドモードを有効にし、systemd チェックを無効にします。

-s パラメータの合法性チェックをスキップします。13 桁の数字のユーザー名チェック、空でないパスワードチェック、0-3 の整数ネットワーク番号チェックを無効にします。

-h ヘルプテキストを表示します。


例えば、ユーザー名が 2024300000000 で、パスワードが 123456 のユーザーは、

/usr/sbin/auto-whu.sh -u 2024300000000 -p 123456 -n 0 -f

電信ネットワークにログインしたい場合、次のコマンドを使用する必要があります(-fは省略可能です):

/usr/sbin/auto-whu.sh -u 2017300000000 -p 123456 -m dianxin -f

参考#

この記事は Mix Space によって xLog に同期更新されました。元のリンクは https://www.miaoer.net/posts/network/whu-openwrt-authentication

Footnotes#

  1. https://www.miaoer.net/posts/network/catwrt

  2. https://www.miaoer.net/posts/blog/ssh-connection-to-openwrt

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。