CentOS7 で Softether の開発版を使ってみる備忘録です.
はじめに
Softether って,通常は,
からダウンロードできるバイナリファイルを使うのが普通でしょう.でも,Linux 系の OS の場合,そもそもインストールするのに開発環境が必要です.さらに,少し前から
にソースコードが公開されていますので,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 スクリプト)を書き換えます.
- cmake ではなくて cmake3 を使う.
- /usr/local/vpn 以下にインストールする.
- 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 開発版じゃなければ,今のところこんな書き換えは必要ありません.安定板も,
に公開されていますので,本来ならばこちらを使うべきでしょう.
しかし,最近,CentOS7 だとこういうことが増えてきました.まぁ,既に7系列が公開されて3年経つので仕方がないんでしょうね…….この息の長さが CentOS の良いところですしね.
以上!