CentOS下OpenVPN实现公网IP映射到内网(iptables转发功能)(转)
说明:这种方案的实现前提是必须要有一台拥有公网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转发功能)(转)的更多相关文章
- 没固定公网 IP 的公司内网实现动态域名解析( 阿里云万网解析 )
情景说明 前段时间应公司需求,需要将内网的服务映射到公网.由于公司使用的是类似家庭宽带的线路,没有固定的公网 IP 地址,所以决定使用域名来完成. 当时有几种方案: 1.花生壳:但是目前需要乱七八糟的 ...
- Azure PowerShell (11) 使用自定义虚拟机镜像模板,创建Azure虚拟机并绑定公网IP(VIP)和内网IP(DIP)
<Windows Azure Platform 系列文章目录> 前提要求: 1.假设笔者捕获一个Azure虚拟机模板,命名为leistorage 关于Azure虚拟机模板,请参考下图: 2 ...
- 公网IP映射修改后,原先的图片访问却不行了
描述:www与img在一个公网的nginx下时,www访问img没问题 ip:*.*.*.26 www与jimg同样还在同一组nginx,改另一个公网IP映射进来的时候,却访问不了 ip:*.* ...
- CentOS下OpenVPN客户端配置
CentOS下OpenVPN客户端配置 http://liumissyou.blog.51cto.com/4828343/1762683 1,安装 yum install openvpn -y mkd ...
- 【干货】ECS服务器OPENVPN搭建,方便管理所有内网服务器
[干货]ECS服务器OPENVPN搭建,方便管理所有内网服务器 使用场景 一台有外网的ECS服务器+N台无外网的ECS服务器,使用OPENVPN管理全部的ECS服务器(包括无外网的ECS服务器). 鉴 ...
- frp端口映射穿透内网
前言 frp 是一个高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务,支持 TCP.UDP.HTTP.HTTPS 等协议类型,并且 web 服务支持根据域名进行路由转发. Github: ...
- H3C SecPath U200-S 如何在内网使用外网IP地址访问内网服务器
H3C SecPath U200-S 如何在内网使用外网IP地址访问内网服务器 ------------------------------------------------------------ ...
- NAT、端口映射、内网穿透、公网IP都是啥
原文地址:https://wuter.cn/1756.html/ 一.IPv4地址 IP协议是为计算机网络相互连接进行通信而设计的协议,它是能使连接到网上的所有计算机网络实现相互通信的一套规则. 这里 ...
- Windows下主机名和IP映射设置
如果需要添加域名和IP的对应关系可以在以下地方进行修改. 打开系统目录:c:/windows/system32/drivers/etc找到hosts文件,打开hosts文件并在最后面添加一条记录 例如 ...
随机推荐
- Linux typeof【转】
转自:http://blog.csdn.net/xiaofeng_yan/article/details/5248633 今天偶然又看到了typeof这个东西,只知道它大概是返回变量的类型,后来上网查 ...
- 【设计模式】原型模式(Prototype)
摘要: 1.本文将详细介绍原型模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入原型模式 2. 原型模式的概念及优缺点介绍 3. 原型模式对拷贝的使用 4. 原型模式在A ...
- 2015多校第6场 HDU 5355 Cake 贪心,暴力DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 题意:给你n个尺寸大小分别为1,2,3,…,n的蛋糕,要求你分成m份,要求每份中所有蛋糕的大小之 ...
- C核心 那些个关键字
概述 - C语言老了 目前而言(2017年5月12日) C语言中有 32 + 5 + 7 = 44 个关键字. 具体如下 O(∩_∩)O哈哈~ -> C89关键字 char short int ...
- [New learn] 设计模式思考
本文是对上文[New learn] 设计模式的思考总结 1.大框架 无论应用使用多少种设计模式和技巧,此模式都是应用的大框架.下图为本项目的基本架构图: 1.上图中大框架为经典的MVC模式. 2.Co ...
- ie6、ie7下overflow失效
如果父对象有overflow:hidden属性,子对象中的position属性是relative或者absolute, 那么在ie6和ie7下父对象的overflow会失效,解决办法是给父对象加rel ...
- 在Mysql中插入百万级别数据的方法
首先,建立部门表和员工表: 部门表: create table dept( id int unsigned primary key auto_increment, deptno mediumint u ...
- [转]nginx启动期都做了哪些事
nginx是个多进程web容器,不同的配置下它的启动方式也是不同的,这里我只说说最典型的启动方式. 它有1个master进程,和多个worker进程(最优配置的数量与CPU核数相关).那么,首先我们要 ...
- Combination Sum I&&II(经典的回溯算法题)
I: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C w ...
- 为什么很多国内公司不使用 jQuery 等开源 JS 框架(库),而选择自己开发 JavaScript 框架?
http://www.zhihu.com/question/20099586/answer/13971670 我对公司JAVASCRIPT框架的定位思考: