Softether 開発版 on CentOS7 備忘録

Networks
Photo by hyt.

CentOS7 で Softether の開発版を使ってみる備忘録です.

はじめに

Softether って,通常は,

SoftEther VPN プロジェクト - SoftEther VPN プロジェクト

からダウンロードできるバイナリファイルを使うのが普通でしょう.でも,Linux 系の OS の場合,そもそもインストールするのに開発環境が必要です.さらに,少し前から

GitHub - SoftEtherVPN/SoftEtherVPN: Cross-platform multi-protocol VPN software. Pull requests are welcome. The stable version is available at https://github.com/SoftEtherVPN/SoftEtherVPN_Stable.
Cross-platform multi-protocol VPN software. Pull requests are welcome. The stable version is available at - SoftEtherVPN...

にソースコードが公開されていますので,Git ならアップデートもやりやすいということで,最近はソースコードからコンパイルして使っています.

で,しばらくアップデートかけて無かったので,アップデートしてみると……何と,素直にはコンパイルできなくなっています.と言うことで,若干,試行錯誤してみた結果のメモとなります.

Intel AES-NI ライブラリの導入

どうせ試行錯誤するんだから Intel AES-NI ライブラリも有効にしてみます.で,Intel AES-NI ライブラリも CentOS7 の最新版だと素直にコンパイルできません.

原因は gcc のオプションです.どうも gcc-4.8.5 以降の場合,-lpthread をコンパイル時にオプションとして渡しておかないと,エラーでコンパイルが止まってしまいます.要するに,gcc のオプションとして,-lpthread を追加で渡してやれば良いのですが,結構いろいろな場所に書換箇所がちらばっているので,以下 patch の形でそれを示しておきます.

$ cd /usr/local/src
$ sudo vi intelaeslibpthread.patch
diff -uprN Intel_AESNI_Sample_Library_v1.2.orig/aes_example/mk_lnx.sh Intel_AESNI_Sample_Library_v1.2/aes_example/mk_lnx.sh
--- Intel_AESNI_Sample_Library_v1.2.orig/aes_example/mk_lnx.sh  2010-10-02 06:37:14.000000000 +0900
+++ Intel_AESNI_Sample_Library_v1.2/aes_example/mk_lnx.sh       2018-05-27 00:11:54.250321262 +0900
@@ -35,6 +35,6 @@ mkdir -p obj/x${arch}

 $yasm -D__linux__ -g dwarf2 -f elf${sz} asm/x${arch}/do_rdtsc.s -o obj/x${arch}/do_rdtsc.o

-gcc -O3 -m${sz} -g $lvl -o $out src/aes_example.c src/my_getopt.c -Isrc -I../intel_aes_lib/include obj/x${arch}/do_rdtsc.o ../intel_aes_lib/lib/x${arch}/intel_aes${arch}.a
+gcc -O3 -m${sz} -g $lvl -o $out src/aes_example.c src/my_getopt.c -Isrc -I../intel_aes_lib/include obj/x${arch}/do_rdtsc.o ../intel_aes_lib/lib/x${arch}/intel_aes${arch}.a -lpthread

 echo created $out
diff -uprN Intel_AESNI_Sample_Library_v1.2.orig/aes_gladman_subset/mk_lnx.sh Intel_AESNI_Sample_Library_v1.2/aes_gladman_subset/mk_lnx.sh
--- Intel_AESNI_Sample_Library_v1.2.orig/aes_gladman_subset/mk_lnx.sh   2010-10-02 06:37:14.000000000 +0900
+++ Intel_AESNI_Sample_Library_v1.2/aes_gladman_subset/mk_lnx.sh        2018-05-27 00:14:02.270438516 +0900
@@ -43,7 +43,7 @@ set obs=
 for i in $src; do
        obj=obj/x$arch/$i.o
        obs="$obs $obj"
-       gcc -m$sz -g $lvl $defines -Iinclude -o $obj -c src/$i.c
+       gcc -m$sz -g $lvl $defines -Iinclude -o $obj -c src/$i.c -lpthread
        if [ $? -ne 0 ]
        then
                echo "Got error compiling src/$i.c"
@@ -52,7 +52,7 @@ for i in $src; do
 done

 obs="$obs obj/x$arch/$asm.o"
-gcc -m$sz -g $lvl -o $out  $obs ../intel_aes_lib/lib/x$arch/intel_aes$arch.a -lm -lrt
+gcc -m$sz -g $lvl -o $out  $obs ../intel_aes_lib/lib/x$arch/intel_aes$arch.a -lm -lrt -lpthread
 if [ $? -ne 0 ]
 then
        echo "Got error on link"
diff -uprN Intel_AESNI_Sample_Library_v1.2.orig/aes_gladman_subset/mkit.sh Intel_AESNI_Sample_Library_v1.2/aes_gladman_subset/mkit.sh
--- Intel_AESNI_Sample_Library_v1.2.orig/aes_gladman_subset/mkit.sh     2010-10-02 06:37:14.000000000 +0900
+++ Intel_AESNI_Sample_Library_v1.2/aes_gladman_subset/mkit.sh  2018-05-27 00:14:02.963466218 +0900
@@ -24,7 +24,7 @@ set obs=
 for i in $files; do
        obj=obj/x$arch/$i.o
        obs="$obs $obj"
-       gcc -m$sz -g $opt -Iinclude -o $obj -c src/$i.c
+       gcc -m$sz -g $opt -Iinclude -o $obj -c src/$i.c -lpthread
        if [ $? -ne 0 ]
        then
                echo "Got error compiling src/$i.c"
@@ -33,7 +33,7 @@ for i in $files; do
 done

 obs="$obs obj/x$arch/$asm.o"
-gcc -m$sz -g $opt -o bin/modetest$arch  $obs ../intel_aes_lib/lib/x$arch/intel_aes$arch.a -lm -lrt
+gcc -m$sz -g $opt -o bin/modetest$arch  $obs ../intel_aes_lib/lib/x$arch/intel_aes$arch.a -lm -lrt -lpthread
 if [ $? -ne 0 ]
 then
        echo "Got error on link"
diff -uprN Intel_AESNI_Sample_Library_v1.2.orig/intel_aes_lib/mk_lnx_bin.sh Intel_AESNI_Sample_Library_v1.2/intel_aes_lib/mk_lnx_bin.sh
--- Intel_AESNI_Sample_Library_v1.2.orig/intel_aes_lib/mk_lnx_bin.sh    2010-10-02 06:37:14.000000000 +0900
+++ Intel_AESNI_Sample_Library_v1.2/intel_aes_lib/mk_lnx_bin.sh 2018-05-27 00:10:49.633738391 +0900
@@ -17,4 +17,4 @@ fi
 #echo got sz= $sz and arch= $arch


-gcc -m${sz} -O -Iinclude -o bin/aessample${arch} src/aessample.c lib/x${arch}/intel_aes${arch}.a
+gcc -m${sz} -O -Iinclude -o bin/aessample${arch} src/aessample.c lib/x${arch}/intel_aes${arch}.a -lpthread
diff -uprN Intel_AESNI_Sample_Library_v1.2.orig/intel_aes_lib/mk_lnx_lib.sh Intel_AESNI_Sample_Library_v1.2/intel_aes_lib/mk_lnx_lib.sh
--- Intel_AESNI_Sample_Library_v1.2.orig/intel_aes_lib/mk_lnx_lib.sh    2010-10-02 06:37:14.000000000 +0900
+++ Intel_AESNI_Sample_Library_v1.2/intel_aes_lib/mk_lnx_lib.sh 2018-05-27 00:10:51.215801629 +0900
@@ -23,7 +23,7 @@ yasm="../yasm/yasm"
 pushd .
 asm="iaesx${arch} do_rdtsc"
 for i in $asm; do echo do $i.s; $yasm -D__linux__ -g dwarf2 -f elf${sz} asm/x${arch}/$i.s -o obj/x${arch}/$i.o; done
-gcc -O3 -g -m${sz} -Iinclude/ -c src/intel_aes.c -o obj/x${arch}/intel_aes.o
+gcc -O3 -g -m${sz} -Iinclude/ -c src/intel_aes.c -o obj/x${arch}/intel_aes.o -lpthread
 ar -r lib/x${arch}/intel_aes${arch}.a obj/x${arch}/*.o
 popd

実際のコンパイル手順は以下の通りです.

$ sudo yum -y install wget unzip patch
$ cd /usr/local/src
$ sudo wget https://software.intel.com/sites/default/files/article/181731/intel-aesni-sample-library-v1.2.zip
$ sudo unzip intel-aesni-sample-library-v1.2.zip
$ cd Intel_AESNI_Sample_Library_v1.2/
$ sudo patch -p1 < ../intelaeslibpthread.patch
$ sudo ./mk_lnx64_all.sh

最終的に必要なのは,intel_aes64.a のみですが,正しく作れているか否かは以下の様にすれば分かります.

$ ./intel_aes_lib/bin/aessample64

Intel(R) AES-NI Sample Library validation application

Intel AES New Instructions detected

The Test Vectors used to validate implementation correctness for
the following block ciphers 'AES[128|192|256][CBC|CTR]' are defined in the
'NIST Special Publication 800-38A' (Appendix F) and can be found here:
http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf


Testing AES-CBC Mode

1 block(s):  AES-128-CBC: PASS, AES-192-CBC: PASS, AES-256-CBC: PASS

2 block(s):  AES-128-CBC: PASS, AES-192-CBC: PASS, AES-256-CBC: PASS

3 block(s):  AES-128-CBC: PASS, AES-192-CBC: PASS, AES-256-CBC: PASS

4 block(s):  AES-128-CBC: PASS, AES-192-CBC: PASS, AES-256-CBC: PASS



Testing AES-CTR Mode

1 block(s):  AES-128-CTR: PASS, AES-192-CTR: PASS, AES-256-CTR: PASS

2 block(s):  AES-128-CTR: PASS, AES-192-CTR: PASS, AES-256-CTR: PASS

3 block(s):  AES-128-CTR: PASS, AES-192-CTR: PASS, AES-256-CTR: PASS

4 block(s):  AES-128-CTR: PASS, AES-192-CTR: PASS, AES-256-CTR: PASS

cmake3 の導入

次は,cmake を導入します.実は,これが Softether の configure スクリプトの中で使われるようになったことが素直にコンパイルできなくなった主原因です.で,さらに困ったことに,何と cmake ver 3.0 以上が要ります(CentOS7 の cmake は2系列).

仕方が無いので,

$ sudo yum -y install epel-release
$ sudo sed -i -e "s/\]$/\]\npriority=5/g" /etc/yum.repos.d/epel.repo

のように epel リポジトリを追加して,その他の必要パッケージと共に cmake3 を

$ sudo yum install -y cmake3 ncurses-devel openssl-devel readline-devel zlib-devel

のように追加しました.なお,cmake ver 2 系列と cmake ver 3 系列は同居可能です.ただし,cmake ver 3 系列を使う場合は cmake3 というコマンドとなります.

Softether の導入

され,これで準備ができましたので,まずは,/usr/local/src に Softether のソースコートをダウンロードします.

$ cd /usr/local/src
$ sudo git clone https://github.com/SoftEtherVPN/SoftEtherVPN.git

今回は,以下の条件に合うようソースコート(Configure スクリプト)を書き換えます.

  1. cmake ではなくて cmake3 を使う.
  2. /usr/local/vpn 以下にインストールする.
  3. Intel AES-NI ライブラリを使う.

書換箇所は以下の通りです(git diff の結果を示します.一部省略).なお,cmake って初めてなので,もっと適切な方法があるのかもしれません.

$ cd /usr/local/src/SoftEtherVPN
$ git diff
--- a/configure
+++ b/configure
@@ -21,7 +21,7 @@ if [ ! -d "tmp" ]; then
   mkdir tmp
 fi

-(cd tmp && cmake .. || exit 1)
+(cd tmp && cmake3 .. || exit 1)

 echo ""

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 731d0da..78d57b5 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -17,6 +17,13 @@ endmacro(install_wrapper_script)
 file(GLOB SOURCES_CEDAR "Cedar/*.c")
 file(GLOB HEADERS_CEDAR "Cedar/*.h")

+add_library(intel_aes64 STATIC IMPORTED)
+
+set_target_properties(intel_aes64
+  PROPERTIES
+  IMPORTED_LOCATION /usr/local/src/Intel_AESNI_Sample_Library_v1.2/intel_aes_lib/lib/x64/intel_aes64.a
+)
+
 add_library(cedar STATIC ${SOURCES_CEDAR} ${HEADERS_CEDAR})

 set_target_properties(cedar
@@ -111,7 +118,7 @@ if(CMAKE_SIZEOF_VOID_P EQUAL 8)
     add_definitions(-DCPU_64)
 endif()

-add_definitions(-D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64)
+add_definitions(-DUSE_INTEL_AESNI_LIBRARY -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64)

 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsigned-char")

@@ -176,7 +183,7 @@ if(UNIX)
   endif()
 endif()

-target_link_libraries(mayaqua ${LIB_PTHREAD} ${LIB_SSL} ${LIB_CRYPTO} ${LIB_READLINE} ${LIB_NCURSES} ${LIB_Z})
+target_link_libraries(mayaqua intel_aes64 ${LIB_PTHREAD} ${LIB_SSL} ${LIB_CRYPTO} ${LIB_READLINE} ${LIB_NCURSES} ${LIB_Z})

 if(LIB_ICONV)
   target_link_libraries(mayaqua ${LIB_ICONV})
@@ -224,17 +231,18 @@ add_custom_command(TARGET hamcore-archive-build

 # Copy contents of "bin" directory to /usr
 install(DIRECTORY "${CMAKE_SOURCE_DIR}/bin/"
-  DESTINATION "/usr"
+  DESTINATION "/usr/local/vpn"
   PATTERN "*"
   PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
 )

 # Create wrapper scripts in the user's binaries directory, which is usually "/usr/local/bin".
 # This is required because symlinks use the folder they are in as working directory.
-install_wrapper_script("/usr/vpnserver/vpnserver" ${CMAKE_INSTALL_FULL_BINDIR})
-install_wrapper_script("/usr/vpnclient/vpnclient" ${CMAKE_INSTALL_FULL_BINDIR})
-install_wrapper_script("/usr/vpnbridge/vpnbridge" ${CMAKE_INSTALL_FULL_BINDIR})
-install_wrapper_script("/usr/vpncmd/vpncmd" ${CMAKE_INSTALL_FULL_BINDIR})
+install_wrapper_script("/usr/local/vpn/vpnserver/vpnserver" ${CMAKE_INSTALL_FULL_BINDIR})
+install_wrapper_script("/usr/local/vpn/vpnclient/vpnclient" ${CMAKE_INSTALL_FULL_BINDIR})
+install_wrapper_script("/usr/local/vpn/vpnclient/vpnclient" ${CMAKE_INSTALL_FULL_BINDIR})
+install_wrapper_script("/usr/local/vpn/vpncmd/vpncmd" ${CMAKE_INSTALL_FULL_BINDIR})

この書き換えを済ませれば,あとはいつもの通り,

$ sudo ./configure
$ sudo make -C tmp
$ sudo make -C tmp install

とすることで,

  • /usr/local/vpn/vpnbridge
  • /usr/local/vpn/vpnclient
  • /usr/local/vpn/vpncmd
  • /usr/local/vpn/vpnserver

以下にバイナリファイルが配置され,/usr/local/bin 以下にそれらバイナリファイルを起動するスクリプトがインストールされます.

おわりに

まず,注意として,Softether 開発版じゃなければ,今のところこんな書き換えは必要ありません.安定板も,

GitHub - SoftEtherVPN/SoftEtherVPN_Stable: Cross-platform multi-protocol VPN software. This repository is officially managed by Daiyuu Nobori, the founder of the project. Pull requests should be sent to the master repository at https://github.com/SoftEtherVPN/SoftEtherVPN.
Cross-platform multi-protocol VPN software. This repository is officially managed by Daiyuu Nobori, the founder of the p...

に公開されていますので,本来ならばこちらを使うべきでしょう.

しかし,最近,CentOS7 だとこういうことが増えてきました.まぁ,既に7系列が公開されて3年経つので仕方がないんでしょうね…….この息の長さが CentOS の良いところですしね.

以上!

NetworksServer
スポンサーリンク
Following hyt!
タイトルとURLをコピーしました