Ruby文法基礎

画面出力

puts 改行、print 改行なし
gets 入力
p はputs 変数.inspectと同じ

変数

ローカル変数

注意、変数のスコープは上位のスコープを探さない。
ブロック、メソッド、クラス/モジュール定義の終わりまで。

class Hoge
   x = “bye”
  def initialize
    x = “hello”
    puts x
  end
end
h = Hoge.new #=> hello

インスタンス変数

class User
  def say
    puts @x
    @x = “b”
    puts @x
  end
  def self.say2
    puts @x
    @x = “a”
    puts @x
  end
end

User::say2
#=> 空白
#=> a
u = User.new
u.say
#=> 空白
#=> b

@を前置する
インスタンス生成時に作られない。値の代入時に実体が生成される。
クラス定義内で定義しない。
通常メソッド内で定義するがスコープはクラス内となる。
(ローカル変数の場合メソッド内だけになってしまう。)
使えるのはinitializeメソッドとインスタンスメソッドのみ

@前置きの変数をクラスメソッド内で操作してもインスタンス側に変更はない。
クラスメソッド内での@前置きの変数はクラスインスタンス変数として動作している模様。

クラス変数

class User
  @@x = “hello”
  def say
    puts @@x
  end
  def self.say2
    puts @@x
  end
end

User::say2 #=> hello
u = User.new
u.say #=> hello

@@を前置して、クラス定義の中に書く。
クラスメソッド、インスタンスメソッド、クラス定義式内でアクセス可能

クラスインスタンス変数

class User
  @x = “hello”
  def say
    puts @x
  end
  def self.say2
    puts @x
  end
end

User::say2 #=> hello
u = User.new
u.say #=>  空白

作り方は、@を前置きするのはインスタンス変数と一緒で、クラス定義内で定義するだけ。
機能はほぼクラス変数。違いはインスタンスメソッドからアクセスすることはできない

クラス・インスタンス変数のまとめ

@も@@もクラス内スコープ
ただ、@@はクラスで既に実体があるが、
@はインスタンス生成後、さらに代入などの処理があって実体ができる。

例えば、
class User
  @x = “hello”
  def say
    puts @x
  end
end
u = User.new
u.say
これでは空白が出力
@xを@@xにすればhelloが出力される。

class User
  @@x = “hello”
  def self.fst
    @@x = “bye”
  end
  def say
    puts @@x
  end
end
User::fst
u = User.new
u.say #=> bye
クラス変数は実体がクラスにあるので、クラスメソッドでの変更後
インスタンスを生成すると変更の影響を受けている。

つまり、@も@@もスコープはクラスの変数。
@をクラスで定義したりクラスメソッドで定義すると、クラス変数と同様のクラスインスタンス変数になるが、
値を入れておいてもインスタンス生成時に値が破棄される。
(インスタンスでの@とクラスにある@が別のスコープの別変数として存在している)

継承についても注意が必要で、@@は継承後も値は破棄されないが、
@は継承時にインスタンス生成と同じように破棄される。

@も@@も共にスコープはクラスなので、@をクラス変数の様に使うことも可能だが、
そうすると、インスタンスや継承時の動作に注意が必要。

class User
  @x = “hello”
  def self.fst
    puts @x
    @x = “bye”
    puts @x
  end
  def say
    puts @x
  end
end
User::fst
u = User.new
u.say
#=> hello
#=> bye
#=> 空白
@変数をクラス変数の代わりに利用。インスタンスで使わないなら問題ない。

グローバル変数

$を前置
スコープ無視

モジュール

module Hoge
  x = “hello”
  def self.say
    x = “bye”
    puts x
  end
  def sayHello
    puts “Hello Hello”
  end
end
Hoge::say #=> bye
ここのxはローカル変数であって、スコープ外なのでx=byeがないとエラー

class HogeHoge
  include Hoge
end
HogeHoge::say
モジュールでのクラスメソッドはインクルードされない。

h = HogeHoge.new
h.say #=> NG
h.sayHello #=> Hello Hello
モジュールのクラスメソッドはインクルードされない。
インクルードされるのはインスタンスメソッドのみ

module Fuga
  @x = “hey”
  def self.say
    puts @x
  end
end
Fuga::say #=> hello

class FugaFuga
  include Fuga
  def say
    puts @x
  end
end

f = FugaFuga.new
f.say #=> 空白
Fugaでの変数が@@xならheyと表示される
ミックスインでも@@はインクルードされるけど、@は破棄されるということ。

演算子

=== は、ほとんど == と同じだけど、
正規表現 === 変数 だとマッチするかどうか、
クラス === 変数 だとそのクラスのオブジェクトかどうか判断する。

数値
Fixnum
Bignum
Float

型はないので自由な値が入る。入っている値によって
指し示すオブジェクトが変わる。

型の自動変換はないので、
to_s
to_f
to_i

文字列

連結は+

“”は式展開あり #{ xxx }
”は式展開なし

囲う

%q = ‘xxx’と同じ
%Q = “xxx”と同じ
% = “xxx”と同じ
%r{xxx} = /xxx/と同じ(正規表現)
%w(xxx,xxx,xxx) は配列(Wだと式展開あり)

配列

[“dog”,”cat”]

include?
length
empty?
などのメソッドがある。

追加は <<

要素を超えて、取り出すとnil、加えると自動で大きくなる。
オブジェクトなら何でもはいる。

条件分岐

0,や空文字もtrueになる。falseはnilとfalseだけ。
比較演算子はtrue/falseを返す b = (a == c)等
条件分岐に入ると、真偽問わず、スコープの中にある変数は初期化される。

スコープ

if,for,while,case
などの条件式で、スコープを作らない。

メソッド、ブロックではスコープができる。

x = “hello”
def fnc
  x = “bye”
  puts x
end
puts x
fnc
#=> hello
#=> bye

面白いのは、インスタンス変数でも同じということ
これは既にmainというクラスの中にいるから。

@x = “hello”
def fnc
  @x = “bye”
  puts @x
end
puts @x
fnc
#=> hello
#=> bye

クラスで囲うとどうなるか。

class User
  @x = “hello” #<1>
  def fnc
     @x = “bye”
     puts @x
  end
  puts @x #<2>
end
u = User.new
u.fnc
#=> hello
#=> bye

この結果も同じだけど、これはインスタンス生成時に、classが評価されて、
最初のhelloが出力されている。実際、u.fncを呼ばなくてもhelloは出力されるし、
<1><2>のどちらかを消すとhelloを出力されない。

そのあとのbyeは普通どおりインスタンスからfncを呼んでいるから出力される。

インスタンス生成後も@x = “hello”は生きているけど、それはクラスのスコープであって
インスタンスには存在しない。

class User
  def fnc
    @x = “b”
    puts @x
  end
  def fnc2
    puts @x
  end
end
u = User.new
u.fnc
u.fnc2
#=> b
#=> b

インスタンス変数はクラススコープなので、最初fncでbが入り、次のfnc2でもその値が生きている。
fncをせずにfnc2を呼ぶと空白が出力される。

メソッド

途中で抜ける場合 returnも使える。
初期値を指定できる
def xx(var = “hello”)
end

引数の数量不定にすると配列になる
def fuc(*var)
end

第1引数はfstに入り、それ以降がvarの配列へ
def fuc(fst, *var)
end

名称について
? = true/falseを返す
! = 破壊的メソッド

ブロック

メソッド呼び出し時に定義する。メソッドに渡す処理の塊。
渡したメソッド内ではなく、ブロックを定義したスコープにいる。
yieldでメソッド側からブロックに引数を渡せる。

例外処理

begin

rescue
  例外時
else
  例外がない場合
end

メソッドなら
def

rescue
  例外時
else
  例外がない場合
end
とも書ける。

rescue => 変数で取り出す。

ハッシュ

population = {“France”=>100}
puts population [“France”]

キーがシンボルなら、以下の書き方ができる。

pop = {:fr => 100 }
なら、
pop = { fr:100 }
とできる。(スペースはいれない)

取り出すときは
pop [:fr]
となる。

範囲

1..10 # 1から10まで
1…10 # 1から9まで

正規表現

=~ で比較できる。
!~ は逆

string.gsubで置き換え。

日付

日時はTimeクラス
Dateオブジェクトは日付だけを扱う

日時の取り出し

t = Time.now
t.year
t.month
t.day
t.hour
t.min
t.sec

作る時

Time.local(2015,12,31,23,59,59)

整形はstrftime

t = Time.now
t.strftime(“%Y/%m/%d %H:%M”)

参照渡し

参照の値渡しになっている。

str1 = “hello”
str2 = “goodbye”

print “str1=”, str1.object_id, “\n”
print “str2=”, str2.object_id, “\n”

str1 = str2 #ここでstr1もstr2も”goodbye”を指している
str1.upcase!

print “str1=”, str1.object_id, “\n”
print “str2=”, str2.object_id, “\n”

puts str1,str2

str1=71129430
str2=71129420
str1=71129420
str2=71129420
GOODBYE
GOODBYE

クラスとメソッドについて

ドット記法はメソッド呼び出し
レシーバ.メソッド

二重コロンは
定数呼び出し、メソッドも呼べる。

rubyのインスタンスの内部的にはインスタンス変数とメソッドへのリンクだけ。
メソッドの定義はクラスに持っている。

ただ、通常のメソッド定義だとインスタンスに紐付いてクラスから直接呼べない

インスタンスメソッドをクラスから呼ぶNG
class Hoge
  def piyo
    ”hoge”
  end
end
p Hoge.piyo #=> undefined method

インスタンスメソッドをインスタンスから呼ぶOK
class Hoge
  def piyo
    ”hoge”
  end
end
h = Hoge.new
p h.piyo #=> hoge

クラスメソッドをクラスから呼ぶOK
class Hoge
  def self.piyo
    ”hoge”
  end
end
p Hoge.piyo #=> hoge

クラスメソッドをインスタンスから呼ぶNG
class Hoge
  def self.piyo
    ”hoge”
  end
end
h = Hoge.new
p h.piyo

と分けられる。

アクセサメソッド

自動で生成したい場合、インスタンス変数の名前をシンボルで渡す。
attr_accessor :name

そうすると、以下の2つのメソッドを自動で作る。
name=(value) # setter
name # getter

実体は以下のような感じ
class User
  def name
    @name
  end
  def name=(name)
    @name = name
  end
end

それぞれ1つだけでいい場合。
attr_reader :name
attr_writer :name

クラス内でアクセッサメソッドを呼ぶ時、
レシーバを省略して呼ぶと、ローカル変数とみなされてしまうので注意

メソッドのアクセス範囲

public

どこからでも

private

同クラス、サブクラスから読める。
レシーバ付けられない。関数形式でしか呼び出せない。

protected

同クラス、サブクラスから読める
レシーバ付けられる。
そのメソッドを持つオブジェクトがselfの場所でのみ呼び出せる

Ruby NET/SSH NET/SCP接続実験

SSH接続

SCP接続

レンサバで運用しているMySQLのバックアップをローカルのUbuntuへ保存。
必要であればcronに登録。

Windows バッチファイル メモ

変数セット

set hoge=hello world
(=の前後に空白入れない)

式の結果をセットしたい場合は
set /a

変数展開

echo %hoge%
(forで利用の場合%%)

ファイルへの書込み


上書き

>>
追記

パス指定方法

・バッチでよく使う”%~dpnx1″について

%0 :バッチファイル自身
%1 :ドラッグしたファイル
~  :ダブルクォートを除く
d  :ドライブ名
p  :パス名
n  :ファイル名
x  :拡張子

フルパス
%0

ファイル名(拡張子有)
%~n0%~x0

ファイル名(拡張子無)
%~n0

拡張子
%~x0

ディレクトリ
%~dp0

・使用例

自身のフォルダのパスを追加する。
set PATH=%~dp0;%PATH%

バッチと同じ場所にあるindex.htmlを開く。
start chrome %~dp0index.html

上の階層にあるファイルに書き込み。
set text=Hello World
echo %text%> %~dp0\..\_Path.txt

ファイル名を日付にする方法
set ymd=%date:~0,4%%date:~5,2%%date:~8,2%

文字コード

chcp xxx
Shift JIS:932
EUC-JP:20932
UTF-8:65001

タスクの一覧

・タスクの一覧ファイルを作る方法。
tasklist > a.txt

・タスクの終了
taskkill /f /im chrome.exe
(imはイメージ名で指定)

ショートカット

Win+R>cmd>cd Desktop
とするような場合、
デスクトップにショートカット作成し、
cmd
と入力し、プロパティの作業フォルダを空にする。
(ファイルの場所がカレントディレクトリになる)

あるいは、フォルダに対してShiftを押しながら右クリックして、
PowerShell ウィンドウをここで開く
が一番簡単かも。

for文

for オプション 変数1文字 in (対象) do コマンド
あるいは、
for オプション 変数1文字 in (対象) do (
コマンド
)
のように改行もできる。

Lオプション (値増加)
for /L %%i in (開始,増加量,終了) do

オプション無し(ファイル対象)
for %%i in (*.txt) do

Dオプション(フォルダ対象)
for /d %%i in (*) do

変数に付く%記号は、バッチで使う場合は%%、コマンドプロンプトからの場合は%となるので注意。また通常の環境変数とも違うので注意。

・forの中で変数展開する場合

setlocal enabledelayedexpansion~endlocal
で!を利用するできるが、ファイル名に!があると駄目。

サブルーチン化でも可。
for %%i in (*) do (
call :sub
)
pause
exit
:sub
exit /b

置換

変数名:置換対象の文字列=置換後の文字列
set p=%~dp0
echo datadir = %p:\=/% >> test.txt
のような感じ

for文の中での置換
for %%i in (*.mkv) do (
set x=%%i
set y=!x:mkv=mp4!
)

バッチファイルサンプル

arp -a xxx
IPアドレスとMACアドレスの対応のキャッシュを表示する。

echo off
結果のみ表示したい場合

・カレントディレクトリのファイル一覧

・カレントディレクトリの移動

・LameにWavを渡す

・Ping送信

・Pingでアドレスの一覧

Ubuntu セキュリティ関連設定

パスワード認証のSSHの場合

SSH

ポートの変更

sudo vim /etc/ssh/sshd_config
Port
22 > 50022

再起動
service ssh restart

ここでSSHを秘密鍵・公開鍵に切り替える。
(秘密鍵・公開鍵を作成+TeraTermから接続)

ufw

最初は有効になっていない。

IPv6無効化
sudo vim /etc/default/ufw
IPV6=no

sshを許可
sudo ufw allow 50022/tcp

起動
sudo ufw enable
(enable後は、再起動してもufwは有効になっている)

再起動する場合
sudo ufw reload

SSH

ルートを弾く(必要なら)
sudo vim /etc/ssh/sshd_config
PermitRootLogin
yes > no

パスワード認証を停止
sudo vim /etc/ssh/sshd_config
PasswordAuthentication
ChallengeResponseAuthentication
GSSAPIAuthentication

3つともnoへ

接続ユーザを限定(必要なら)
sudo vim /etc/ssh/sshd_config
AllowUsers ubuntu
追加

再起動
service ssh restart

秘密鍵・公開鍵を作成+TeraTermから接続

秘密鍵・公開鍵作成1
ssh-keygen -t rsa

ファイル名を聞かれるのでidとする。
パスフレーズも聞かれる。ここではとりあえず付けない。

公開鍵(id.pub)、秘密鍵(id)が生成される。

秘密鍵・公開鍵作成2

TeraTerm>設定>SSH鍵生成
公開鍵(id_rsa.pub)、秘密鍵(id_rsa)を保存する。

公開鍵の内容は
.ssh/authorized_keys
に記載する必要がある。
(なければ作成。他に書き込みがある場合、新しい行でも大丈夫)

パーミッション確認
chmod 600 authorized_keys

秘密鍵はローカルに保存しTeraTermのフォルダへ入れる。
名前は変えてしまってOK

再起動
service ssh restart

TeraTermから接続
connect ‘192.168.xxx.xxx:50022 /ssh /2 /auth=publickey /user=xxx /keyfile=xxx’

WinSCPから接続

WinSCPはppk形式なので、OpenSSH→ppkが必要。
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
から
puttygen.exe
を保存し、実行する。

Conversions>Import keyで秘密鍵(id_rsa)を読み込み、Save private keyで保存する。

新しいサイトを作成する。
転送プロトコル:SFTP
ホスト名:IPアドレス
ポート番号:50022
ユーザー名:root
パスワード:空白

設定>SSH>認証>認証条件
の秘密鍵に、
*.ppkを指定する。

管理>名前をつけて保存
を実行。

鍵の種類

・ppk
PuTTY形式

・pem
OpenSSL形式
OpenSSH7.8未満
—–BEGIN RSA PRIVATE KEY—–

・OpenSSH形式
OpenSSH7.8以上
—–BEGIN OPENSSH PRIVATE KEY—–

・OpenSSH公開鍵
ssh-rsa

Rubyファイル操作

bash_historyの重複削除

ApacheのCGIでRubyを呼び出す。

Apacheの設定

sudo find / -name 000-default.conf
で検索かけると2箇所ある。

/etc/apache2/sites-enabled/000-default.conf
/etc/apache2/sites-available/000-default.conf

設定を読み込まれているのは、enabledで、availableの
設定ファイルへシンボリックしている。

mods-enabledの中でシンボリックしているのは、
cgid.conf
cgid.load
だけ。

mods-availableの中にcgi関連は、
authnz_fcgi.load
cgi.load
cgid.conf
cgid.load
proxy_fcgi.load
proxy_scgi.load
だけ。

sites-availableを以下のように変更。
<Directory /home/okamura/www/>
Require all granted
AllowOverride All
Options +ExecCGI
AddHandler cgi-script .rb
</Directory>

CGI側(Ruby)

rubyのファイルに以下のように記述し、
chmod +x で実行権限をつければOK。

エラーの場合、
改行コードが違っていてハマッた。Winで作ってLinuxに転送の場合注意。

GETを受取たい場合

送信側(Form)

CGI(Ruby)

Ubuntuでの自動起動について

サービスの自動起動について(スタートアップ)

sysv-rc-conf

インストール
sudo apt-get install sysv-rc-conf

グラフィカルな設定
sudo sysv-rc-conf

自動起動できているか。
sudo sysv-rc-conf -list | grep xxx

サービスを自動起動へ設定
sudo sysv-rc-conf xxx on

自動起動オフ
sudo sysv-rc-conf xxx off

起動スクリプトの場所(sysvinit)

/etc/init.d/
の中がスクリプト実体。

/etc/の中に
rc.local (ホスト固有の設定)
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rcS.d
があり、ここにシンボリックを置いておく。

これらの0~6はOSが起動しているrunlevelの時に
対応していて、そのフォルダのスクリプトが読まれる。

SoftEtherをUbuntuとWinにインストール

SoftEtherを使うとき、自動で立ち上げるのに、
/etc/rc.local
の中に
/home/okamura/vpnserver/vpnserver start
と書いてしまった。

ランレベル

0:システム停止
1:シングルユーザモード
2:ローカルマルチユーザモード(NFSなどはなし)
3:フルマルチユーザモード(テキストコンソール)
4:未使用
5:フルマルチユーザモード(グラフィカル環境)
6:システム再起動

init.d 起動と service 起動の違い
/etc/init.d/xxxx start
は環境変数が引き継がれる。
service xxxx start
はPATH,TERM,LANGが引き継がれる。

SoftEther Ubuntu/Win インストール

Windows(サーバー)

公式サイトのSoftEther VPNのダウンロードから、
・ダウンロードするソフトウェア:SoftEther VPN(Freeware)
・コンポーネントを選択:SoftEther VPN Server
・プラットフォームを選択:Windows
・CPUを選択:Intel(x86 and x64)
・SoftEther VPN Server and VPN Bridge (Ver xxx, Build xxx, rtm)
をダウンロード、インストール。

・最初の選択画面でSoftEther VPN Serverを選択。
(管理ツールも一緒インストールされる)

・管理者パスワードを設定する。
(ユーザーのパスワードとは別なので注意)

・リモートアクセス VPN サーバーを選択する。

・仮想HUB名を設定する。(VPNから特に変更の必要なし)

・ユーザーを作成する。

途中からダイナミックDNSを有効にする場合、
サーバー管理マネージャ>接続>Config編集>
DDnsClient>bool Disabled
をfalseにする。

Windows(クライアント)

公式サイトのSoftEther VPNのダウンロードから、
・ダウンロードするソフトウェア:SoftEther VPN(Freeware)
・コンポーネントを選択:SoftEther VPN Client
・プラットフォームを選択:Windows
・CPUを選択:Intel(x86 and x64)
・SoftEther VPN Client (Ver xxx, Build xxx, rtm)
をダウンロード、インストール。

・最初の選択画面でSoftEther VPN Clientを選択。
(管理ツールも一緒インストールされる)

1.新しい接続設定の作成
を実行し仮想LANカードを作成する。

2.仮想LANカードにIPを設定する。
現在利用しているのとは別ネットワークで、設定はIPアドレスとサブネットマスクだけでOK。例えば現在のネットワークが192.168.1.xだったら、仮想LANカードには192.168.2.xというように。

3.新しい接続設定の作成
を実行する。

・接続設定名:
適当に入力する。

ホスト名:
サーバーがあるLANのグローバルIP/サーバーのローカルIPというように記入する。

・ポート、ユーザー名、パスワード:
サーバーで設定した値を入力する。

・高度な通信設定:
コネクションを8本に変更する。
半二重モードを使用するにチェックする。
VPN Serverとの間の通信をSSLで暗号化するにチェックする。
再接続間隔:60秒

・サーバー証明書を必ず検証する:
をチェックする。

初回のみ、
固有証明書の登録をクリック>ファイルから証明書を読み込む
にて登録。
(ファイル実体は削除しても大丈夫)

証明書の書き出しは
サーバー管理マネージャ>接続>暗号化と通信関係の設定>エクスポート
PKCS#12にてエクスポート。

作成した接続設定の右クリックから、スタートアップ接続を指定する。

Ubuntu(サーバー)

ここではUbuntuにSambaを入れ共有フォルダにWindowsのクライアントからアクセスしてみる。

CPUを調べる
cat /proc/cpuinfo

bitを調べる
uname -a

ダウンロード
wget https://jp.softether-download.com/files/softether/v4.34-9745-rtm-2020.04.05-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.34-9745-rtm-2020.04.05-linux-x64-64bit.tar.gz

インストール
tar -zxvf softether-vpnserver-v …
cd vpnserver
make

エラーがでる場合、
sudo apt-get update
sudo apt-get install make
sudo apt-get install gcc
sudo apt-get install binutils
とするか、
sudo apt-get install build-essential
(yum groupinstall “Development Tools”)

あたりを実行。

パーミション

インストールフォルダにて
chmod 600 *

chmod 700 vpncmd
chmod 700 vpnserver

・サービス登録

インストールフォルダに
startup.sh※文末
を作成し以下を書き込み。

vim /etc/systemd/system/vpnserver.service
以下、書き込み。

起動
sudo systemctl daemon-reload
sudo systemctl start vpnserver

終了
sudo systemctl stop vpnserver

自動起動する場合
sudo systemctl enable vpnserver

管理者パスワード設定
インストールフォルダにて
./vpncmd
Select 1, 2 or 3: 1
Hostname of IP Address of Destination: localhost
Specify Virtual Hub Name: 空白
VPN Server>ServerPasswordSet
とりあえず123123abcのような簡単なパスワードにしておく。
VPN Server>exit

ポート開放
sudo ufw allow 5555/tcp
(firewall-cmd –add-port=5555/tcp –zone=public –permanent)

・Windowsのサーバー管理マネージャで作業。

起動画面にて、新しい接続設定を実行
・接続設定名:ConoHa(CentOS)
・ホスト名:IPアドレス
・ポート番号:5555
・管理パスワード:123123abc

接続すると初回接続時のみ簡易セットアップダイアログが開く。

・リモートアクセスVPNサーバー
をチェックし次へ

・仮想HUB名:VPN(そのまま)
と入力しOK。

・ダイナミックDNS機能
はそのまま変更なし。

・IPsec/L2TP/EtherIP/L2TPv3サーバー機能の設定
はチェック無し(そのまま)でOK。

・VPN Azureクラウド
VPN Azureを無効にする
をチェックしOK。

1.ユーザーを作成する
をクリックし、ユーザー名とパスワードを入力してOK。
3.ローカルブリッジの設定
ではブリッジの設定しない。
閉じる。

簡易セットアップダイアログここまで。
ここからサーバー管理マネージャの通常画面で作業。

・リスナーポートを5555以外削除

・暗号化と通信関係の設定>管理者パスワードの変更

・ローカルブリッジ設定

仮想HUBでVPNを選択する。
新しいtapデバイスとのブリッジ接続をチェックし、
vpnserver
と入力しローカルブリッジを追加を実行。

Windowsのクライアント接続マネージャで作業。

・新規仮想LANカードの作成

を実行。名前はそのままでOK。

Microsoft ネットワーク用クライアント
Microsoft ネットワーク用ファイルとプリンター共有
インターネットプロトコル4(TCP/IPv4)
のみ残し、IPアドレスを
192.168.13.2 / 255.255.255.0
としておく。

・接続設定の新規作成

接続名:ConoHa(CentOS)
ホスト名:IPアドレス
ポート番号:5555
仮想HUB名:VPN
使用するLANカード:作成したLANカード
ユーザー認証:サーバー管理マネージャで作成した値

その他の部分は、上記のWindows(クライアント)の部分を参考。

sambaのインストール

Sambaのインストール

ポート開放
sudo ufw allow from 192.168.12.2 to any app samba

これで、VPS上のsambaのフォルダにアクセスできる。

Ubuntu(サーバー) アップデート

サービス停止
sudo systemctl stop vpnserver

バックアップ
mv vpnserver vpnserver20230117

ダウンロード
wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.41-9782-beta/softether-vpnserver-v4.41-9782-beta-2022.11.17-linux-x64-64bit.tar.gz

インストール
tar -zxvf softether-vpnserver-v …
rm softether-vpnserver-v …
cd vpnserver
make

パーミッション
chmod 600 *
chmod 700 vpncmd
chmod 700 vpnserver

設定ファイルコピー
sudo cp /home/ubuntu/vpnserver20230117/vpn_server.config /home/ubuntu/vpnserver/
sudo cp /home/ubuntu/vpnserver20230117/startup.sh /home/ubuntu/vpnserver/

起動
sudo systemctl start vpnserver

startup.sh補足

・for 変数 in リスト
do 処理
done

・ip tuntap
tuntapデバイス一覧

・tuntap
仮想ネットワークデバイス。
ハードウェアではなくプログラムにデータを渡す。

・grep -q
標準出力しない

・$?
直前コマンドの結果
0:成功
1:失敗(1以外もある)

・ifconfig インタフェース IPアドレス
インタフェースにIPアドレスを割り当てる。

・ExecStartPost
ExecStartが正常終了した場合実行される。

UbuntuでのIPアドレス固定化

route -n
ゲートウェイチェック。

ifconfig
DHCPのアドレスとマスクを確認。

cat /etc/resolv.conf
DNSネームサーバ

nameserver 127.0.1.1
のように自PCになっている場合あり。

デフォルト設定だと NetworkManager が有効になっていて、
dnsmasq が DNS キャッシュサーバーとして動いている模様。

NetworkManager(ネットワーク切り替え補助)

/etc/network/interfaces
に以下を追記する。

auto wlan0
iface wlan0 inet static
address 192.168.102.15
netmask 255.255.255.0
gateway 192.168.102.1
dns-nameservers 192.168.102.1
wpa-ssid xxx
wpa-ap-scan 1
wpa-key-mgmt WPA-PSK
wpa-psk xxx

有線の場合等
auto eth1
iface eth1 inet static
address 192.168.102.100
netmask 255.255.255.0
gateway 192.168.102.1
dns-nameservers 192.168.102.1

loとはローカルループバック
autoとは自動接続

再度読み込む場合(上手く行かないことが多い)
sudo service networking restart
sudo service network-manager restart

PHP IPアドレス確認用POST

クライアント

あるいは、

Winならタスクスケジュール、ubuntuならCRONに設定しておくと、
定期的にWan側のIPがレンサバに表示できるので、そのWan側のIPを使って、
SoftEtherをダイナミックDNSではなく、IP直打ちもできる。
xxx.xxx.xxx.xxx/192.168.xxx.xxxのような感じで入力する。

post.php

s.css