说明:这种方案的实现前提是必须要有一台拥有公网IP的电脑,OpenVPN搭建过程很普通,关键技术在于iptables的转发。搭建教程可能有点旧了,可以只看iptables的关键点技术。

方案背景:

公司办公网络使用长城宽带上网有一段时间了,有4个固定IP(2个电信,2个网通),链路不太稳定,经常有问题,因此考虑取消长城宽带,采用原来的adsl上网。但是有个问题,因为公司内网有几台服务器,需要通过固定IP接受外网用户发送的数据,因此如果没有公网IP,而ADSL获取的IP会变化,那么内网服务器接受外面用户的数据就会受到影响,通过采用OpenVPN很好的解决了这个问题。这个前提是你在机房的服务器有固定IP。 

应用场景

公司在托管机房有公网IP,在公司内部采用ADSL上网,又需要接受外网用户发送的数据,那么就可以在托管机房有公网IP的服务器部署OpenVPN,然后内网找一台服务器拨上去获取IP后,通过iptables的端口转发2次就可以完美解决公司网络没有公网IP的问题。

详细方案

下面就来详细讲述如何用OpenVPN完美的解决公司网络没有公网IP的解决方案!

一、   需求

在没有固定公网IP的情况下,借助托管机房的固定公网IP,实现发布内网服务器的端口给外网用户调用,具体环境如下面网络图中所示,需要把内网服务器192.168.100.113的708端口借助托管机房的固定IP发布给外网用户调用

二、   网络图

三、OpenVPN服务器的安装配置

1、OpenVPN服务器端的环境

OS: CentOS 5.5 64bit 2.6.18

lzo version: 2.0.6(最新版本)

OpenVPN version: 2.2.2(最新版本)

2、OpenVPN服务器端软件的安装

下载软件包

wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz
wget http://swupdate.openvpn.org/community/releases/openvpn-2.2.2.tar.gz

安装openssl

yum -y install openssl

记录下openssl的版本号,一会有用,我这里安装的openssl-0.9.8e-20.el5.x86_64版本

安装lzo

tar xzvf lzo-2.06.tar.gz
cd lzo-2.06
./configure
make && make check && make install

安装OpenVPN

.tar.gz
cd openvpn-
./configure --prefix=/usr/local/openvpn --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib \
--with-ssl-headers=/usr/local/include/openssl --with-ssl-lib=/usr/local/lib
make && make install

3、制作OpenVPN证书key

初始话PKI

生成key变量可以采用export或者需改配置文件的形式,这里我只说采用export命令的形式!代码如下:

cd openvpn-/easy-rsa/2.0    #注意这个路径和以前的版本不太一样
.cnf openssl.cnf   #这里有三个版本的openssl的文件供你选择,这里需要选择前面我们安装的openssl版本
export D=`pwd`                        #设置路径
export KEY_CONFIG=$D/openssl.cnf       #设置openssl文件的位置
export KEY_DIR=$D/keys                 #设置生成key的保存路径
export KEY_SIZE=                                #设置生成key的加密位数
export KEY_COUNTRY=CN                #设置国家
export KEY_PROVINCE=GD                #设置省
export KEY_CITY=SZ                      #设置城市
export KEY_ORG="jsoft"               #设置组织
export KEY_EMAIL=easonjim@163.com  #设置邮箱./clean-all    #这个命令执行完成以后会创建前面设置的key保存路径  

生成ca证书和私钥

./build-ca    #执行这个命令以后按照提示操作就可以了!一路回车

生成Server端证书和私钥

./build-key-server server   #执行这个命令以后按照提示操作就可以了!一路回车,最后两个yes

生成客户端证书和私钥

/build-key client1     #client1为客户端的登录名,按照提示操作,一路回车,最后两个yes

打包证书和私钥

./build-dh     #通过这个命令创建Diffie Hellman参数
tar zcvf key.tar.gz keys
#将生成的key.tar.gz下载备用

4、OpenVPN服务器端配置

mkdir /usr/local/openvpn/etc
mkdir /usr/local/openvpn/keys/

将前面生成的如下key文件和证书文件拷到/usr/local/openvpn/keys目录下:

ca.crt、server.crt、server.key、dh1024.pem
vim /usr/local/openvpn/etc/server.conf 

添加如下内容

local 58.33.123.75
client-config-dir /usr/local/openvpn/etc/ccd       #介绍一下这个选项,这个选项是为制定的登录名使用单独的配置,比如制定固定的IP,本文就用到了这个配置,在这个目录下,创建一个用户名文件,然后写入你的需求配置,稍后会介绍
port
proto udp
dev tun
ca /usr/local/openvpn/keys/ca.crt
cert /usr/local/openvpn/keys/server.crt
key /usr/local/openvpn/keys/server.key
dh /usr/local/openvpn/keys/dh1024.pem
server 172.16.100.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 172.16.88.0 255.255.255.0"
push "route 172.16.100.0 255.255.255.0"
push "dhcp-option DNS 172.16.88.10"
client-to-client
keepalive
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
log         /var/log/openvpn.log
verb 
vim  /usr/local/openvpn/etc/ccd/client1

添加如下内容:

ifconfig-push 172.16.100.9 172.16.100.10
可能有人会想为什么要制定两个IP,这是因为openvpn只支持255. 的子网,而且252的子网只有两个IP,一个分配给客户端,一个留给服务器用.因此只能ccd目录下面的文件内容只能是:
ifconfig-push 172.16.100.1 172.16.100.2
ifconfig-push 172.16.100.5 172.16.100.6  …..

如果配置错误,会报如下错误:

Tue Jan  ::  us= read UDPv4 [ECONNREFUSED]: Connection refused (code=)

启动OpenVPN服务端:

/usr/local/openvpn/sbin/openvpn --config /usr/local/openvpn/etc/server.conf > /dev/>& &

然后将该命令写入到/etc/rc.local中           

查看是否启动成功:

netstat -lnp | grep openvpn
udp                          /openvpn 

四、OpenVPN客户端的安装配置

1、OpenVPN客户端的环境

客户端的环境和服务器端的环境一样

OS: CentOS 5.5 64bit 2.6.18

lzo version: 2.0.6(最新版本)

OpenVPN version: 2.2.2(最新版本)

2、OpenVPN客户端的安装

安装也和服务器的一样,这里就不赘述

3、OpenVPN客户端的配置

mkdir /usr/local/openvpn/etc
mkdir /usr/local/openvpn/keys/

将需要的前面打包的相关key文件放到keys目录下,比如client1用户需要copy到客户端的文件如下:

ca.crt ca.key client1.crt client1.csr client1.key

vim /usr/local/openvpn/etc/client.conf

添加如下内容:

client
dev tun
proto udp
remote
persist-key
persist-tun
ca /usr/local/openvpn/keys/ca.crt
cert /usr/local/openvpn/keys/client2.crt
key /usr/local/openvpn/keys/client2.key
ns-cert-type server
comp-lzo
verb  

启动客户端:

/usr/local/openvpn/sbin/openvpn --config /usr/local/openvpn/etc/client.conf > /dev/>& &

并将该命令写入/etc/rc.local

检查是否链接成功,已经分配的IP是否是制定的IP

ifconfig

显示如下内容:

tun0      Link encap:UNSPEC  HWaddr ---------------
          inet addr:172.16.100.9  P-t-P:172.16.100.10  Mask:255.255.255.255

五、OpenVPN服务器端iptables的设置(关键设置)

配置支持转发

# 开启路由转发功能
sed -i '/net.ipv4.ip_forward/s/0/1/' /etc/sysctl.conf
sysctl -p

配置iptables转发规则

iptables -t nat -A PREROUTING -d  -j DNAT --to-destination
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A INPUT -p udp -m udp --dport  -j ACCEPT
iptables -A  INPUT -s 172.16.100.0/255.255.255.0 -j ACCEPT

说明:将外面请求机房中58.33.123.75端口708的请求都发往公司内网的VPN客户端,打开OpenVPN的1194端口,允许网段的访问!

六、OpenVPN客户端iptables的设置(关键设置)

配置支持转发

# 开启路由转发功能
sed -i '/net.ipv4.ip_forward/s/0/1/' /etc/sysctl.conf
sysctl -p

配置iptables转发规则

iptables -t nat -A PREROUTING -s  -j DNAT --to-destination
iptables -t nat -A POSTROUTING -j MASQUERADE

说明:将源是来自58.33.123.75并且目标端口为708的请就转发到内网的192.168.100.113的708端口,这就完成了整个转发过程

七、测试端口调用是否OK

因为发布的tcp的端口,因此可以采用telnet的方式来调用,在外网找台机器,执行如下命令看看是否OK!

telnet 

如果不能连接,就需要检查VPN是否OK。Ping是个很好的工具,以及检查防火墙规则

参考:

http://blog.chinaunix.net/uid-20639775-id-3123671.html(以上内容转自此篇文章)

CentOS下OpenVPN实现公网IP映射到内网(iptables转发功能)(转)的更多相关文章

  1. 没固定公网 IP 的公司内网实现动态域名解析( 阿里云万网解析 )

    情景说明 前段时间应公司需求,需要将内网的服务映射到公网.由于公司使用的是类似家庭宽带的线路,没有固定的公网 IP 地址,所以决定使用域名来完成. 当时有几种方案: 1.花生壳:但是目前需要乱七八糟的 ...

  2. Azure PowerShell (11) 使用自定义虚拟机镜像模板,创建Azure虚拟机并绑定公网IP(VIP)和内网IP(DIP)

    <Windows Azure Platform 系列文章目录> 前提要求: 1.假设笔者捕获一个Azure虚拟机模板,命名为leistorage 关于Azure虚拟机模板,请参考下图: 2 ...

  3. 公网IP映射修改后,原先的图片访问却不行了

    描述:www与img在一个公网的nginx下时,www访问img没问题   ip:*.*.*.26 www与jimg同样还在同一组nginx,改另一个公网IP映射进来的时候,却访问不了  ip:*.* ...

  4. CentOS下OpenVPN客户端配置

    CentOS下OpenVPN客户端配置 http://liumissyou.blog.51cto.com/4828343/1762683 1,安装 yum install openvpn -y mkd ...

  5. 【干货】ECS服务器OPENVPN搭建,方便管理所有内网服务器

    [干货]ECS服务器OPENVPN搭建,方便管理所有内网服务器 使用场景 一台有外网的ECS服务器+N台无外网的ECS服务器,使用OPENVPN管理全部的ECS服务器(包括无外网的ECS服务器). 鉴 ...

  6. frp端口映射穿透内网

    前言 frp 是一个高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务,支持 TCP.UDP.HTTP.HTTPS 等协议类型,并且 web 服务支持根据域名进行路由转发. Github: ...

  7. H3C SecPath U200-S 如何在内网使用外网IP地址访问内网服务器

    H3C SecPath U200-S 如何在内网使用外网IP地址访问内网服务器 ------------------------------------------------------------ ...

  8. NAT、端口映射、内网穿透、公网IP都是啥

    原文地址:https://wuter.cn/1756.html/ 一.IPv4地址 IP协议是为计算机网络相互连接进行通信而设计的协议,它是能使连接到网上的所有计算机网络实现相互通信的一套规则. 这里 ...

  9. Windows下主机名和IP映射设置

    如果需要添加域名和IP的对应关系可以在以下地方进行修改. 打开系统目录:c:/windows/system32/drivers/etc找到hosts文件,打开hosts文件并在最后面添加一条记录 例如 ...

随机推荐

  1. vue-混入mixin

    混入 基础 混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 例子: // ...

  2. shell中的IFS和$*变量

    本文转载自http://blog.chinaunix.net/uid-22566367-id-381955.html 自我记录内容.在工程中遇到了相关内容的shell脚本.在此处记录 STRING1= ...

  3. 独立服务器远程重装Linux系统

    独立服务器远程重装Linux系统 http://rashost.com/blog/remote-reinstall-linux-dedicated-server 本文介绍怎样在没有console连接, ...

  4. C基础 redis缓存访问

    引言 先说redis安装, 这里采用的环境是. Linux version --generic (buildd@lgw01-) (gcc version (Ubuntu -14ubuntu2) ) # ...

  5. 10 个打造 React.js App 的最佳 UI 框架

    10 个打造 React.js App 的最佳 UI 框架 在本文中,我们将分享一些助你打造 React.js App 最佳的 UI 框架.它们具备你所需要的基本 React 组件,以及易用的 API ...

  6. ado中dispose和close的区别,摘自网络

    Close() and Dispose() are basically the same thing on an ADO.NET connection object for providers shi ...

  7. FineReport——JS二次开发(分页预览)

    BS访问某个cpt模板,报表servlet将会将cpt文件解析成对应的html,报表内容最终转换为一个table,位于id=content-container的div中. 在模板和html页面中,他们 ...

  8. CF868F Yet Another Minimization Problem

    题目描述: 给定一个序列,要把它分成k个子序列.每个子序列的费用是其中相同元素的对数.求所有子序列的费用之和的最小值. 输入格式:第一行输入n(序列长度)和k(需分子序列段数).下一行有n个数,序列的 ...

  9. django开发项目实例2--如何链接图片和css文件(静态文件)

    在上一篇随笔里面,我们已经介绍了如何从零开始用django建立一个项目并且初步运行以来了, 现在我们就要开始写我们的html了,也就是django里面的模板了,不过这节我们只讲如何链接图片和css(静 ...

  10. HDU-1671

    Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...