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)。
RT-AC5300可以用嗎?
你自己按我这个去编译的话是可以的,但是这东西很慢,没啥实用意义。
路由器上老老实实用SS吧。何况ac5300的cpu性能还不如ac86。
请问是什么替代品?
wireguard
但路由器上只有AC86U能用
现在有更好的替代品了,openconnect实在是太慢了
centos的openconnect客户端有办法分流吗?我只想让某个内网IP走VPN。
可以的,策略路由,类似的文章一搜一大堆,总之就是用iptables给来自于内网IP A的数据包打个标记,然后所有某标记的数据包走路由表A,路由表A的默认路由是openconnect的虚拟网卡,就可以了。