添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • 两个分支机构网络互通,如分支机构实时将传数据给总部处理
  • 办公室网络与IDC机房互通,如运维或技术人员要远程管理IDC机房内的服务器,IDC内的服务器也要访问办公室内网的服务器
  • 两个IDC机房内网互通,如两边同步数据、互相访问等
  • 当然,这样的需求你可以拉专线但太贵,我们用openvpn来做

    下面的例子:使用openvpn搭建vpn服务器打通A和B两个异地网络,让A局域网中的172.16.10.0/24段可以和B局域网中的172.16.20.0/24段可以网络互通,就好像在一个局域网一样.

    环境说明:

    OPENVPN服务器

    192.168.0.124/24(模拟外网)

    172.16.10.206/24(内网)

    10.8.0.1  10.8.0.2 (vpn虚拟网卡地址)

    OPENVPN客户端

    192.16.0.200/24

    172.16.20.201/24(内网)

    10.8.0.6 10.8.0.5 (vpn虚拟网卡地址)

    A局域网主机 172.16.10.207/24 B局域网主机 172.16.20.201/24

    二、部署openvpn服务端(192.168.0.124)

    关闭selinux

    # setenforce 0
    setenforce: SELinux is disabled

    开启路由转发

    编辑  /etc/sysctl.conf 文件将 net.ipv4.ip_forward = 0 改为  net.ipv4.ip_forward = 1,然后执行

    # sysctl -p

    安装openvpn

    # curl http://mirrors.aliyun.com/repo/epel-6.repo  -o  /etc/yum.repos.d/epel-6.repo --silent   # 添加阿里的EPEL源
    # yum install openssl openvpn easy-rsa lzo -y 

    创建相关目录及配置

    # mkdir /var/log/openvpn                      # 放openvpn相关日志文件
    # mkdir /etc/openvpn/easy-rsa                 # 放easy-rsa包提供的相关工具
    # mkdir /etc/openvpn/ccd                      # openvpn客户端的配置目录,后面会用到
    # mkdir /var/run/openvpn                      # 放openvpn的pid文件

    将easy-ras包提供的工具复制到 /etc/openvpn/easy-rsa

    # cp /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa/ -r 

    编辑 /etc/openvpn/easy-rsa/vars 文件,找到下面的变量修改成你指定的值,后面生成证书的时候会应用这些变量值

    export KEY_COUNTRY="CN"        # 国家
    export KEY_PROVINCE="GD"       # 省份
    export KEY_CITY="GZ"           # 城市
    export KEY_ORG="MY_ORG"        # 组织/公司
    export KEY_EMAIL="vpn@qq.com"  # 邮箱
    export KEY_OU="vpn"            # 单位  
    export KEY_NAME="openvpn"      # 服务器名称
    # source vars      # 导入vars文件中的变量作为当前的环境变量
    # ./clean-all      # 清除keys目录下的文件

    也就是证书颁发机构,用来颁发证书

    # cd /etc/openvpn/easy-rsa
    # ./build-ca   

    生成服务器证书

    # ./build-key-server vpnserver               # 起个名字叫vpnserver
    Generating a 2048 bit RSA private key
    ................................+++
    .....+++
    writing new private key to 'vpnserver.key'
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [CN]:
    State or Province Name (full name) [GD]:
    Locality Name (eg, city) [GZ]:
    Organization Name (eg, company) [MY_ORG]:
    Organizational Unit Name (eg, section) [vpn]:
    Common Name (eg, your name or your server's hostname) [vpnserver]:
    Name [vpn]:
    Email Address [vpn@qq.com]:
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:                                 
    An optional company name []:
    Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
    Check that the request matches the signature
    Signature ok
    The Subject's Distinguished Name is as follows
    countryName           :PRINTABLE:'CN'
    stateOrProvinceName   :PRINTABLE:'GD'
    localityName          :PRINTABLE:'GZ'
    organizationName      :PRINTABLE:'MY_ORG'
    organizationalUnitName:PRINTABLE:'vpn'
    commonName            :PRINTABLE:'vpnserver'
    name                  :PRINTABLE:'vpn'
    emailAddress          :IA5STRING:'vpn@qq.com'
    Certificate is to be certified until Apr 29 06:26:49 2026 GMT (3650 days)
    Sign the certificate? [y/n]:y         # 输入y
    1 out of 1 certificate requests certified, commit? [y/n]y   # 输入y
    Write out database with 1 new entries
    Data Base Updated

    生成客户端证书

    # ./build-key vpnclient                  # 起个名字叫vpnclient,表示为vpnclient这个客户端生成证书
    Generating a 2048 bit RSA private key
    .......+++
    ....................+++
    writing new private key to 'vpnclient.key'
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [CN]:
    State or Province Name (full name) [GD]:
    Locality Name (eg, city) [GZ]:
    Organization Name (eg, company) [MY_ORG]:
    Organizational Unit Name (eg, section) [vpn]:
    Common Name (eg, your name or your server's hostname) [vpnclient]:
    Name [vpn]:
    Email Address [vpn@qq.com]:
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
    Check that the request matches the signature
    Signature ok
    The Subject's Distinguished Name is as follows
    countryName           :PRINTABLE:'CN'
    stateOrProvinceName   :PRINTABLE:'GD'
    localityName          :PRINTABLE:'GZ'
    organizationName      :PRINTABLE:'MY_ORG'
    organizationalUnitName:PRINTABLE:'vpn'
    commonName            :PRINTABLE:'vpnclient'
    name                  :PRINTABLE:'vpn'
    emailAddress          :IA5STRING:'vpn@qq.com'
    Certificate is to be certified until Apr 29 06:30:42 2026 GMT (3650 days)
    Sign the certificate? [y/n]:y    # 输入y
    1 out of 1 certificate requests certified, commit? [y/n]y   # 输入y
    Write out database with 1 new entries
    Data Base Updated

    创建Diffie Hellman密钥文件

    需要一点时间

    # ./build-dh

    配置openvpn

    编辑/etc/openvpn/server.conf文件,内容如下

    local 192.168.0.124
    port 1999        
    proto tcp-server       
    dev tun        
    ca   /etc/openvpn/easy-rsa/keys/ca.crt       
    cert /etc/openvpn/easy-rsa/keys/vpnserver.crt
    key  /etc/openvpn/easy-rsa/keys/vpnserver.key  
    dh   /etc/openvpn/easy-rsa/keys/dh2048.pem
    server 10.8.0.0 255.255.255.0
    ifconfig-pool-persist ipp.txt              
    client-config-dir /etc/openvpn/ccd                   
    push "route 172.16.10.0 255.255.255.0"  # 推送给客户端的路由,告诉客户端添加静态路由,让去172.16.10.10/24网段的都走vpn服务器,vpn服务器后端又几个网段就写几个
    route 172.16.20.0 255.255.255.0         # 启动时给openvpn服务器添加路由,告诉服务器去172.16.20.0/24网段的都走虚拟机网卡(tun0),相当于静态路由.
    keepalive 10 120                       
    comp-lzo                              
    max-clients 100                      
    user nobody                         
    group nobody
    client-to-client                   
    duplicate-cn                      
    persist-key
    persist-tun                     
    status    /var/log/openvpn/openvpn-status.log        
    log       /var/log/openvpn/openvpn.log
    writepid  /var/run/openvpn/server.pid
    verb 3
    mute 20

    启动openvpn服务端

    # service openvpn start
    # chkconfig --add openvpn
    # chkconfig --level 35 openvpn on

    查看tun0接口和路由

    # ifconfig tun0
    tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
              inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
              UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:100 
              RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
    # route -n | grep tun0 
    10.8.0.2        0.0.0.0         255.255.255.255 UH    0      0        0 tun0   # 主机路由
    172.16.20.0     10.8.0.2        255.255.255.0   UG    0      0        0 tun0   # 静态路由,去172.16.20.0段下一跳是10.8.0.2
    10.8.0.0        10.8.0.2        255.255.255.0   UG    0      0        0 tun0   # 静态路由,去10.8.0.2.0段下一跳是10.8.0.2

    指定客户端配置

    指定vpnclient这个客户端的配置,编辑 /etc/openvpn/ccd/vpnclient ,内容如下

    ifconfig-push 10.8.0.6 10.8.0.5      # 配置客户端的IP
    iroute 172.16.20.0 255.255.255.0     # 告诉服务端,我的网段是172.16.20.0/24

    三、部署openvpn客户端(192.168.0.200)

    关闭selinux

    # setenforce 0
    setenforce: SELinux is disabled

    开启路由转发

    编辑  /etc/sysctl.conf 文件将 net.ipv4.ip_forward = 0 改为  net.ipv4.ip_forward = 1,然后执行

    # sysctl -p

    安装openvpn

    # curl http://mirrors.aliyun.com/repo/epel-6.repo  -o  /etc/yum.repos.d/epel-6.repo --silent   # 添加阿里的EPEL源
    # yum install openssl openvpn easy-rsa lzo -y 

    创建相关目录及配置

    # mkdir /etc/openvpn/keys          # 放客户端的相关证书
    # mkdir /var/log/openvpn           # 放日志的目录

    将openvpn服务器上 /etc/openvpn/easy-rsa/keys 下的 ca.crt、vpnclient.crt、vpnclient.key 这些证书文件拉下来放到 /etc/openvpn/keys

    # ls /etc/openvpn/keys
    ca.crt  vpnclient.crt  vpnclient.key

    配置openvpn客户端

    编辑客户端的配置文件/etc/openvpn/client.conf,内容如下

    client
    dev tun
    proto tcp-client
    remote 192.168.0.124 1999
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    ca   /etc/openvpn/keys/ca.crt
    cert /etc/openvpn/keys/vpnclient.crt
    key  /etc/openvpn/keys/vpnclient.key
    remote-cert-tls server
    auth-nocache user nobody group nobody status
    /var/log/openvpn/openvpn-status.log log /var/log/openvpn/openvpn.log comp-lzo verb 3 mute 20

    启动openvpn客户端

    # service openvpn start
    # chkconfig --add openvpn
    # chkconfig --level 35 openvpn on

    客户端启动后只有进程,因为它作为客户端去连服务端,不需要提供端口

    # ps aux | grep vpn
    nobody    4236  0.1  0.3  46916  3232 ?        Ss   01:36   0:00 /usr/sbin/openvpn --daemon --writepid /var/run/openvpn/client.pid 
    --cd /etc/openvpn --config client.conf --script-security 2

    查看tun0接口和路由

    # ifconfig tun0
    tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
              inet addr:10.8.0.6  P-t-P:10.8.0.5  Mask:255.255.255.255
              UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:100 
              RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
    # route -n | grep tun0
    10.8.0.5        0.0.0.0         255.255.255.255 UH    0      0        0 tun0   # 主机路由
    10.8.0.0        10.8.0.5        255.255.255.0   UG    0      0        0 tun0   # 静态路由,去10.8.0.0/24网段下一跳10.8.0.5
    172.16.10.0     10.8.0.5        255.255.255.0   UG    0      0        0 tun0   # 静态路由,去172.16.10.0/24网段下一跳10.8.0.5

    四、测试(172.16.10.207、172.16.20.201)

    在A局域网主机172.16.10.207上添加路由

    ip route add 172.16.20.0/24 via 172.16.10.206            // 如果是linux
    route add 172.16.20.0 mask 255.255.255.0 172.16.10.206   // 如果是windows

    上面的路由表示A去B局域网172.16.20.0段的下一跳是172.16.10.206,也就是把包转发给vpnserver

    在B局域网主机172.16.20.201上添加路由

    ip route add 172.16.10.0/24 via 172.16.20.200           // 如果是linux
    route add 172.16.10.0 mask 255.255.255.0 172.16.20.200  // 如果是windows

    上面的路由表示B去A局域网172.16.10.0端的下一跳是172.16.20.200,也就是把包转发给vpnclient

    最后,在A局域网主机 172.16.10.207 上ping 172.16.20.201

    # ping 172.16.20.201
    PING 172.16.20.201 (172.16.20.201) 56(84) bytes of data.
    64 bytes from 172.16.20.201: icmp_seq=1 ttl=62 time=1.44 ms
    64 bytes from 172.16.20.201: icmp_seq=2 ttl=62 time=0.752 ms
    64 bytes from 172.16.20.201: icmp_seq=3 ttl=62 time=0.674 ms
    64 bytes from 172.16.20.201: icmp_seq=4 ttl=62 time=0.785 ms
    --- 172.16.20.201 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3023ms
    rtt min/avg/max/mdev = 0.674/0.913/1.441/0.307 ms

    在B局域网主机 172.16.20.201上ping 172.16.10.207

    # ping 172.16.10.207
    PING 172.16.10.207 (172.16.10.207) 56(84) bytes of data.
    64 bytes from 172.16.10.207: icmp_seq=1 ttl=62 time=5.72 ms
    64 bytes from 172.16.10.207: icmp_seq=2 ttl=62 time=0.674 ms
    --- 172.16.10.207 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1400ms
    rtt min/avg/max/mdev = 0.674/3.200/5.727/2.527 ms

    两边可以ping通,表示OK

    可以改进的地方

    如果A和B局域网内很有多主机,那么每台机都要加很多次路由,比较麻烦,在实际的环境中可以在内网的路由器上做,这样就不需要在主机上配,比较省事.

    vpn的目的和作用就是从网络层面打通两个或以上异地网络,就好像在同一个局域网

    vpnserver和vpnclient做好之后可以看成路由

    如果要用vpn互相传数据的话,带宽尽可能大,有必要的话可以做端口绑定,高可用