说明:

1、这篇文章主要是使用静态路由表实现的多个机房通过VPN连接后的子网机房互通。

2、OpenVPN使用的是桥接模式(server-bridge和dev tap),这个是关键点,只有这样设置才可以在每台VPN客户端上添加静态路由表指向不同的VPN客户端IP做为网关。

3、本示例中各子网一定是配置了路由表,使其访问特定的IP地址全部走OpenVPN客户端那台机器出去的。

4、示例中Iptables不是重点,只起到了转发的简单作用。

5、经过试验,配置网桥模式有个特点,就是设置的IP地址最好为当前服务器所在的IP网段,这样最好分配,无论是客户端连接进来之后;当然,可以完全设置为自定义内网IP,这样需要增加多一张网卡。

示例:

一、环境简述

之前一直使用公网IP来连接各个机房的服务器,现在ip不太够用了,而且有些机器也不需要用到公网ip,通过OpenVPN将多个机房连接起来,组成一个局域网,机器IP可以做到唯一性,便于标识,既节省了IP,又方便管理。

本例环境如下,服务器使用的系统为CentOS 7.1 

北京机房内网网段:172.16.2.0/24,服务器公网IP:20.20.20.20,内网网关:172.16.2.1

广州机房内网网段:172.16.1.0/24,服务器公网IP:10.10.10.10,内网网关:172.16.1.1

公司内网网段:172.16.3.0/24,防火墙公网IP:30.30.30.30,内网网关:172.16.3.1,内网服务器IP:172.16.3.88

实现思路: 
1、在广州机房搭建一个OpenVPN服务端,北京和公司内网各选一台服务器做OpenVPN的客户端连接广州。

2、OpenVPN使用桥接模式,开启client-to-client。北京和公司都连上后,这3台机器默认就能互访。

3、各内网网段的互通使用静态路由。

二、广州安装OpenVPN服务端

安装前需注意服务器的系统时间要一致,可按如下方法同步:

/usr/sbin/ntpdate cn.pool.ntp.org

1、安装OpenVPN

如果没epel源,先添加下

wget  http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
rpm -Uvh epel-release--.noarch.rpm
yum -y install openvpn easy-rsa 

2、创建证书

cp -r /usr/share/easy-rsa/ /etc/openvpn/
cd /etc/openvpn/easy-rsa/.*/
vim vars

设置如下内容

export KEY_COUNTRY="CN"
export KEY_PROVINCE="GD"
export KEY_CITY="guangzhou"
export KEY_ORG="test"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"
# X509 Subject Field
export KEY_NAME="EasyRSA"

产生证书

source ./vars
./clean-all
./build-ca

./build-key-server server
./build-dh
./build-key client

cd /etc/openvpn/easy-rsa/2.0/
cp -r keys/ /etc/openvpn/

3、配置OpenVPN

vim /etc/openvpn/server.conf

关键配置如下:

port
proto udp
dev tap0
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh2048.pem
ifconfig-pool-persist ipp.txt
server-bridge 172.16.1.1 255.255.255.0 172.16.1.2 172.16.1.10
client-config-dir ccd
client-to-client
duplicate-cn
keepalive
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb
mute
script-security
#验证用户名密码脚本
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
#开启用户名和密码验证,用于服务端分配固定ip
username-as-common-name
client-config-dir /etc/openvpn/ccd #用于服务端分配固定ip

设置用户名和密码,并设置固定分配IP

cd /etc/openvpn
vim psw-file
#这里设置用于连接openvpn的用户名和密码,格式为用户名 + 空格 +密码,例如
bj test123456
com test123456

#在该目录下再新建一个ccd文件夹
mkdir ccd
cd ccd

#在该目录下新建两个文件,把用户名作为文件名的命名

vi bj
#添加如下内容
ifconfig-push 172.16.1.2 255.255.255.0

vi com
#添加如下内容
ifconfig-push 172.16.1.3 255.255.255.0

4、添加密码验证脚本

vi /etc/openvpn/checkpsw.sh

内容如下

#!/bin/sh
###########################################################
# checkpsw. Mathias Sundman <mathias@openvpn.se>
#
# This script will authenticate OpenVPN users against
# a plain text file. The passfile should simply contain
# one row per user with the username first followed by
# one or more space(s) or tab(s) and then the password.

PASSFILE="/etc/openvpn/psw-file"
LOG_FILE="/var/log/openvpn-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`

###########################################################

if [ ! -r "${PASSFILE}" ]; then
  echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
  exit
fi

CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`

if [ "${CORRECT_PASSWORD}" = "" ]; then
  echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
  exit
fi

if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
  echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
  exit
fi

echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 

5、IP配置

给OpenVPN服务端的网卡配置IP时,有两种方式选择:桥接或者在配置文件中设置,这里两种都示例下,选择任意一个即可,推荐用配置文件分配(简单些)。

5.1、在配置文件中指定

vim /etc/openvpn/server.conf

在ifconfig-pool-persist ipp.txt下添加一行

ifconfig 172.16.1.1 255.255.255.0

5.2、通过桥接分配

5.2.1、启动桥接脚本

#!/bin/bash
#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################
# Define Bridge Interface
br="br0"
# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"
# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="ens9" #这里注意下网卡名
eth_ip="172.16.1.1"
eth_netmask="255.255.255.0"
eth_broadcast="172.16.1.255"
for t in $tap; do
   /usr/sbin/openvpn --mktun --dev $t
done
brctl addbr $br
brctl addif $br $eth
for t in $tap; do
    brctl addif $br $t
done
for t in $tap; do
    ifconfig $t 0.0.0.0 promisc up
done
ifconfig $eth 0.0.0.0 promisc up
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
route add -net  gw 172.16.1.2
route add -net  gw 172.16.1.3

5.2.2、停止桥接脚本

#!/bin/bash
####################################
# Tear Down Ethernet bridge on Linux
####################################
# Define Bridge Interface
br="br0"
# Define list of TAP interfaces to be bridged together
tap="tap0"
ifconfig $br down
brctl delbr $br
for t in $tap; do
    /usr/sbin/openvpn --rmtun --dev $t
done

6、设置iptables

nat链添加如下规则
-A POSTROUTING -s  -o eth1 -j MASQUERADE
-A POSTROUTING -s  -j MASQUERADE

filter链添加如下规则
-A INPUT -s   -j ACCEPT
-A INPUT -s   -j ACCEPT
-A INPUT -s  -j ACCEPT
-A FORWARD -j ACCEPT

7、启动OpenVPN

echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
systemctl -f enable openvpn@server.service
systemctl start openvpn@server

三、北京、公司内网连接广州OpenVPN,打通内网

以北京20.20.20.20服务器为例

1、安装OpenVPN,步骤同上

2、将OpenVPN服务端(10.10.10.10)的三个证书文件ca.crt client.crt client.key(路径/etc/openvpn/keys)拷贝到/etc/openvpn/下

3、添加OpenVPN启动脚本

# cd /etc/openvpn

# vi client.sh
#添加如下内容
#!/bin/sh
case "$1" in
start)
    /usr/sbin/openvpn /etc/openvpn/client.ovpn > /dev/null &

    route add -net  gw 172.16.1.3
;;
stop)
    pkill openvpn
;;
restart)
    pkill openvpn

    /usr/sbin/openvpn /etc/openvpn/client.ovpn > /dev/null &
;;
esac

# vi psw.conf
#添加如下内容
bj
test123456

# vi client.ovpn
#添加如下内容
client
dev tap
proto udp
remote
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
ca ca.crt
cert client.crt
key client.key
ns-cert-type server
comp-lzo
auth-user-pass psw.conf

#添加执行权限
# chmod +x client.sh

#加入系统启动项
# echo '(cd /etc/openvpn; ./client.sh start)' >> /etc/rc.local

4、设置iptables

nat链添加如下规则
-A POSTROUTING -d  -o tap0 -j MASQUERADE

filter链添加如下规则
-A FORWARD -i eth0 -o tap0 -j ACCEPT
-A FORWARD -i tap0 -o eth0 -j ACCEPT

5、设置完成后,重启下防火墙,启动OpenVPN

# systemctl restart iptables
(cd /etc/openvpn; ./client.sh start)

ping下广州内网网关172.,如果ping通说明北京与广州可以互通了.
#
PING () bytes of data.
 bytes from  ttl= time=37.1 ms
 bytes from  ttl= time=37.0 ms
 bytes from  ttl= time=37.2 ms
 bytes from  ttl= time=37.0 ms

--- 172.16.1.1 ping statistics ---
 packets transmitted,  received, % packet loss, time 3040ms
rtt min/avg/max/mdev = 37.053/37.133/37.268/0.083 ms

6、公司内网OpenVPN连接设置与北京一样,注意用户名密码及路由的不同:

公司内网的openvpn的启动脚本如下:
# vi client.sh
#添加如下内容
#!/bin/sh
case "$1" in
start)
    /usr/sbin/openvpn /etc/openvpn/client.ovpn > /dev/null &

    route add -net  gw 172.16.1.2
;;
stop)
    pkill openvpn
;;
restart)
    pkill openvpn

    /usr/sbin/openvpn /etc/openvpn/client.ovpn > /dev/null &
;;
esac

7、北京,公司内网的OpenVPN都连接上后,在广州OpenVPN的服务器上添加如下路由

route add -net  gw 172.16.1.2
route add -net  gw 172.16.1.3

8、以上步骤成功完成后,北京内网,广州内网,公司内网即可互相访问。在任意的一台服务器上都可以访问其他节点的服务器,实现了内网互通的需求。

特别注意:

1、上面实现其实每台无论服务端还是客户端,都是网关服务器,所以在上面发现不了路由表的问题。

2、上面如果换成非网关服务器,那么需要在每个子网的网关服务器增加OpenVPN服务端网段的IP,也就是做回程路由。

参考:

http://blog.csdn.net/u012375924/article/details/50120983(以上内容转自此篇文章)

典型案例收集-使用OpenVPN连通多个机房内网(转)(静态路由)的更多相关文章

  1. 典型案例收集-使用OpenVPN连通多个机房内网(iptables+静态路由)

    说明: 1.这个方案是我最初实现的方案,目的在于OpenVPN连通后使其能访问各自的子网,实现互通. 2.主要以iptables为主,这个是关键点,并且这种方式配置iptables十分复杂,最后加入了 ...

  2. 典型案例收集-OpenVPN不同网段的访问控制(转)

    一.案例1  针对不同的客户端指定不同的等级和权限. 通常的方法是: 1.每个客户端分配不同的IP地址: 2.利用防火墙对不同的IP地址进行控制: 例如: 1.公司内部网段是10.66.4.0/24: ...

  3. 烂泥:openvpn双网卡客户端与内网机器通信

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 前段时间写了一篇有关openvpn搭建与内网机器通信的文章,那篇文章是基于服务器单网卡 ...

  4. NB-IoT的相关资料整理(基本概念,技术优势,典型案例和当前的进展)

            人与人之间的通讯规模已近天花板,物与物的则刚刚进入增长快车道.随着可穿戴.车联网.智能抄表等新兴市场的开启,工业4.0.智慧城市.智慧农业等理念照进现实,万物互联的时代正加速到来. 一 ...

  5. HBase基本知识介绍及典型案例分析

    本次分享的内容主要分为以下五点: HBase基本知识: HBase读写流程: RowKey设计要点: HBase生态介绍: HBase典型案例分析. 首先我们简单介绍一下 HBase 是什么. HBa ...

  6. elasticsearch中的mapping映射配置与查询典型案例

    elasticsearch中的mapping映射配置与查询典型案例 elasticsearch中的mapping映射配置示例比如要搭建个中文新闻信息的搜索引擎,新闻有"标题".&q ...

  7. 【Java新特性】Lambda表达式典型案例,你想要的的都在这儿了!!

    写在前面 不得不说,有些小伙伴的学习热情真高,学完了Lambda表达式的语法,想来几个典型案例再强化下.于是问冰河能否给几个Lambda表达式的典型使用示例.于是乎,便有了这篇文章. 案例一 需求 调 ...

  8. 使用OpenVPN连通管理多个阿里云VPC网络

    这篇文章比较长,将从需求.思路.原理.架构.实施步骤.细节分析.高可用等几个方面来讲述OpenVPN的使用,如果看到很熟悉的内容或者不感兴趣的部分,请您跳过. 需求 公司网络环境更换,导致原来连接阿里 ...

  9. 烂泥:openvpn tun模式下客户端与内网机器通信

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 前两篇文章我们介绍了有关openvpn的搭建与配置文件的讲解,这篇文章我们再聊介绍下,在tun模式下openvpn客户端如何与内网机器通信的问题. 一.实 ...

随机推荐

  1. 百度地图js lite api 支持点聚合

    百度地图lite api 是专门为h5 绘制海量点设计的,但是偏偏忽略掉了点聚合的需求,所以需要自己动手,做一次二次改造. 我们知道点聚合需要引入开源库: MarkerClusterer:  http ...

  2. java程序改错题(常见)

    最近跑校招,做了一套java的笔试题. abstract class Name { private String name; public abstract boolean isStupidName( ...

  3. fullpage.js 具体使用方法

    1.fullpage.js  下载地址 https://github.com/alvarotrigo/fullPage.js 2.fullPage.js 是一个基于 jQuery 的插件,它能够很方便 ...

  4. MemCached缓存操作

    Web项目在运行时,通常需要从数据库中进行读写.随着操作数据量的增大,以及访问量的集中,数据库的负载增加,数据库响应变慢,网站访问速度变慢的情况.Memcached就是用来解决这些问题的. Memca ...

  5. Suse Linux下NTP缓慢调整配置,转载至http://www.gpstime.com.cn/

    (1)系统内若有使用crontab 进行与时间调整相关的例行性工作排程,应注释掉(命令人工crontab -e修改,删除定时同步任务ntpdate -s ntpserver). (2)修改ntp配置文 ...

  6. P3960 列队

    这是NOIP 2017最后一道题 不知道这道题有没有人代码写的和我一样麻烦. Solution 30分暴力 维护每行每列的元素. 每次删除一个元素的时候, 需要修改一行一列 因此复杂度上界\(O(nm ...

  7. jersey中的 404 Not Found 错误。

    把资源定义到com.diandaxia.rest包里 就可以了: 当然也可以使用注册的方式,注册到jersey框架里.当一个类 必须再com.diandaxia.rest 包之外的话,又不想 扩大 自 ...

  8. spring-cloud-sleuth+zipkin追踪服务实现(二)

    1. 简述 在上一节<spring-cloud-sleuth+zipkin追踪服务实现(一)>中,我们使用microservice-zipkin-server.microservice-z ...

  9. 15、Spark Streaming源码解读之No Receivers彻底思考

    在前几期文章里讲了带Receiver的Spark Streaming 应用的相关源码解读,但是现在开发Spark Streaming的应用越来越多的采用No Receivers(Direct Appr ...

  10. CodeForces 803A Maximal Binary Matrix

    枚举. 枚举对角线上放多少个$1$,剩余的贪心放,更新答案. #include <iostream> #include <cstdio> #include <cstrin ...