本文的目标是配置两个局域网之间的 VPN 连接,建立 VPN 连接之后,两个局域网好像在同一个局域网内一样。经过下面的配置之后,双方局域网内的全部设备(包括手机)都可以直接使用远程服务器提供的服务。
下面是我实施本文的配置所使用的网络:
局域网一:我公司的内部局域网,使用 ADSL 拨号上网,动态 IP 地址。
局域网二:腾讯云服务器,固定IP地址。现在只有一台机器,但我们可以从不同的地点使用域名建立 VPN 连接到云服务器,就可以直接进入公司内部网,实现远程办公,不需要知道公司现在的 IP 地址。
操作系统:FreeBSD13.1-Release。
两台机都启用路由功能,在 /etc/rc.conf 中加上一行:
gateway_enable="YES"
下面提供两种方法建立局域网 VPN 连接。
方法一:使用系统自带的命令建立VPN连接
这个可能是最简单的方法,只要知道两边的 IP 地址,能相互连接,两边分别输入四行命令就建立了连接。还可以写成脚本定期执行。
简单设置
因为我公司采用拨号上网,是动态 IP 地址,最久每 48 小时变一次。为方便命令执行,我将公司路由器解释为 myself,在 /etc/hosts 中加上这样一行:
13.14.15.6 myself #我的动态IP地址。
同时在腾讯云服务器上将这个 IP 地址解释为 corpgw,在 /etc/hosts 中加上这样一行:
13.14.15.6 corpgw #我的动态IP地址。
公司的路由器定时将 IP 地址发送给腾讯云服务器,服务器将 IP 地址写进文件中。可以通过网页程序或者 FTP 传送IP地址。
我的 ftp 传送脚本 ftpsendip.sh:
#!/bin/sh
ifconfig tun0 | grep inet|awk 'END{print $2}'>hosts
ftp -i -in <ftp.x
ftp.x 里包含FTP命令:
open <FTP服务器>
user 用户名 密码
bin
mput hosts
bye
还可以这样:
ln -s /ftp上传的目录/hosts /etc/hosts
(加上 127.0.0.1 的解释可能会更好。)
建立连接。
在公司路由器,输入以下命令:
# ifconfig gif0 create
# ifconfig gif0 10.10.10.99 172.15.0.19
# ifconfig gif0 tunnel myself 159.75.*.*
# route add 172.15.0.0 172.15.0.19 255.255.255.0
其中 10.10.10.99 是公司路由器的内部 IP 地址, 172.15.0.* 是云服务器的内部 IP 地址。* 号隐藏了具体数字。
在腾讯云服务器,输入下面的命令:
# ifconfig gif0 create
# ifconfig gif0 172.15.0.19 10.10.10.99
# ifconfig gif0 tunnel 172.15.0.19 corpgw
# route add 10.10.10.0 10.10.10.99 255.255.255.0
在腾讯云服务器,引用本机 IP 地址时,不能使用公网 IP 地址,要使用分配的内网 IP 地址,登录后用 ifconfig 命令就能看到。
经过这么简单的操作,两边的机器可以 ping 通了。
这种方法可以更简便一点,把上面的 corpgw 和 myself 直接换成 IP 地址就可以了。把前面的命令写成可执行脚本 gif.sh:
# ifconfig gif0 destroy
# ifconfig gif0 create
# ifconfig gif0 172.15.0.19 10.10.10.99
# ifconfig gif0 tunnel 172.15.0.19 corpgw
# route add 10.10.10.0 10.10.10.99 255.255.255.0
定期执行这个脚本就能保持连接。
方法二:使用 mpd5 建立 VPN 连接
使用 mpd5 建立连接,让公司的路由器连接腾讯云服务器,这样不必知道我们的动态 IP 地址是什么,不必像上一种连接那样要传送和设置 IP 地址。
首先要安装 mpd5:
# pkg install mpd5
公司路由器的配置文件,/usr/local/etc/mpd5/mpd.conf:
# 公司路由器
startup:
set user root abcabc admin
set user fool bar1
set web self 0.0.0.0 5006
set web open
default:
load vpn_lan2lan
load pptp_server
pptp_server:
set ippool add pool1 10.10.10.160 10.10.10.169
create bundle template B
set iface enable proxy-arp
set iface idle 1800
set iface enable tcpmssfix
set ipcp yes vjcomp
set ipcp ranges 10.10.10.101 ippool pool1
set bundle enable compression
set ccp yes mppc
set mppc yes e40
set mppc yes e128
set mppc yes stateless
create link template L pptp
set link action bundle B
set link enable multilink
set link yes acfcomp protocomp
set link no pap chap eap
set link enable chap
set link keep-alive 10 60
set link mtu 1460
set pptp self 0.0.0.0
set link enable incoming
vpn_lan2lan:
create bundle static b_router
set iface route 172.15.0.19/24
set bundle enable compression
set bundle enable crypt-reqd
set ccp yes mppc
set mppc accept compress
set mppc yes e40 e56 e128
set mppc yes stateless
create link static l_router pptp
set link action bundle b_router
set link accept chap
set auth authname "router"
set auth password "password"
set link keep-alive 10 60
set link max-redial 0
set link disable incoming
set pptp peer 59.75.*.*
open
vpn_common:
set bundle enable compression
set ccp yes mppc
set mppc yes e128
set bundle enable crypt-reqd
set mppc yes stateless
pptp_links:
set ippool add pool_pptp 192.168.2.101 192.168.2.250
create bundle template b_pptp
set iface enable proxy-arp
set iface idle 3600
set iface enable tcpmssfix
set ipcp enable vjcomp
set ipcp ranges 10.0.2.1/32 ippool pool_pptp
load vpn_common
create link template l_pptp pptp
set link action bundle b_pptp
load links_common
links_common:
set link enable multilink
set link enable acfcomp protocomp
set link disable pap chap eap
set link enable chap
set link keep-alive 10 60
set link mtu 1396
set link mru 1396
set link enable incoming
腾讯云服务器端的配置文件,/usr/local/etc/mpd5/mpd.conf:
# server
startup:
set user root abcabc admin
set user fool bar1
set web self 0.0.0.0 5006
set web open
default:
load vpn_server
load pptp_links
load pptp_server
pptp_server:
set ippool add pool1 172.15.0.1 172.15.0.5
create bundle template B
set iface enable proxy-arp
set iface idle 1800
set iface enable tcpmssfix
set ipcp yes vjcomp
set ipcp ranges 172.15.0.10 ippool pool1
set bundle enable compression
set ccp yes mppc
set mppc yes e40
set mppc yes e128
set mppc yes stateless
create link template L pptp
set link action bundle B
set link enable multilink
set link yes acfcomp protocomp
set link no pap chap eap
set link enable chap
set link keep-alive 10 60
set link mtu 1460
set pptp self 0.0.0.0
set link enable incoming
vpn_server:
create bundle static b_server
set ipcp ranges 172.15.0.19/32 10.10.10.99/32
set iface route 10.10.10.0/24
load vpn_common
vpn_common:
set bundle enable compression
set ccp yes mppc
set mppc yes e128
set bundle enable crypt-reqd
set mppc yes stateless
pptp_links:
set ippool add pool_pptp 172.15.0.1 172.15.0.10
create bundle template b_pptp
set bundle enable compression
set bundle enable crypt-reqd
set iface enable proxy-arp
set iface idle 3600
set iface enable tcpmssfix
set ipcp enable vjcomp
set ipcp ranges 172.15.0.10/32 ippool pool_pptp
load vpn_common
create link template l_pptp pptp
set link action bundle b_server router
set link action bundle b_pptp
load links_common
links_common:
set link enable multilink
set link enable acfcomp protocomp
set link disable pap chap eap
set link enable chap
set link keep-alive 10 60
set link mtu 1396
set link mru 1396
set link enable incoming
在云服务器端的 /usr/local/etc/mpd5/mpd.secret 文件中加上一行(就是用户名和密码):
router "password"
两边启动 mpd5:
# service mpd5 start
到这里,两连接都可以连通了。下面是 mpd5 的截图,http://59.75.*.*:5006。
上面的 mpd5 配置文件同样适用于我前面设置 VPN 服务器的情况。
【本文最初的配置不知道是哪年从哪抄来的,并根据自己的需要和心情作了更改,感谢各位作者。】