如何在Ubuntu Linux 16.04 LTS上安装Tinc VPN
如何保护在设计上不安全的专用网络之间流动的流量,并且由于设置复杂而不想使用OpenVPN。
如何在Ubuntu Linux 16.04 LTS服务器上安装和设置Tinc VPN服务器并保护通过VPN的流量?
tinc是虚拟专用网络(VPN)服务器,使用隧道和加密在Internet上的主机或专用不安全LAN上的主机之间创建安全的专用网络。
tinc是一个免费软件,并根据GNU通用公共许可版本2或更高版本获得许可。
tinc具有以下功能:
- 易于设置
- 加密,认证和压缩
- 自动全网格路由
- NAT遍历
- 轻松扩展您的VPN
- 桥接以太网段的能力
- 在许多操作系统上运行并支持IPv6,包括Linux,FreeBSD,OpenBSD,NetBSD,OS X,Solaris,Windows 2000,XP,Vista和Windows 7/8/10。
本教程向您展示如何在Ubuntu Linux 16.04 LTS服务器上安装tinc,以及如何在通过Internet连接或在云设置中运行的专用LAN连接的两个节点之间创建安全的VPN。
如何在Ubuntu上安装Tinc VPN
我们使用以下apt-get命令或apt命令将tinc安装在serverA和serverB
上:
$ sudo apt update $ sudo apt upgrade $ sudo apt install tinc
输出示例:
Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: tinc 0 upgraded, 1 newly installed, 0 to remove and 7 not upgraded. Need to get 165 kB of archives. After this operation, 655 kB of additional disk space will be used. Get:1 http://archive.ubuntu.com/ubuntu xenial/universe amd64 tinc amd64 1.0.26-1 [165 kB] Fetched 165 kB in 1s (85.6 kB/s) Selecting previously unselected package tinc. (Reading database ... 42846 files and directories currently installed.) Preparing to unpack .../tinc_1.0.26-1_amd64.deb ... Unpacking tinc (1.0.26-1) ... Processing triggers for systemd (229-4ubuntu17) ... Processing triggers for ureadahead (0.100.0-19) ... Processing triggers for man-db (2.7.5-1) ... Processing triggers for install-info (6.1.0.dfsg.1-5) ... Setting up tinc (1.0.26-1) ... Processing triggers for systemd (229-4ubuntu17) ... Processing triggers for ureadahead (0.100.0-19) ...
在serverA上进行tinc配置
仅以root用户身份在serverA
上执行以下命令。
步骤1:在serverA
上创建目录
执行以下mkdir命令:
$ sudo mkdir -p /etc/tinc/vpn0/hosts/
步骤2:在serverA
上创建配置文件
输入以下vi命令:
$ sudo vi /etc/tinc/vpn0/tinc.conf
追加以下内容:
Name = serverA Device = /dev/net/tun BindToAddress = 192.168.4.5 AddressFamily = ipv4
步骤3:为serverA
创建公用密钥和专用密钥
$ sudo tincd -n vpn0 -K4096
输出示例:
Generating 4096 bits keys: ........................................................................... .........................................................................++ q Done. Please enter a file to save private RSA key to [/etc/tinc/vpn0/rsa_key.priv]: Please enter a file to save public RSA key to [/etc/tinc/vpn0/hosts/serverA]:
步骤4:将IP地址设置为在serverA
上创建的主机文件
$ sudo vi /etc/tinc/vpn0/hosts/serverA
在文件顶部添加以下内容:
Address = 192.168.4.5 Subnet = 172.16.1.1/32 -----BEGIN RSA PUBLIC KEY---- ..... ... your random key here .... -----END RSA PUBLIC KEY----
步骤5:在serverA
上创建网络接口控制脚本
创建一个补全脚本:
$ sudo vi /etc/tinc/vpn0/tinc-up
追加以下内容:
#!/bin/sh # # Must use IP 172.16.1.1, which is setup in /etc/tinc/vpn0/hosts/serverA # /sbin/ifconfig $INTERFACE 172.16.1.1 netmask 255.255.255.0
创建一个下调脚本:
$ sudo vi /etc/tinc/vpn0/tinc-down
追加以下内容:
#!/bin/sh /sbin/ifconfig $INTERFACE down
最后使用chmod命令设置可执行权限:
$ sudo chmod -v +x /etc/tinc/vpn0/tinc-{up,down}
第6步:更新serverA
上的防火墙规则
执行以下ufw命令以打开端口tcp 655:
$ sudo ufw allow from 192.168.4.6 to 192.168.4.5 port 655 proto tcp comment 'Allow serverA tincd to talk vpn client'
执行以下ufw命令以打开端口udp 655:
$ sudo ufw allow from 192.168.4.6 to 192.168.4.5 port 655 proto udp comment 'Allow serverA tincd to talk vpn client'
您必须允许使用vpn0隧道在两个IP地址集之间进行vpn通信:
$ sudo ufw allow from 172.16.1.2 to 172.16.1.1 comment 'Allow serverB to talk serverA fully'
在serverB上进行tinc配置
仅以root用户身份在serverA
上执行以下命令。
步骤1:在serverB
上创建目录
执行以下mkdir命令:
$ sudo mkdir -p /etc/tinc/vpn0/hosts/
步骤2:在serverB
上创建配置文件
输入以下vi命令:
$ sudo vi /etc/tinc/vpn0/tinc.conf
追加以下内容:
Name = serverB Device = /dev/net/tun ConnectTo = serverA BindToAddress = 192.168.4.6 AddressFamily = ipv4
步骤3:为serverB
创建公钥和私钥
$ sudo tincd -n vpn0 -K4096
输出示例:
Generating 4096 bits keys: ........................................................................... .........................................................................++ q Done. Please enter a file to save private RSA key to [/etc/tinc/vpn0/rsa_key.priv]: Please enter a file to save public RSA key to [/etc/tinc/vpn0/hosts/serverB]:
步骤4:将IP地址设置为在serverB
上创建的主机文件
$ sudo vi /etc/tinc/vpn0/hosts/serverB
在文件顶部添加以下内容:
Subnet = 172.16.1.2/32 -----BEGIN RSA PUBLIC KEY---- ..... ... your random key here .... -----END RSA PUBLIC KEY----
第5步:在serverB
上创建网络接口控制脚本
创建一个补全脚本:
$ sudo vi /etc/tinc/vpn0/tinc-up
追加以下内容:
#!/bin/sh # # Must use IP 172.16.1.2, which is setup in /etc/tinc/vpn0/hosts/serverB # /sbin/ifconfig $INTERFACE 172.16.1.2 netmask 255.255.255.0
创建一个下调脚本:
$ sudo vi /etc/tinc/vpn0/tinc-down
追加以下内容:
#!/bin/sh /sbin/ifconfig $INTERFACE down
最后,使用chmod命令设置可执行权限:
$ sudo chmod -v +x /etc/tinc/vpn0/tinc-{up,down}
第6步:更新serverB
上的防火墙规则
执行以下ufw命令以打开端口tcp 655:
$ sudo ufw allow from 192.168.4.5 to 192.168.4.6 port 655 proto tcp comment 'Allow serverB tincd to talk to serverA'
执行以下ufw命令以打开端口udp 655:
$ sudo ufw allow from 192.168.4.5 to 192.168.4.6 port 655 proto udp comment 'Allow serverB tincd to talk to serverA'
您必须允许使用vpn0隧道在两个IP地址集之间进行vpn通信:
$ sudo ufw allow from 172.16.1.1 to 172.16.1.2 comment 'Allow serverA to talk serverB fully'
合并的步骤7:您必须将主机文件复制到其他主机
您必须将/etc/tinc/vpn0/hosts/serverA复制到serverB。
使用scp命令(在serverA上执行命令):
$ scp /etc/tinc/vpn0/hosts/serverA Hyman@serverB:/tmp/ $ ssh -t Hyman@serverB sudo mv -v /tmp/serverA /etc/tinc/vpn0/hosts/
您必须将/etc/tinc/vpn0/hosts/serverB复制到serverA。
使用scp命令(在serverB上执行命令):
$ scp /etc/tinc/vpn0/hosts/serverB Hyman@serverA:~/ $ ssh -t Hyman@serverA sudo mv -v /tmp/serverB /etc/tinc/vpn0/hosts/
合并的步骤8:启用并启动tinc服务(在serverA和serverB上均执行)
执行以下命令以使用sudo命令将vpn0服务追加到/etc/tinc/nets.boot文件:
$ echo 'vpn0' | sudo tee -a /etc/tinc/nets.boot
启用它:
$ sudo systemctl enable tinc
重新启动它:
$ sudo systemctl restart tinc
验证一下:
$ ps aux | grep tincd
输出示例:
root 2334 0.0 0.0 15724 2940 ? Ss 16:40 0:04 /usr/sbin/tincd -n vpn0
确保端口已打开:
$ netstat -tulpn | grep tincd
来自serverA的输出示例:
tcp 0 0 192.168.4.5:655 0.0.0.0:* LISTEN 22334/tincd udp 0 0 192.168.4.5:655 0.0.0.0:* 22334/tincd
使用ping命令将ICMP ECHO_REQUEST发送到网络主机,以验证vpn是否正常工作:
$ ping 172.16.1.1 $ ping 172.16.1.2
现在,您可以修改sshd和mysqld守护程序/服务以侦听172.16.1.1或172.16.1.2,以仅接受来自VPN主机的流量。
例如,在serverA上编辑/etc/sshd/sshd_config以侦听LAN,VPN和公共IP地址:
# listen to LAN, VPN, and Public IP ListenAddress 192.168.4.5 ListenAddress 172.16.1.1 ListenAddress 192.54.3.5
并重新加载sshd服务:
$ sudo systemctl reload ssh