tinc国内服务器访问国外

tinc实现国内服务器通过国外服务器访问外网

本文操作的国外vps是美国的buyvm.net购买的,特点就是不限带宽,不限流量,购买链接
国内服务器建议使用: 腾讯云vps(新用户便宜)

目标:有两个服务器:国内服务器A,外网地址:111.111.111.111;国外服务器B,外网地址:222.222.222.222
实现:A和B用tinc打通,A发起通过B访问国外,A本身提供的服务不受影响。
tinc的网络,给服务器A配的地址:10.0.0.1,给服务器B配的地址:10.0.0.254

安装(在两个机器上同样的步骤):
apt-get install tinc -y
自己起网络名称:tinc0
mkdir -p /etc/tinc/tinc0/hosts

—————- 国外服务器A操作 —————-

创建配置文件
1.建立网络配置目录(网络名称为 tinc0):
sudo mkdir -p /etc/tinc/tinc0/hosts
2.建立配置文件 tinc.conf
sudo vi /etc/tinc/tinc0/tinc.conf
编辑 tinc.conf 内容如下:

Name = guowai
Interface = tinc0
AddressFamily = ipv4

由于本主机为核心主机,只负责等待和认证其他主机的连接。因此,本主机没有配置 ConnectTo。
3.建立启动和关闭脚本 创建启动脚本 tinc-up
sudo vi /etc/tinc/tinc0/tinc-up
编辑 tinc-up 内容如下:
!/bin/sh
ifconfig $INTERFACE 10.0.0.254 netmask 255.255.255.0

创建启动脚本 tinc-down
sudo vi /etc/tinc/tinc0/tinc-down
编辑 tinc-down 内容如下:
!/bin/sh
ifconfig $INTERFACE down

赋予脚本可执行权限:
sudo chmod +x /etc/tinc/tinc0/tinc-up
sudo chmod +x /etc/tinc/tinc0/tinc-down
4.创建本主机描述文件(网络名称为 guowai)
sudo vi /etc/tinc/tinc0/hosts/guowai
编辑 tinc_us 内容如下:
Address = 222.222.222.222
Subnet = 0.0.0.0/0

密钥一路回车:tincd -n tinc0 -K
会在/etc/tinc/tinc0/hosts/guowai文件中自动加入密钥,把 /etc/tinc/tinc0/hosts/guowai 拷贝到 国内服务器的 /etc/tinc/tinc0/hosts/目录中。

目录结构
.
├── tinc0
│   ├── hosts
│   │   ├── guonei
│   │   └── guowai
│   ├── rsa_key.priv
│   ├── tinc.conf
│   ├── tinc-down
│   └── tinc-up
└── nets.boot
root@hk:/etc/tinc# cat nets.boot 
tinc0

root@hk:/etc/tinc/tinc0# cat tinc.conf 
Name = guowai
Interface = tinc0
AddressFamily = ipv4

root@hk:/etc/tinc/tinc0# cat tinc-up 
#!/bin/sh
ifconfig $INTERFACE 10.0.0.254 netmask 255.255.0.0

root@hk:/etc/tinc/tinc0# cat tinc-down 
#!/bin/sh
ip link set $INTERFACE down

给执行权限:
chmod 755 /etc/tinc/tinc0/tinc-*
root@hk:/etc/tinc/tinc0/hosts# cat guonei 
Address = 111.111.111.111
Subnet = 10.0.0.1/32
-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----
root@hk:/etc/tinc/tinc0/hosts# cat guowai 
Address = 222.222.222.222
Subnet = 0.0.0.0/0
-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----
启动tinc服务:
systemctl start tinc@tinc0

—————- 以下为国内服务器B操作 —————-

创建配置文件
1.建立网络配置目录(网络名称为 tinc0):
sudo mkdir -p /etc/tinc/tinc0/hosts
2.建立配置文件 tinc.conf
sudo vi /etc/tinc/tinc0/tinc.conf
编辑 tinc.conf 内容如下:

Name = guonei
Interface = tinc0
AddressFamily = ipv4
ConnectTo = guowai  #这里要加连接到国外的网络名称

本主机要配置 ConnectTo 到国外。
3.建立启动和关闭脚本 创建启动脚本 tinc-up
sudo vi /etc/tinc/tinc0/tinc-up
编辑 tinc-up 内容如下:

#!/bin/sh
ifconfig $INTERFACE 10.0.0.1 netmask 255.255.255.0
ip route add 222.222.222.222 via 10.0.0.1 dev eth0
ip route add 10.0.0.0/24 dev $INTERFACE
ip route add 0.0.0.0/1 dev $INTERFACE
ip route add 128.0.0.0/1 dev $INTERFACE
cp /etc/resolv_vpn.conf /etc/resolv.conf

创建启动脚本 tinc-down
sudo vi /etc/tinc/tinc0/tinc-down

#!/bin/sh
ip link set $INTERFACE down
ip route del 222.222.222.222 via 10.0.0.1 dev eth0
ip route del 10.0.0.0/24 dev $INTERFACE
ip route del 0.0.0.0/1 dev $INTERFACE
ip route del 128.0.0.0/1 dev $INTERFACE
cp /etc/resolv_qcloud.conf /etc/resolv.conf

赋予脚本可执行权限:
sudo chmod +x /etc/tinc/tinc0/tinc-up
sudo chmod +x /etc/tinc/tinc0/tinc-down
4.创建本主机描述文件(网络名称为 guonei)
sudo vi /etc/tinc/tinc0/hosts/guonei
Address = 111.111.111.111
Subnet =
10.0.0.1/32

密钥一路回车:tincd -n tinc0 -K
会在/etc/tinc/tinc0/hosts/guonei文件中自动加入密钥,把 /etc/tinc/tinc0/hosts/guonei 拷贝到 国外服务器的 /etc/tinc/tinc0/hosts/目录中。

此时已经安装完tinc,目录结构如下:
root@VM-0-14-ubuntu:/etc/tinc# tree .
.
├── tinc0
│   ├── hosts
│   │   ├── guonei
│   │   └── guowai
│   ├── rsa_key.priv
│   ├── tinc.conf
│   ├── tinc-down
│   └── tinc-up
└── nets.boot

2 directories, 7 files

root@VM-0-14-ubuntu:/etc/tinc# cat nets.boot 
tinc0

root@VM-0-14-ubuntu:/etc/tinc/tinc0# cat tinc.conf 
Name = guonei
Interface = tinc0
AddressFamily = ipv4
ConnectTo = guowai

root@VM-0-14-ubuntu:/etc/tinc/tinc0# cat tinc-up 
#!/bin/sh
ifconfig $INTERFACE 10.0.0.1 netmask 255.255.255.0
ip route add 222.222.222.222 via 10.0.0.1 dev eth0
ip route add 10.0.0.0/24 dev $INTERFACE
ip route add 0.0.0.0/1 dev $INTERFACE
ip route add 128.0.0.0/1 dev $INTERFACE
cp /etc/resolv_vpn.conf /etc/resolv.conf

root@VM-0-14-ubuntu:/etc/tinc/tinc0# cat tinc-down 
#!/bin/sh
ip link set $INTERFACE down
ip route del 222.222.222.222 via 10.0.0.1 dev eth0
ip route del 192.168.0.0/24 dev $INTERFACE
ip route del 0.0.0.0/1 dev $INTERFACE
ip route del 128.0.0.0/1 dev $INTERFACE
cp /etc/resolv_qcloud.conf /etc/resolv.conf

给执行权限:
chmod 755 /etc/tinc/tinc0/tinc-*

root@VM-0-14-ubuntu:/etc/tinc/tinc0/hosts# cat guonei 
Address = 111.111.111.111
Subnet = 10.0.0.1/32
-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----

root@VM-0-14-ubuntu:/etc/tinc/tinc0/hosts# cat guowai 
Address = 222.222.222.222
Subnet = 0.0.0.0/0
-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----

启动服务:
systemctl start tinc@tinc0
能ping通 10.0.0.254 ,说明tinc就打通了。

如果你启动服务后服务器就断网了,可能是因为回包不对称导致,访问111.111.111.111,回包走了tinc0,具体可以通过tcpdump -i any | grep ip 来判断下。
这种情况说明你本地默认路由没有配置好,在ubuntu22.04情况下,要严格配置eth0网卡路由根据来源ip进行路由策略,哪来哪去。
参考:https://moneyslow.com/%E8%85%BE%E8%AE%AF%E4%BA%91%E9%98%BF%E9%87%8C%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%A4%9A%E4%B8%AA%E7%BD%91%E5%8D%A1%E9%85%8D%E7%BD%AE%E5%A4%9A%E4%B8%AA%E5%85%AC%E7%BD%91ip.html
重点是 /etc/netplan/50-cloud-init.yaml 这部分:

            routes:
                    - to: 0.0.0.0/0 # 路由的目标地址。
                      via: 10.0.8.1 # 为通过路由的流量设置源 IP 地址。(网关)
                      table: 100 # eth0对应的路由表
            routing-policy:
                    - from: 10.0.8.2 # 主网卡私网ip,设置源 IP 地址以匹配此策略规则的流量。
                      table: 100 # 路由表编号
                      priority: 300 # 指定路由策略规则的优先级,以影响处理路由规则的顺序。
                                    # 数字越大,优先级越低:规则按优先级数字递增的顺序处理。

如果上面问题解决,可以启动tinc服务,可以继续:
在A上直接ping google.com,你可能因为dns的问题遇到困难,在ubuntu22.04操作系统下,有点麻烦,我们需要修改本机的dns设置
参考文章:https://moneyslow.com/ubuntu22-04%E4%B8%8Bdns%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%9C%B0%E5%9D%80127-0-0-53-%E5%92%8C-masquerade-%E7%9A%84%E7%9F%9B%E7%9B%BE.html

这里做了点取巧,在启动tinc-up的状态下,用8.8.8.8这个dns,你会看到上面tinc-up脚本里有一行:
cp /etc/resolv_vpn.conf /etc/resolv.conf
关闭tinc-down的情况下,恢复使用本机原来的dns,你会看到上面tinc-down脚本里有一行:
cp /etc/resolv_qcloud.conf /etc/resolv.conf

root@VM-8-2-ubuntu:~# cat /etc/resolv_vpn.conf 
nameserver 8.8.8.8
options edns0 trust-ad
search .
root@VM-8-2-ubuntu:~# cat /etc/resolv_qcloud.conf 
nameserver 183.60.83.19
nameserver 183.60.82.98
options edns0 trust-ad
search .

几点注意:
1、在hosts目录下,国外机器描述文件(/etc/tinc/tinc0/hosts/guowai)中,要有 Subnet = 0.0.0.0/0
2、国外服务器A开启snat:iptables -t nat -A POSTROUTING -j MASQUERADE
需要将所有的流量出去的时候,源地址都要snat为本机公网地址,手动执行:
iptables -t nat -A POSTROUTING -j MASQUERADE
3、注意国外服务器A的/etc/sysctl.conf 文件,要有net.ipv4.ip_forward=1

不同网卡出去的公网ip的shell脚本:

echo "default"
curl ifconfig.me
echo ""
echo "tinc0" 
curl --interface tinc0 ifconfig.me
echo ""
echo "eth0"
curl --interface eth0 ifconfig.me
echo ""

执行结果:

root@VM-8-2-ubuntu:~# ./curl.sh 
default
222.222.222.222
tinc0
222.222.222.222
eth0
111.111.111.111

接下来,你就可以拨号到guonei上来了,遨游世界:
https://moneyslow.com/2023%e5%b9%b4%e9%85%8d%e7%bd%aestrongswan-on-ubuntu-22-04.html

如果实现启动多个实例连接到多个vpn master server,则必须在主机配置文件中增加端口,不然会报端口冲突错误,参考:
《tinc启动多个实例报错Can’t bind to 0.0.0.0 port 655/tcp: Address already in use》