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的虚拟网卡,就可以了。