如何使用 kcp+udp2raw 建立安全的隧道连接

0

本文需要用到 3个工具,在服务器和客户端都会用到,并且参数略有差异,这是本方案比较复杂的地方。

  • shadowsocks-libev
    轻量级的 socks 代理方案。
  • kcptun
    TCP转UDP流量工具,以消耗 20%-30% 的带宽为代价提高 40%-50% 的网速,实测远远不止。
  • Udp2raw-tunnel
    UDP 流量伪装工具。众所周知,较大的 UDP 流量会被网络安全设备封锁或屏蔽,此工具则是将 UDP 流量伪装成加密的正常 TCP/UDP/ICMP 流量,以避开 UDP 封锁和 QoS 审查。
    详细文档:Udp2raw-tunnel

借用一张Udp2raw的原图,说明本文的架构:

作者使用的是 openvpn,而我们使用的是 kcptun。一句话解释为:
在 vps 服务器端,使用 kcptun 将代理服务器的单链路流量转换成多链路的 UDP 流量,以提高网速;同时由于 UDP 流量容易被网络安全设备掐断,再使用 Udp2raw-tunnel 来将流量转换为TCP以实现正常传输。

在客户机的一端,则需要使用相反的流程来转换流量。

工具安装

VPS服务端和局域网linux服务器都需要安装以下工具。

  • shadowsocks-libev
    由于编译安装需要较多的依赖,我这里直接使用现成的 yum repo。

    cat > /etc/yum.repos.d/shadowsocks-epel-7.repo << EOF
    [librehat-shadowsocks]
    name=Copr repo for shadowsocks owned by librehat
    baseurl=https://copr-be.cloud.fedoraproject.org/results/librehat/shadowsocks/epel-7-\$basearch/
    type=rpm-md
    skip_if_unavailable=True
    gpgcheck=1
    gpgkey=https://copr-be.cloud.fedoraproject.org/results/librehat/shadowsocks/pubkey.gpg
    repo_gpgcheck=0
    enabled=1
    enabled_metadata=1
    EOF
    
    yum --enablerepo librehat-shadowsocks -y install shadowsocks-libev
  • kcptun

    VERSION=20190416
    curl -SLO https://github.com/xtaci/kcptun/releases/download/v${VERSION}/kcptun-linux-amd64-${VERSION}.tar.gz
    
    tar -C /usr/local/bin/ -xf kcptun-linux-amd64-${VERSION}.tar.gz
    mv /usr/local/bin/{client_linux_amd64,kcptun-client}
    mv /usr/local/bin/{server_linux_amd64,kcptun-server}
  • Udp2raw-tunnel

    VERSION=20181113.0
    curl -SLO https://github.com/wangyu-/udp2raw-tunnel/releases/download/${VERSION}/udp2raw_binaries.tar.gz
    tar -C /usr/local/bin/ -xf udp2raw_binaries.tar.gz
    mv /usr/local/bin/{udp2raw_amd64,udp2raw}
    rm -f /usr/local/bin/udp2raw_*
  • 环境变量设置

    echo "PATH=${PATH}:/usr/local/bin/" >> /etc/profile
    source /etc/profile

远程 VPS 服务器

PASSWORD=lpsKexa23WM1QbSeOB9l

nohup ss-server -s 127.0.0.1 -p 9441 -k ${PASSWORD} -m aes-256-gcm -t 300 > /var/log/ss-server.log 2>&1 &
nohup kcptun-server --target "127.0.0.1:9441" --listen "127.0.0.1:9442" --mode fast3 --mtu 1300 --key ${PASSWORD} --crypt "none" > /var/log/kcp-server.log 2>&1 &
nohup udp2raw -s -l 0.0.0.0:9443 -r 127.0.0.1:9442 -k ${PASSWORD} --raw-mode faketcp -a --cipher-mode xor --auth-mode simple > /var/log/udp2raw.log 2>&1 &

说明:
由于我们最终使用的是 udp2raw 来传输流量,只有 udp2raw 的流量会出现在公网上,需要为它配置合理的安全策略 —— 既保证流量的安全无特征,又要兼顾服务性能消耗。而其它工具的流量都在本机内部处理了,可以简化设置以降低开销。

  • --cipher-mode--auth-mode
    如果要最大的安全性建议用aes128cbc+hmac_sha1。如果要运行在路由器上,建议用xor+simple,可以节省CPU。但是注意xor+simple只能骗过防火墙的包检测,不能防止真正的攻击者。
  • --seq-mode
    facktcp模式并没有模拟tcp的全部。所以理论上有办法把faketcp和真正的tcp流量区分开来(虽然大部分ISP不太可能做这种程度的包检测)。seq-mode可以改变一些seq ack的行为。如果遇到了连接问题,可以尝试更改。在我这边的移动线路用3种模式都没问题。

本机所在局域网 linux 服务器

PASSWORD=lpsKexa23WM1QbSeOB9l
VPSSERVER=11.22.33.44

nohup udp2raw -c -l 127.0.0.1:9442 -r ${VPSSERVER}:9443 -k ${PASSWORD} --raw-mode faketcp -a --cipher-mode xor --auth-mode simple > /var/log/udp2raw.log 2>&1 &
nohup kcptun-client --remoteaddr "127.0.0.1:9442" --localaddr "127.0.0.1:9441" --conn 2 --mode fast3 --mtu 1300 --key ${PASSWORD} --crypt "none" > /var/log/kcp-client.log 2>&1 &
nohup ss-local -l 9443 -b 0.0.0.0 -s 127.0.0.1 -p 9441 -k ${PASSWORD} -m aes-256-gcm -t 300 > /var/log/ss-local.log 2>&1 &

注意:kcptun-server 服务端没有 --conn 参数。

本机浏览器

image

服务开机启动

脚本不完善,后续考虑使用 docker 和 docker-compose 来一键安装启动。

  • 服务端 vps
cat > /etc/rc.local << EOF
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

PASSWORD=lpsKexa23WM1QbSeOB9l

ss-server -s 127.0.0.1 -p 9441 -k \${PASSWORD} -m aes-256-gcm -t 300 > /var/log/ss-server.log 2>&1 &
kcptun-server --target "127.0.0.1:9441" --listen "127.0.0.1:9442" --mode fast3 --mtu 1300 --key \${PASSWORD} --crypt "none" > /var/log/kcp-server.log 2>&1 &
udp2raw -s -l 0.0.0.0:9443 -r 127.0.0.1:9442 -k \${PASSWORD} --raw-mode faketcp -a --cipher-mode xor --auth-mode simple > /var/log/udp2raw.log 2>&1 &

exit 0
EOF

chmod +x /etc/rc.local
systemctl restart rc-local
  • 局域网 linux
cat > /etc/rc.local << EOF
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

PASSWORD=lpsKexa23WM1QbSeOB9l
VPSSERVER=11.22.33.44

udp2raw -c -l 127.0.0.1:9442 -r \${VPSSERVER}:9443 -k \${PASSWORD} --raw-mode faketcp -a --cipher-mode xor --auth-mode simple > /var/log/udp2raw.log 2>&1 &
kcptun-client --remoteaddr "127.0.0.1:9442" --localaddr "127.0.0.1:9441" --conn 2 --mode fast3 --mtu 1300 --key \${PASSWORD} --crypt "none" > /var/log/kcp-client.log 2>&1 &
ss-local -l 9443 -b 0.0.0.0 -s 127.0.0.1 -p 9441 -k \${PASSWORD} -m aes-256-gcm -t 300 > /var/log/ss-local.log 2>&1 &

exit 0
EOF

chmod +x /etc/rc.local
systemctl restart rc-local

参考文档:

你可能感兴趣的

载入中...