我相信在实际工作或业务需求中会遇到第三方服务调用需求,比如googleapis、github服务需求或其它第三方服务API对接场景。这里基于开源的轻量级 VPN 工具 tinc 建立点到点之间的隧道技术及路由,实现流量转发。 因考虑到网上关于 Tinc 这方面的文档比较少,前期也有部署过代理方式来实现,在此实践过程碰到不少的问题与配置尝试,记录本文作为个人关于 Tinc 工具的路由模式的基础配置案例指南,以备未来的学习与参考之用。
注:本实践涉及了路由、iptables SNAT、vpn 技术基础知识的应用,具备相关知识背景将有助于背后原理的理解。
实践架构示意图
image-20220628180203013.png注:服务器端需要有绑定外网IP(云服务如eip)并开放655端口用于tinc客户端t连接
Tinc 安装
# Ubuntu
apt install -y tinc
#Centos
yum install -y tinc
# 创建配置目录
mkdir -p /etc/tinc/<目录名>/hosts #如 switchcenter / client01
cd /etc/tinc/<目录名>/
# 证书创建 (注:在配置文件都配置好后再执行证书创建命令)
tincd -n <目录名> -K #如 switchcenter / client01
服务器端配置
# tinc.conf
Name = switchcenter
Interface = tun0
Forwarding = kernel
# tinc-up
#!/bin/bash
ifconfig $INTERFACE 10.100.100.1 netmask 255.255.255.0
# tinc-down
#!/bin/bash
ifconfig $INTERFACE down
# hosts/switchcenter
Address = x.x.x.x #Internet_ip
Subnet = 0.0.0.0/0 #必须指定为0/0
-----BEGIN RSA PUBLIC KEY-----
... .... # COPY 已创建的服务器证书
-----END RSA PUBLIC KEY-----
# tincd -n switchcenter -K
# hosts/client01
[switchcenter]# cat
Subnet = 10.100.100.2/32
-----BEGIN RSA PUBLIC KEY-----
... ... # COPY 已创建的客户端证书
-----END RSA PUBLIC KEY-----
配置文件列表
#/etc/tinc/switchcenter/
[switchcenter]# ls
hosts nets.boot rsa_key.priv rsa_key.pub tinc.conf tincd.log tinc-down tinc-up
[client01]# ls hosts
switchcenter client01
服务器端 Tinc 服务启动
nohup tincd -n switchcenter -D >> tincd.log 2>&1 &
客户端配置
# tinc.conf
Name = client01
Interface = tun0
ConnectTo = switchcenter
Forwarding = kernel
# tinc-up
#!/bin/bash
ifconfig $INTERFACE 10.100.100.2 netmask 255.255.255.0
ip route add 142.250.0.0/16 dev $INTERFACE # 按需添加访问目标路由,如googleapis.com
ip route add 142.251.0.0/16 dev $INTERFACE
ip route add 172.217.0.0/16 dev $INTERFACE
#------------------------下面各文件内容与服务器端一致---------------------------------
# tinc-down
#!/bin/bash
ifconfig $INTERFACE down
#hosts/switchcenter
Address = x.x.x.x #Internet_ip
Subnet = 0.0.0.0/0 #必须指定为0/0
-----BEGIN RSA PUBLIC KEY-----
... ....
-----END RSA PUBLIC KEY-----
# tincd -n client01 -K
#hosts/client01
[switchcenter]# cat
Subnet = 10.100.100.2/32
-----BEGIN RSA PUBLIC KEY-----
... ...
-----END RSA PUBLIC KEY-----
配置文件列表
#/etc/tinc/client01/
[client01]# ls
hosts nets.boot rsa_key.priv rsa_key.pub tinc.conf tincd.log tinc-down tinc-up
[client01]# ls hosts
switchcenter client01
客户端 Tinc 服务启动
nohup tincd -n client01 -D >> tincd.log 2>&1 &
Server端添加 SNAT 和 开启内核流量转发
iptables 增加 SNAT 策略
# eth0为外网通信接口
iptables -t nat -A POSTROUTING -o eth0 -s 10.100.100.0/24 -j MASQUERADE
开启系统内核流量转发
echo 1 > /proc/sys/net/ipv4/ip_forward
验证
[client01]# ping www.googleapis.com
PING www.googleapis.com (172.217.160.106) 56(84) bytes of data.
64 bytes from tsa03s06-in-f10.1e100.net (172.217.160.106): icmp_seq=1 ttl=58 time=31.8 ms
64 bytes from tsa03s06-in-f10.1e100.net (172.217.160.106): icmp_seq=2 ttl=58 time=31.8 ms
64 bytes from tsa03s06-in-f10.1e100.net (172.217.160.106): icmp_seq=3 ttl=58 time=32.6 ms
^C
--- www.googleapis.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 31.846/32.126/32.673/0.438 ms
[switchcenter]# tcpdump -i tun0 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
17:42:40.882253 IP 10.100.100.2 > 172.217.160.106: ICMP echo request, id 28554, seq 1, length 64
17:42:40.898855 IP 172.217.160.106 > 10.100.100.2: ICMP echo reply, id 28554, seq 1, length 64
17:42:41.882887 IP 10.100.100.2 > 172.217.160.106: ICMP echo request, id 28554, seq 2, length 64
17:42:41.899462 IP 172.217.160.106 > 10.100.100.2: ICMP echo reply, id 28554, seq 2, length 64
17:42:42.884483 IP 10.100.100.2 > 172.217.160.106: ICMP echo request, id 28554, seq 3, length 64
17:42:42.901043 IP 172.217.160.106 > 10.100.100.2: ICMP echo reply, id 28554, seq 3, length 64
总结
通过 Tinc vpn 工具将点到点 Tunnel 建立后,client 端通过路由方式将“感兴趣”的流量发往 tunnel 另一端server,Server 端通过 SNAT 源地址转换方式访问目标网络(外网)。当然基于需求可以再深入定制 Client 端的路由策略与条目,比如将内部网络建立明细路由,将0/0默认路由全转发至Server。
网友评论