OpenWRT IKEv2 + Tinc远程管理

前言

远程管理实验室的路由器。路由器不是通过ADSL上网,因此无法使用DDNS方式进行解析。

构思的方案为:

  • 云服务器A路由器B之间配置tinc VPN,因此云服务器A可以通过tinc VPN访问路由器B
  • 云服务器A配置为IKEv2 VPN服务器,终端设备C登录该IKEv2 VPN, 然后访问路由器B
图1-1 拓扑图

云服务器A配置

tinc VPN配置

关于tinc VPN更多的配置,参考官方网站https://www.tinc-vpn.org/

脚本变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
## variables

# tinc.conf
# NET_NAME 网络名字 例如 NET_NAME="tinc"
# NODE_NAME 节点名字 例如 NODE_NAME="aliyun"
# PORT 使用端口 例如 PORT="6565"
# INTERFACE 虚拟网卡名字 例如 INTERFACE="tun0"
# CONNECT_TO 连接到的节点 空格分割 如 CONNECT_TO="netgear onion"

NET_NAME="tinc"
NODE_NAME="aliyun"
PORT="6565"
INTERFACE="tun0"
CONNECT_TO="netgear"

# tinc-up
# TUNNEL_IP 虚拟网卡IP地址 例如 TUNNEL_IP="172.16.1.10"
# ROUTES 需要路由的条路 使用空格分割 例如 ROUTES="192.168.1.0/24 192.168.2.10/24 192.168.3.0/24"

TUNNEL_IP="172.16.1.100"
ROUTES="192.168.2.0/24"

# hosts
# SUBNETS 宣告的本地路由条目 使用空格分割 例如 SUBNETS="10.10.10.0/24 10.10.20.0/24"
# IP_ADDR 连接tinc使用的IP地址, 例如 IP_ADDR="1.2.3.4"

SUBNETS=""
IP_ADDR="112.113.114.115"

# vpn
# VIRTUAL_SUBNET VPN使用的虚拟ip地址 例如 VIRTUAL_SUBNET="192.168.81.0/24"

VIRTUAL_SUBNET="192.168.81.0/24"

source变量文件,然后安装并创建配置文件

1
2
3
4
5
6
7
8
yum install tinc -y

mkdir -p /etc/tinc/${NET_NAME}/hosts

cd /etc/tinc/${NET_NAME}
touch tinc.conf
touch tinc-up tinc-down
chmod u+x tinc-*

编辑tinc.conf文件

1
2
3
4
5
6
7
8
9
10
cat <<EOF >> tinc.conf
Name = ${NODE_NAME}
Port = ${PORT}
Interface = ${INTERFACE}
EOF

for CONNECT in ${CONNECT_TO}
do
echo "ConnectTo = $CONNECT" >> tinc.conf
done

编辑tinc-up文件

1
2
3
4
5
6
7
8
9
10
11
12
cat <<EOF >> tinc-up
#/bin/bash

IP=${TUNNEL_IP}
ip link set \$INTERFACE up
ip addr add \$IP dev \$INTERFACE
EOF

for ROUTE in ${ROUTES}
do
echo "ip route add ${ROUTE} dev \$INTERFACE" >> tinc-up
done

编辑tinc-down文件

1
2
3
4
5
cat <<EOF >> tinc-down
#!/bin/bash

ip link set \$INTERFACE down
EOF

生成密钥

1
tincd -n ${NET_NAME} -K

修改生成后的公钥文件,添加自己的IP地址${IP_ADDR}、使用端口${PORT}、虚拟机接口使用的IP地址${TUNNEL_IP}、以及其他需要宣告的子网${SUBNETS}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cd hosts
mv ${NODE_NAME} ${NODE_NAME}.bak
touch ${NODE_NAME}

cat <<EOF >> ${NODE_NAME}
Address = ${IP_ADDR}
Port = ${PORT}
Subnet = ${TUNNEL_IP}/32
EOF

for SUBNETS in ${SUBNETS}
do
echo "Subnet = ${SUBNETS}" >> ${NODE_NAME}
done

cat ${NODE_NAME}.bak >> ${NODE_NAME}

mkdir /root/tinc_hosts_backup
mv ${NODE_NAME}.bak /root/tinc_hosts_backup

复制路由器B的tinc VPN公钥文件到/etc/tinc/${NET_NAME}/hosts目录下,因为路由器B WAN接口的IP为私有IP地址段,所以删除公钥中Address字段

添加iptables条目,开放相应的端口${PORT},同时将IKEv2 VPN虚拟机网络${VIRTUAL_SUBNET}通过对tinc VPN虚拟端口${INTERFACE}的NAT方式,访问路由器B

1
2
3
4
iptables -I INPUT 2 -p tcp --dport ${PORT} -j ACCEPT
iptables -I INPUT 2 -p udp --dport ${PORT} -j ACCEPT
iptables -A POSTROUTING -s ${VIRTUAL_SUBNET} -o ${INTERFACE} -j MASQUERADE
iptables-save > /etc/sysconfig/iptables

启动服务

1
2
3
4
5
## CentOS 7
systemctl start tinc@${NET_NAME}

## CentOS 6
tinc -n ${NET_NAME}

IKEv2 VPN配置

参考《CentOS 6.x/7.x Strongswan 5.5.1编译安装 + Freeradius验证

注意控制leftsubnet字段,该字段自定了VPN接入设备可以访问哪些网络!

这里定义为leftsubnet = 192.168.2.0/24

路由器B配置

具体配置参考《OpenWRT Tinc配置

修改当前tinc VPN配置步骤

  • 添加云服务器A的tinc VPN公钥路由器B
  • 修改配置文件/etc/config/tinc,添加连接到云服务器A的条目
  • 重启tinc VPN服务

接入终端C配置

配置IKEv2 VPN,参考《IKEv2 用户配置手册(图文版)v2


修订版本信息

修订版本 时间 备注
文档创建 2017/12/11 文档
修改1 2017/12/20 添加配图

参考