OrangeGardenRoom

技術系のメモ

Yamahaルータのちょこちょこスクリプト

リモートワーク需要で、YamahaのルータのL2TP設定することが多くなってきたんですが……。
基本ユーザ数が多すぎてコピペとトンネル数字入替がめんどくさいのと、手動で”no “をCtrl+Vするのがだるくなってきたのでスクリプト作りました。

Yamahaルータいろいろスクリプト

 

JavaScriptでざーっと作ってあるので、HTMLコピペしてあげればデスクトップとかでも動きます。
パスに文字入れたいとかあればー。
自分で使うついでに置いておくので使う人いたらどうぞー。

 

Windowsのコマンドプロンプトで動くPerlも置いておきます。

#!/usr/bin/perl


use strict;
use warnings;
use Encode;
use utf8;

binmode STDOUT, ":encoding(cp932)";


# L2TPユーザたくさんつくるPerl


# 文字
my @moji = qw/a b c d e f g h i j k m n p q r s t u v w x y z A B C D E F G H J K L M N P Q R S T U V W X Y Z 2 3 4 5 6 7 8 9/;

# 前情報入力
my $minline = 1;
my $maxline = 10;
my $ident = "";
my $psk = "";
my $kpav = 0;
my $zfill = 0;
my $uc = 0;
my $pc = 0;
my $output = "";


print "開始トンネル番号(default:1):";
$minline = <STDIN>;

print "終了トンネル番号(default:10):";
$maxline = <STDIN>;

print "ユーザ識別子(default:vpnuser):";
$ident = <STDIN>;

print "事前共有鍵 ※8文字以上(default:sharedkey):";
$psk = <STDIN>;

print "キープアライブ利用有無 1=有,0=無(default:1):";
$kpav = <STDIN>;

print "ユーザ序数0埋桁数(default:2):";
$zfill = <STDIN>;

print "ユーザ数(default:10):";
$uc = <STDIN>;

print "パスワード桁数(default:8):";
$pc = <STDIN>;

print "出力ファイル名(default:l2tp.txt):";
$output = <STDIN>;



# 改行削除
chomp($minline);
chomp($maxline);
chomp($ident);
chomp($psk);
chomp($kpav);
chomp($zfill);
chomp($uc);
chomp($pc);
chomp($output);



# 初期値入力
if ($minline eq "") { $minline = 1; }
if ($maxline eq "") { $maxline = 10; }
if ($ident eq "") { $ident = "vpnuser"; }
if ($psk eq "") { $psk = "sharedkey"; }
if ($kpav eq "") { $kpav = 1; }
if ($zfill eq "") { $zfill = 2; }
if ($uc eq "") { $uc = 10; }
if ($pc eq "") { $pc = 8; }
if ($output eq "") { $output = "l2tp.txt"; }

# 出力ファイルの末尾が.txtじゃない場合.txtを付ける
if ($output !~ /^.+\.txt$/) { $output .= ".txt"; }


# エラー
my @errors;
if ($minline !~ /^\d+$/) { push(@errors, "開始トンエル番号が数値でないです。"); }
if ($maxline !~ /^\d+$/) { push(@errors, "終了トンエル番号が数値でないです。"); }
if ($zfill !~ /^\d+$/) { push(@errors, "ユーザ序数桁数が数値でないです。"); }
if ($uc !~ /^\d+$/) { push(@errors, "ユーザ数が数値でないです。"); }
if ($pc !~ /^\d+$/) { push(@errors, "パスワード桁数が数値でないです。"); }
if (length($psk) < 8) { push(@errors, "事前共有鍵は8文字以上です。"); }
if ($kpav != 1 && $kpav != 0) { push(@errors, "キープアライブ有無は1か0です。"); }
if ($maxline < $minline) { push(@errors, "開始トンネル番号が、終了トンネル番号より大きいです。"); }


# エラーがあれば終了
if (scalar(@errors) > 0)
{
	printf("%s", join("\n", @errors));
	exit(1);
}


# 置き換え処理
if ($kpav == 0) { $kpav = "off"; }
else { $kpav = "on"; }


# 出力
open my $file, ">:encoding(cp932)", $output;
flock($file, 2);
truncate($file, 0);
seek($file, 0, 0);



# 認証
printf $file "pp select anonymous\n";
for (my $i = 1; $i <= $uc; $i++)
{
	my $rand = "";
	for (my $j = 0; $j < $pc; $j++) { $rand .= $moji[int(rand(@moji))]; }
	
	printf $file "pp auth username %s%0".$zfill."d %s\n", $ident, $i, $rand;
}

print $file "\n";

# トンネル
for (my $i = $minline; $i <= $maxline; $i++)
{
	printf $file "tunnel select %d\n", $i;
	printf $file " tunnel encapsulation l2tp\n";
	printf $file " ipsec tunnel %d\n", $i;
	printf $file "  ipsec sa policy %d %d esp aes-cbc sha-hmac\n", $i, $i;
	printf $file "  ipsec ike keepalive log %d off\n", $i;
	printf $file "  ipsec ike keepalive use %d %s\n", $i, $kpav;
	printf $file "  ipsec ike nat-traversal %d on\n", $i;
	printf $file "  ipsec ike pre-shared-key %d text %s\n", $i, $psk;
	printf $file "  ipsec ike remote address %d any\n", $i;
	printf $file " l2tp tunnel auth off\n";
	printf $file " l2tp tunnel disconnect time off\n";
	printf $file " l2tp keepalive use on\n";
	printf $file " ip tunnel tcp mss limit auto\n";
	printf $file " tunnel enable %d\n", $i;
}

print $file "\n";


# トランスポート
for (my $i = $minline; $i <= $maxline; $i++)
{
	printf $file "ipsec transport %d %d udp 1701\n", $i, $i;
}

close($file);

1;


 

 

てきとーに雑につくったやつなんで中身についてはのーこめんとで……。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です