为华硕RT-AC68U路由器编译openconnect客户端

openconnect 这个东西是什么各位就自己去搜吧。大概搜了一下没发现有人写过这方面的东西,梅林固件论坛曾有人发过一次贴,但并没给出编译过程,自己研究后拿出来分享一下。

首先要按照梅林固件编译过程准备一份编译梅林固件的环境, 教程可以参考这里,内容有些过期,编译382以后的ng分支的话需要有些变动,toolchain 使用这个。我个人是使用的 Debian 9的虚拟机配置的环境。openconnect 官网指出,编译需要 libxml2, zlib,OpenSSL 或 GnuTLS,可选 p11-kit,libp11,libproxy,trousers,libstoken,libpksc,libpcsclite 这几个库,实际上几个可选库都是为了硬件认证使用的,路由器上用不到,所以我编译的时候实际使用了 libxml2、 GnuTLS 和 libLZ4(官网没有提到),其中 libLZ4 是一种很快速的压缩算法。

话不多说,直接上脚本。

#!/bin/bash
TARGET_HOST=arm-brcm-linux-uclibcgnueabi
PREFIX=/root/dists/$TARGET_HOST
ROUTER_FIRMWARE_SRC=/home/root/asuswrt-merlin-ng/release/src-rt-6.x.4708/router

INCLUDE_DIR=${PREFIX}/include
LIB_DIR=${PREFIX}/lib

LZ4_VERSION=v1.8.2
GMP_VERSION=6.1.2
NETTLE_VERSION=3.4
GNUTLS_VERSION=3.5
GNUTLS_BUILD=18
GNUTLS_FULL_VERSION=${GNUTLS_VERSION}.${GNUTLS_BUILD}
LIBXML2_VERSION=v2.9.8
OPENCONNECT_VERSION=v7.08

export CC=${TARGET_HOST}-gcc
export CXX=${TARGET_HOST}-g++
export AR=${TARGET_HOST}-ar
export LD=${TARGET_HOST}-ld

pause()
{
  SAVEDSTTY=`stty -g`
  stty -echo
  stty raw
  dd if=/dev/tty bs=1 count=1 2> /dev/null
  stty -raw
  stty echo
  stty $SAVEDSTTY
}

# LZ4 ------------------------------------------------ 
make_lz4(){
  if [ ! -d "lz4" ]; then
    git clone https://github.com/lz4/lz4.git
  fi
  cd lz4
  git reset --hard && git checkout dev && git pull && git checkout ${LZ4_VERSION}
  make clean
  CPPFLAGS="-fvisibility=default -fPIC" LDFLAGS="-static -static-libgcc" make && make PREFIX=$PREFIX install
  cd ..
}

# GMP ------------------------------------------------ 
make_gmp(){
  if [ ! -d "gmp-${GMP_VERSION}" ]; then
    wget https://gmplib.org/download/gmp/gmp-${GMP_VERSION}.tar.lz
    lzip -d gmp-${GMP_VERSION}.tar.lz && tar xf gmp-${GMP_VERSION}.tar && rm -f gmp-${GMP_VERSION}.tar gmp-${GMP_VERSION}.tar.lz
  fi
  cd gmp-${GMP_VERSION}
  make clean
  ./configure --host=${TARGET_HOST} --prefix=${PREFIX} --enable-static --disable-shared
  make && make install
  cd ..
}

# Nettle ------------------------------------------------
make_nettle(){
  if [ ! -d "nettle-${NETTLE_VERSION}" ]; then
    wget https://ftp.gnu.org/gnu/nettle/nettle-${NETTLE_VERSION}.tar.gz
    tar xzf nettle-${NETTLE_VERSION}.tar.gz && rm -f nettle-${NETTLE_VERSION}.tar.gz
  fi
  cd nettle-${NETTLE_VERSION}
  make clean
  CFLAGS=-I${INCLUDE_DIR} LDFLAGS=-L${LIB_DIR} ./configure --host=${TARGET_HOST} --prefix=${PREFIX} --enable-static --disable-shared  
  make && make install
  cd ..
}

# gnuTLS ------------------------------------------------
make_gnutls(){
  if [ ! -d "gnutls-${GNUTLS_FULL_VERSION}" ]; then
    wget https://www.gnupg.org/ftp/gcrypt/gnutls/v${GNUTLS_VERSION}/gnutls-${GNUTLS_FULL_VERSION}.tar.xz
    tar xJf gnutls-${GNUTLS_FULL_VERSION}.tar.xz && rm -f gnutls-${GNUTLS_FULL_VERSION}.tar.xz
  fi
  cd gnutls-${GNUTLS_FULL_VERSION}
  make clean

  HOGWEED_CFLAGS="-I${INCLUDE_DIR}" HOGWEED_LIBS="-L${LIB_DIR} -lhogweed" \
  NETTLE_CFLAGS=-I${INCLUDE_DIR} NETTLE_LIBS="-L${LIB_DIR} -lnettle" \
  CFLAGS=-I${INCLUDE_DIR} LDFLAGS=-L${LIB_DIR} \
  ZLIB_CFLAGS=-I${ROUTER_FIRMWARE_SRC}/zlib/ ZLIB_LIBS="-L${ROUTER_FIRMWARE_SRC}/zlib -lz" \
  ./configure --host=${TARGET_HOST} --prefix=${PREFIX} --disable-crywrap --with-default-trust-store-file=/etc/ssl/certs/ca-certificates.crt  \
  --enable-static --disable-shared --with-included-libtasn1 --with-included-unistring --without-p11-kit --enable-local-libopts \
  --disable-documentation \
  PKG_CONFIG_PATH=${LIB_DIR}/pkgconfig

  make && make install
  cd ..
}

# libxml2 ------------------------------------------------
make_libxml2()
{
  if [ ! -d "libxml2" ]; then
    git clone https://github.com/GNOME/libxml2.git
  fi
  cd libxml2
  git reset --hard && git checkout master && git pull
  git checkout ${LIBXML2_VERSION}
  make clean
  ./autogen.sh --host=${TARGET_HOST} --prefix=${PREFIX} --without-c14n --without-catalog --without-debug --without-docbook --without-fexceptions --without-ftp --without-history --without-http --without-iso8859x --without-legacy --without-pattern --without-push --without-regexps --without-run-debug --without-sax1 --without-schemas --without-schematron --without-threads --without-valid --without-xinclude --without-xpath --without-xptr --without-zlib --without-lzma --without-coverage --without-python --enable-static --disable-shared
  make && make install
  cd ..
}

make_openconnect()
{
  if [ ! -d "openconnect" ]; then
    git clone git://git.infradead.org/users/dwmw2/openconnect.git
  fi
  cd openconnect
  git reset --hard && git pull
  git checkout master # ${OPENCONNECT_VERSION} # tagged version does not compile
  ./autogen.sh

  CFLAGS="-I${INCLUDE_DIR}" LDFLAGS="-L${LIB_DIR} -lgmp -lpthread -static -static-libgcc" \
  LIBLZ4_CFLAGS="-I${INCLUDE_DIR}" LIBLZ4_LIBS="-L${LIB_DIR} -l:liblz4.a" \
  NETTLE_CFLAGS="-I${INCLUDE_DIR}" NETTLE_LIBS="-L${LIB_DIR} -lnettle -lhogweed" \
  GNUTLS_CFLAGS=-I${INCLUDE_DIR} GNUTLS_LIBS="-L${LIB_DIR} -lgnutls" \
  ZLIB_CFLAGS=-I${ROUTER_FIRMWARE_SRC}/zlib/ ZLIB_LIBS="-L${ROUTER_FIRMWARE_SRC}/zlib -lz" \
  ./configure --prefix=/jffs --host=${TARGET_HOST}  --with-vpnc-script=/jffs/scripts/vpnc-script \
  --disable-nls --without-openssl --without-stoken --without-libpcsclite -without-libpskc --without-libproxy \
  PKG_CONFIG_PATH=${LIB_DIR}/pkgconfig

  make && make install DESTDIR=${PREFIX}
  cd ..
}
make_lz4 && make_gmp && make_nettle
make_libxml2
make_gnutls
make_openconnect

虽然脚本本身是一键式,但因为没有配置环境的部分,所以实际使用还需自行做些调整。另外静态链接以后可执行文件有9兆,所以自行strip一下,再用upx压缩一下就好了。后面给伸手党也提供了编译好的二进制包(384.5_0)。

Openconnect
Openconnect
openconnect.zip
855.1 KiB
35 Downloads
详细资料

1 一条评论

  1. 现在有更好的替代品了,openconnect实在是太慢了

发表评论

电子邮件地址不会被公开。 必填项已用*标注