当我们有一个本地服务又想暂时对外提供的时候,发现机子在内网。这个时候我们刚好手上有台VPS,那么接下来我们就来尝试下穿透内网对外提供
主机名 IP VPN IP 备注
VPS 外网 192.168.31.133 192.168.0.1 外网VPS
server 内网 192.168.137.2 192.168.0.234 VPN客户端
1.VPS开启VPN,我们选择pptp比较简单。
需要安装ppp pptpd 还需要支持iptables(安装iptables为了做nat,基本都带iptables)
vps情况如下
[root@localhost ~]# cat /etc/issue
CentOS release 5.5 (Final)
[root@localhost ~]# uname -a
Linux MiWiFi-R1D 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:14 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
版本为centos 5.5 内核为2.6.18.
ps内核版本在2.6.15后的默认都已经有了MPPE(Microsoft Point to Point Encryption,微软点对点加密)补丁,所以不需要再安装dkms和kernel_ppp_mppe内核补丁。
1)安装pptp vpn服务
a.查看是否有ppp,iptables
[root@localhost ~]# rpm -qa|grep iptables
iptables-1.3.5-5.3.el5_4.1
iptables-ipv6-1.3.5-5.3.el5_4.1
[root@localhost ~]# rpm -qa|grep ppp
rp-pppoe-3.5-32.1
ppp-2.4.4-2.el5
可以看到是支持ppp和iptables,否则就yum install安装
ppp-2.4.4-2.el5
iptables-1.3.5-5.3.el5_4.1
b.查看是否支持安装pptp
网上一般2个方法,一个看知否支持
[root@localhost ~]# modprobe ppp-compress-18 && echo ok////////////问题点////////////////
ok
(用模块方式支持MPPE加密模式浏览,如果内核支持检测不到。)显示“ok”则表明通过。
[root@localhost ~]# cat /dev/net/tun
cat: /dev/net/tun: File descriptor in bad state
上述两条只要一条通过,就能安装pptp。
c.安装pptp
安装 pptpd
加入 yum 源
rpm -Uvh http://poptop.sourceforge.net/yum/stable/rhel5/pptp-release-current.noarch.rpm
安装 pptpd
yum install pptpd
[root@localhost proc]# yum list|grep pptpd
pptpd.x86_64 1.4.0-1.rhel5 installed
没装直接
yum install
2)配置pptp vpn服务
主配置文件/etc/pptpd.conf
选项文件/etc/ppp /options.pptpd
帐号文件/etc/ppp/chap-secrets
pptpd –-help
specified in the config file (default config file: /etc/pptpd.conf).
可以看到pptp配置文件位于/etc/pptpd.conf
a.主配置文件/etc/pptpd.conf
先看看默认配置
[root@localhost proc]#grep -v "#" /etc/pptpd.conf
option /etc/ppp/options.pptpd
logwtmp
localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245
可以看出VPNSERVER的虚拟ip为192.168.0.1
vpnclient获取的ip段位192.168.0.234-192.168.0.245
b.选项配置文件/etc/ppp /options.pptpd
[root@localhost proc]# grep -v "#" /etc/ppp/options.pptpd
可配置DNS等
ms-dns 8.8.8.8
c.账号文件/etc/ppp/chap-secrets
# client server secret IP addresses
osvpnuser01 ppptpd 123456 *
test pptpd 1234 *
账号 服务名(在option.pptpd)密码 可登录ip(*表示没限制)
d.启动pptpdvpn并设置开机启动,并开启ip_forward(因为下面要使用到iptables)
1)开启ip_forward
修改/etc/sysctl.conf文件的ip_forward=1
vi /etc/sysctl.conf
然后使其生效
sysctl –p
2)开启pptpvpn并开机启动
[root@MiWiFi-R1D ~]# service pptpd start
Starting pptpd: [ OK ]
chkconfig开机启动服务
[root@MiWiFi-R1D ~]# chkconfig –level 345 pptpd on
[root@MiWiFi-R1D ~]# chkconfig –list|grep pptpd
pptpd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
我们可以看到
netstat nltp |grep pptpd 可以看到 1723端口
[root@localhost proc]# netstat -nltp|grep pptpd
tcp 0 0 0.0.0.0:1723 0.0.0.0:* LISTEN 4427/pptpd
—————-到这里 ,pptpvpn部分配置完成!!!路由和iptables部分我们稍后配置
2.配置VPSclient,假如我们客户端也为centos 5.5 linux的pptp client稍微复杂点
1)需要装ppp,pptp.src.rpm包含pptp和pptp-debuginfo
检查是否有ppp
rpm -qa|grep ppp
检查是否安装pptp
[root@localhost ~]# rpm -qa|grep pptp
pptp-debuginfo-1.7.2-3
pptp-1.7.2-3
a.安装ppp直接
yum install ppp
b.而安装pptp和pptp-debuginfo
下载pptp-1.7.2-3.rhel5.src.rpm 源码rpm包安装,解决依赖关系
#wget http://nchc.dl.sourceforge.net/project/pptpclient/pptp/pptp-1.7.2/pptp-1.7.2-3.rhel5.src.rpm
#rpmbuild pptp-1.7.2-3.rhel5.src.rpm #.src.rpm包的安装方法
#cd /usr/src/redhat/RPMS/x86_64
[root@localhost x86_64]# ls
pptp-1.7.2-3.x86_64.rpm pptp-debuginfo-1.7.2-3.x86_64.rpm
#rpm –ivh 安装这两个rpm包
2)pptp vpn client端配置
你会发现可以使用pptpseyup命令进行客户端配置
#pptpsetup –create mytesevpn –server 192.168.31.131 –username test –password 1234
#cd /etc/ppp/peers
[root@localhost ~]# cat /etc/ppp/peers/mytestvpn
# written by pptpsetup
pty "pptp 192.168.31.133 –nolaunchpppd"
lock
noauth
nobsdcomp
nodeflate
name test
remotename mytestvpn
ipparam mytestvpn
修改/etc/ppp/peers/mytestvpn
注释掉noauth
添加
require-mppe-128
refuse-pap
refuse-chap
refuse-eap
refuse-mschap
3)连接vpn
#cp /usr/share/doc/ppp-2.4.4/scripts/pon /usr/sbin/
#cp /usr/share/doc/ppp-2.4.4/scripts/poff /usr/sbin/
#chmod +x /usr/sbin/pon /usr/sbin/poff
将这两个命令复制到path环境下,
执行pon mytestvpn拨号
[root@localhost /]# pon mytestvpn
[root@localhost /]# ficonfig ppp0
-bash: ficonfig: command not found
[root@localhost /]# ifconfig ppp0
ppp0 Link encap:Point-to-Point Protocol
inet addr:192.168.0.234 P-t-P:192.168.0.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1496 Metric:1
RX packets:6 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:60 (60.0 b) TX bytes:66 (66.0 b)
执行poff mytestvpn 断开拨号
———————–客户端vpn拨号完成,接下来就开始介绍iptables配置
———–测试结果———————————————————-
我们可以看到
在VPS上我们只需要
iptables -t nat -A PREROUTING -d 192.168.31.133 -p tcp –dport 333 -j DNAT –to 192.168.0.234:22
iptables –t nat –A POSTROUTING –d 192.168.0.234 –p tcp –dport 22 –j SNAT –to 192.168.0.1
将内网服务器的VPN对应的IP端口映射出去,就能通过访问外网192.168.31:333访问到内网了。
[root@MiWiFi-R1D ~]# iptables -t nat -A PREROUTING -d 192.168.31.133 -p tcp –dport 333 -j DNAT –to 192.168.0.234:22
[root@MiWiFi-R1D ~]# iptables -t nat -A POSTROUTING -d 192.168.0.234 -p tcp –dport 22 -j SNAT –to 192.168.0.1
测试结果
Connecting to 192.168.31.133:333…
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Tue Dec 16 22:20:02 2014 from 192.168.0.1
[root@localhost ~]# ls
anaconda-ks.cfg Desktop install.log install.log.syslog
[root@localhost ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:8C:07:7D
inet addr:192.168.137.2 Bcast:192.168.137.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe8c:77d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4769 errors:0 dropped:0 overruns:0 frame:0
TX packets:3344 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:455890 (445.2 KiB) TX bytes:409449 (399.8 KiB)
[root@localhost ~]#
===========下面扩展====================
当我拥有这样一台VPNCLIENT以后,假如他在DMZ区,网段内一大堆服务器,那么我们只需要在vpnclient代理所有vpn段ip到内网的访问就能进行登陆。
1.双重映射,内网vpn客户端192.168.137.2映射一次,然后再通过vps这vpn服务器映射一次
先在vpnclient映射一次,比如192.168.137.1的3389端口
1)vpn client端
[root@MiWiFi-R1D ~]# iptables -t nat -A PREROUTING -d 192.168.0.234 -p tcp –dport 3389 -j DNAT –to 192.168.137.1:3389
[root@MiWiFi-R1D ~]# iptables -t nat -A POSTROUTING -d 192.168.137.1 -p tcp –dport 3389 -j SNAT –to 192.168.137.2
2)vpn server端
[root@MiWiFi-R1D ~]# iptables -t nat -A PREROUTING -d 192.168.31.133 -p tcp –dport 3389 -j DNAT –to 192.168.0.234:3389
[root@MiWiFi-R1D ~]# iptables -t nat -A POSTROUTING -d 192.168.0.234 -p tcp –dport 3389 -j SNAT –to 192.168.0.1
3)于是乎流量就是这样
192.168.31.133:3389>192.168.0.234:3389>192.168.137.1:3389
2.使用通过这台内网vpn客户端(192.168.137.2)进内网
1)开启ip_forward
修改/etc/sysctl.conf文件的ip_forward=1
vi /etc/sysctl.conf
然后使其生效
sysctl -p
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
2)用到的工具还是我们的iptables
这里需要在client上做SNAT
iptables -t nat -A POSTROUTING -d 192.168.137.0/24 -j SNAT –to 192.168.137.2
[root@localhost ~]# iptables -t nat -L|grep 192.168.137.0
SNAT all — anywhere 192.168.137.0/24 to:192.168.137.2
3)到vpn Server添加静态路由
route add -net 192.168.137.0 netmask 255.255.255.0 gw 192.168.0.234192.168.137.0 192.168.0.234
[root@MiWiFi-R1D ~]# route –n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.137.0 192.168.0.234 255.255.255.0 UG 0 0 0 ppp0
4)我们只需要客户端接入vpn就能链接内网所有机器了
流量导向 最终客户机>—–vpn—->vpn网关(vpnserver)>内网vpn客户端>—iptables—->192.168.137.0/24
http://www.360doc.com/content/11/0416/17/2104556_110100707.shtml
http://os.51cto.com/art/201003/191707.htm
下一篇: OpenSSL原理及基本使用