美文网首页
基于 Tinc 流量转发实践

基于 Tinc 流量转发实践

作者: Xiao_Yang | 来源:发表于2022-06-29 09:31 被阅读0次

    我相信在实际工作或业务需求中会遇到第三方服务调用需求,比如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。

    相关文章

      网友评论

          本文标题:基于 Tinc 流量转发实践

          本文链接:https://www.haomeiwen.com/subject/gxjtbrtx.html