相关文章推荐
乖乖的玉米  ·  PGSQL创建自增的id-- ...·  1 年前    · 
玩命的脸盆  ·  python - ...·  1 年前    · 

站点到站点的VPN网络

实验需求:现在需要不同局域网之间的服务器能够进行通信,并且是通过安全的加密通道实现,并在Linux中启用路由功能,通过安全隧道进行包的转发,从而实现两个网络的连接。

实验环境:两台Linux服务器,每一台Linux服务器上由两块网卡,其中一块网卡需要和互联网连接一起,这也就是WAN接口的作用。其次在每一台Linux服务器上启用路由功能来扮演路由器的功能。VPN的隧道IP就是10.200.0.0/24。内网IP就是172.16.11.0/24,172.16.12.0/24网端,LAN接口的IP是内网网关。最后就是每个网段都由一个客户端,最终实现不同网段之间的互通。

实验规划:

VPN服务器 WAN TUN LAN
VPN1 192.168.9.130 10.200.0.1 192.168.16.1(充当网关)
VPN2 192.168.9.132 10.200.0.2 192.168.17.1(充当网关)
client1(不可访问外网) 192.168.16.10
client2(不可访问外网) 192.168.17.10

前面的节点创建,IP配置不在演示,(但是要注意一点:网络模式是host only的不需要设置网关,这个也是我一直的误区。)这里开始从将VPN1开启路由记录:

1、开启节点路由功能:

#临时启用
echo 1 > /proc/sys/net/ipv4/ip_forward
#永久启动
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
#检查是否启动

2、创建配置文件

dev tun
proto udp 
local 192.168.9.130
lport 1194
remote 192.168.9.132
rport 1194
secret aa.key
ifconfig 10.200.0.1 10.200.0.2 
user nobody
group nobody
persist-tun 
persist-key
keepalive 10 60
ping-timer-rem 
verb 3
daemon                                 #OpenVPN在所有初始化完成之后,会变成一个后台运行的守护进程
log-append /tmp/openvpn.log            #参数指定在记录在日志文件中的条目的来源

选项参数讲解:

  • local host:功能:设置用于绑定OpenVPN服务的本地机器的名字或IP地址,如果指定了,那么OpenVPN服务仅绑定到这个地址上。如果没有指定,那么OpenVPN服务将会监听所有网卡。
  • remote host:指定远程主机名称或IP地址,可指定多个--remote,实现冗余,如果使用DNS名字,可通过DNS的轮询功能,实现简单的负载均衡。
  • port:设定本地和远程的机器TCP/UDP端口号,注意这里设置时客户端、服务端全部设置了
  • lport:设定本地主机绑定的TCP/UDP端口,这个时更细致的端口设置,只设置本地主机的端口号
  • rport:只设定远程主机的TCP/UDP端口
  • persist-tun、persist-key:如果运行UP/DOWN脚本并通过SIGUSR1或者--ping-restart来重启OpenVPN时,不要关闭和重新打开TUN/TAP设备。persist-key和persist-tun相似,不重新读取key文件。
  • 对端检测预处理:OpenVPN有两个通道:数据通道,控制通道,检测发生在控制通道中

  • ping n:如果n秒内没有发送数据包,那么就在控制通道上ping远程的机器。
  • ping-exit n:如果n秒之后没有从远程收到ping或者其它数据包,那么OpenVPN服务器将会退出。
  • ping-restart n:与ping-exit相似,只不过是通过发SIGUSR1信息来重启OpenVPN服务器。
  • ping-timer-rem:这个就是是否启用以上功能,前提是如果有远程地址,那么就运行ping-exit、ping-restart定时器。
  • keepalive n m:类似于ping的功能,会在连接上来回发送类似于ping的信号,以便于发现某一端断掉,n是时间间隔,每个多少秒ping一次,m表示ping之后多少秒没有收到回应,则表示对方已经断开。
  • 日志选项:

  • log file:将输出日志信息写入到指定文件。
  • logappend file:将输出日志信息追加到指定文件,追加文件尾部。
  • 3、VPN1运行配置:

    [root@vpn1 ~]# openvpn --config new1.conf 
    #查看输出日志,会显示连接失败的食醋胡,这是因为我们起用了一段OpenVPN服务,另一端没有启用,把另一端启用后就行了。
    Thu Jun 16 21:18:41 2022 read UDP [ECONNREFUSED|ECONNREFUSED]: Connection refused (code=111)
    Thu Jun 16 21:18:45 2022 read UDP [ECONNREFUSED]: Connection refused (code=111)
    Thu Jun 16 21:18:49 2022 read UDP [ECONNREFUSED]: Connection refused (code=111)
    

    4、VPN2运行配置:

    #开启路由转发
    #只需要改变以下选项
    local 192.168.9.132
    remote 192.168.9.130
    ifconfig 10.200.0.2 10.200.0.1
    

    5、client配置

    可以借助命令:route -n分析

    这是个重点:现在我使用公司总部里面的PC(client2)去ping分支办公室里面的VPN服务器上面的TUN(10.200.0.1)

    如果VPN2、client2的网卡配置信息没有错误那应该是clinet2可以ping通VPN2的TUN,WAN,LAN

    但是你会发现client2无法ping通VPN1的TUN,这时为什么呢?ping不同肯定就是要么去的包不通,要么回来的包不通。

    那现在分析下过程:首先client2发包:src-192.168.17.10,des-10.200.0.1,client2找到网关将包转发至VPN2,

    VPN2发现des-10.200.0.1肯定需要多次封装,先经过TUN(虚拟网卡)隧道加密封装(src-10.200.0.2,des=10.200.0.1),在经过物理网卡封装(src-192.168.9.132,des-192.168.9.130),这样通过直连就将数据包转发至VPN1了,然后VPN1在进行层层解封装、层层封装,最终需要回应数据包(src-10.200.0.1,des-192.168.17.10)。

    这时就出现问题了,会发现VPN1中根本找不到去往192.168.17.10的路由,因此问题就出现在这里。

    解决办法:在VPN1中添加一条去往192.168.17.10的路由:

    #这是原路由条目
    [root@vpn1 ~]# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.9.2     0.0.0.0         UG    100    0        0 ens33
    0.0.0.0         192.168.16.2    0.0.0.0         UG    101    0        0 ens37
    10.200.0.2      0.0.0.0         255.255.255.255 UH    0      0        0 tun0
    192.168.9.0     0.0.0.0         255.255.255.0   U     100    0        0 ens33
    192.168.16.0    0.0.0.0         255.255.255.0   U     101    0        0 ens37
    #新添加一条路由条目
    [root@vpn1 ~]# route add -net 192.168.17.0/24 gw 10.200.0.2      #思考:为啥网关指定10.200.0.1,为什么不可以指定192.168.9.2?
    192.168.17.0    10.200.0.1      255.255.255.0   UG    0      0        0 tun0
    

    以上配置后,就可以client2就可以ping通VPN1的TUN了

    那以此类推,想要client1ping通VPN2的TUN,也是在VPN2添加一条路由规则即可:

    [root@vpn2 ~]# route add -net 192.168.16.0/24 gw 10.200.0.1
    

    6、经过以上配置之后,client1(192.168.16.10)就可以和client2(192.168.17.10)互通了。

    7、扩展:以上添加路由是我们自己手动添加的,那可不可以在启动OpenVPN时就自动添加路由规则呢?

    是可以的。我们在配置文件中添写即可:

    #不用指定下一跳地址,OpenVPN会自动指定
    route 192.168.16.0 255.255.255.0
    route 192.168.17.0 255.255.255.0
    192.168.17.0    10.200.0.2      255.255.255.0   UG    0      0        0 tun0
    192.168.16.0    10.200.0.1      255.255.255.0   UG    0      0        0 tun0
    

    通过日志分析自动添加路由的过程:

    /sbin/ip route add 192.168.17.0/24 via 10.200.0.2
    

    6、选型:route network/IP [netmask] [gateway] [metric]

    功能:在建立连接之后添加路由项,可以指定多个路由项

    在TUN/TAP设备关闭之前,将会以逆序的方式自动删除这些添加的路由项

    netmask默认值:255.255.255.255

    gateway默认值:route-gateway的值或者是ifconfig的第二个参数,这也就是我们使用route选项时,不需要指定gw,就有默认的gw。

    metric默认值:route-metric的值或0

    network和gateway还支持以下关键字:

  • vpn_gateway:表示远程VPN节点地址
  • net_gateway:表示预先存在的默认网关地址
  • remote_host:如果OpenVPN是运行在客户端模式下,并且没有定义Server模式,表示remote地址
  • 7、选项:route-delay [n] [w](路由延迟)

    功能:指定在建立完成之后,添加路由之前的延迟时间

    [n]:如果是0,表示在完成连接之后立即添加路由,如果省略选项,那么在启用TUN/TAP设备--UP脚本被执行之后且在降级权限之前添加路由

    [w]:在Windows上,通过在添加路由之前等待w秒,默认值w=30

    三个站点互联

    1、三个OpenVPN隧道是两两相连,那监听的端口就需要不一样,A---B:1194,A---C:1195

  •