用ssh跑pppd (最简单的linux vpn )

用ssh跑pppd (最简单的linux vpn )
sbaa 2003.1.10
我为了通过封了udp包的防火墙上qq
试了很多办法
用snake的socks5代理不错,可以必须外网机器是 windows
而linux下,stunnel 只是转发tcp不支持qq 的 udp
于是我想到了vpn pptpd是个很不错的,支持windows的vpn客户端
可惜要防火墙开ip转发,也不满足我的要求,

今天看到一个ssh-ppp脚本,再看了一些文章,原来竟然这么简单!!

只要你有两台linux 外网上有sshd服务,你就可以透过防火墙
建立vpn !

我家拨号的机器adsl 是动态域名 sbaa.3322.org
我公司一台linux 内网的(10.9.0.16) 通过公司的网关nat 可以访问到 sbaa.3322.org的22(ssh)

两台机器上都有pppd 条件就ok!

开始:
在家里机器上
useradd vpn
ssh-keygen
Enter file in which to save the key (/root/.ssh/identity): vpnkey

现在有了vpnkey 和vpnkey.pub
配置 sshd /etc/ssh/sshd_config
打开 RSAAuthentication yes

cp vpnkey.pub /home/vpn/.ssh/authorized_keys

把下面内容加到/etc/sudoers
Cmnd_Alias VPN=/usr/sbin/pppd
vpn ALL=NOPASSWD: VPN

本机测试一下
sudo /usr/sbin/pppd noauth
~}#?}!}!} }4}"}&} } } } }%}&V鴠'}"}(}"~}#?}!}!} }4}"}&} } } } }%}&V鴠'}"}(}"~}#?}!}!} }4}"}&} } } } }%}&V鴠'}"}(}"~}#?}!}!} }4}"}&} } } } }%}&V鴠'}"}(}"~}#?}!}!} }4}"}&} } } } }%}&V鴠'}"}(}"~}#?}!}!} }4}"}&} } } } }%}&V鴠'}"}(}"~}#?}!}!} }4}"}&} } } } }%}&V鴠'}"}(}"~}#?}!}!} }4}"}&} } } } }%}&V鴠'}"}(}"~}#?}!}!} }4}"}&} } } } }%}&V鴠'}"}(}"~}#?}!}!} }4}"}&} } } } }%}&V?
就ok

好了
到公司机器上,把刚才的vpnkey ftp 过来
测一下
看到提示符登录成功一切就ok了
ssh -l vpn -i ./vpnkey -1 -P sbaa.3322.org
Linux 2.2.14.
cool:~$ exit
logout
Connection to sbaa.3322.org closed.

建立以下脚本
vpnstart

#!/bin/sh
# VPN PPP-SSH script

# History
# 16 May 2002 j.n.pritchard@brad.ac.uk

# *******************************************

# You will need to edit in these varibles

# Server Hostname
SERVER_HOSTNAME=sbaa.3322.org

# Username on the server for VPN
SERVER_USERNAME=vpn

# SSH Private Key Location
PRIVATE_KEY_FILE=/home/bin_shi/vpnkey

# *******************************************
# You do NOT need to edit below this line unless you use the subnet 192.168.250

# VPN Network subnet (change to a different subnet if this one is in use)
VPN_SUBNET=192.168.6
# Server ppp address
SERVER_IFIPADDR=$VPN_SUBNET.1
# Client ppp address
CLIENT_IFIPADDR=$VPN_SUBNET.2

# Extra SSH Options
LOCAL_SSH_OPTS="-P -1 -i $PRIVATE_KEY_FILE"

# Path environment
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11/bin

# Command Alias'
PPPD=/usr/sbin/pppd
SSH=/usr/local/bin/ssh

if ! test -f $PPPD ; then echo "can't find $PPPD"; exit 3; fi
if ! test -f $SSH; then echo "can't find $SSH" ; exit 4; fi

case "$1" in
  start)
  # echo Starting VPN Connection
  $ updetach noauth passive pty "$ $ $ -l$ -o Batchmode=yes sudo $ nodetach notty noauth" ipparam vpn $:$
  # echo "connected."
  ;;

stop)
  # echo -n "Stopping vpn to $SERVER_HOSTNAME: "
  PID=`ps ax | grep "$ $ $ -l$ -o" | grep -v ' passive ' | grep -v 'grep ' | awk '{print $1}'`
  if [ "$" != "" ]; then
  kill $PID
  echo "disconnected."
  else
  echo "Failed to find PID for the connection"
  fi
  ;;

config)
  echo "SERVER_HOSTNAME=$SERVER_HOSTNAME"
  echo "SERVER_USERNAME=$SERVER_USERNAME"
  echo "SERVER_IFIPADDR=$SERVER_IFIPADDR"
  echo "CLIENT_IFIPADDR=$CLIENT_IFIPADDR"

*)
  echo "Usage: vpn "
  exit 1
  ;;
esac

exit 0

有些配置你可以自己改改
然后./vpnstart start
呵呵
ifconfig -a 看到 192.168.6.2了吗
ping 192.168.6.1 就是我的 sbaa.3322.org了
不错
在sbaa.3322.org上加
route add -net 10.9.0.0 netmask 255.255.248.0 gw 192.168.6.2

然后到我公司的windows机器上加
route add 192.168.6.1 mask 255.255.255.255 10.9.0.16

ping 192.168.6.1 哦卡 通的

然后qq上我的sbaa.3322.org 的socks5代理
呵呵upd包在ssh的链路里被加密封装了

防火墙被穿过了。

这个办法真好!可惜不是我自己发现的,我也是看到网上有ssh-ppp脚本
再研究了一下

呵呵!

linux上的vpn居然这么简单 !
大家有什么高见,还希望多多交流!

(0)

相关推荐

  • 用ssh跑pppd (最简单的linux vpn )

    用ssh跑pppd (最简单的linux vpn ) sbaa 2003.1.10 我为了通过封了udp包的防火墙上qq 试了很多办法 用snake的socks5代理不错,可以必须外网机器是 windows 而linux下,stunnel 只是转发tcp不支持qq 的 udp 于是我想到了vpn pptpd是个很不错的,支持windows的vpn客户端 可惜要防火墙开ip转发,也不满足我的要求, 今天看到一个ssh-ppp脚本,再看了一些文章,原来竟然这么简单!! 只要你有两台linux 外网

  • Windwos下使用winscp和批处理实现通过SSH端口上传文件到Linux服务器上

    Windwos下使用winscp和批处理实现通过SSH端口上传文件到Linux服务器上 今天同事想在windows上使用winscp上传文件到linux服务器上,又想偷懒想使用批处理来进行上传,还好只固定上传一个php文件,多了还真不好搞. 1.下载winscp 大家可以去网上自己找,我把winscp安装在c:下的 2.把要执行的命令保存到文件winscp.bat里,这个winscp.bat可以自己创建,我是放在d:下的. winscp.bat脚本内容: 复制代码 代码如下: option co

  • 简单了解linux终端创建文件的2种常用方法

    我们都知道可以用mkdir命令创建一个新的目录,但更多时候如果能直接创建一个文件(普通文件)会让人感觉更愉悦:这样就可以不用在去打开一个专门的创建文本文件的软件,然后还要设置文件名,保存路径那样的繁琐了:下面就介绍一些关于在linux终端下直接创建文件的方法 方法1 我们可以使用dd命令,创建一个特定大小的文件,它存在目录/bin下.dd命令会拷贝给定的输入内容,然后将一份相同的副本写入输出. 标准输入,普通文件,设备文件都可以作为输入:标准输出,设备文件,普通文件等可以作为输出. dd命令的使

  • 简单谈谈Linux内核定时器

    软件意义上的定时器最终依赖硬件定时器来实现, 内核在时钟中断发生后检测各定时器是否到期 , 到期后的定时器处理函数将作为软中断在底半部执行 .实质上,时钟中断处理程序会 换起TIMER_SOFTIRQ软中断 ,运行当前处理器上到期的所有定时器. 总结起来还是软中断的流程 a.注册软中断处理函数 /*/linux/kernel.timer.c*/ void __init init_timers(void) -->open_softirq(TIMER_SOFTIRQ, run_timer_softi

  • 简单的Linux查找后门思路和shell脚本分享

    每个进程都会有一个PID,而每一个PID都会在/proc目录下有一个相应的目录,这是linux(当前内核2.6)系统的实现. 一般后门程序,在ps等进程查看工具里找不到,因为这些常用工具甚至系统库在系统被入侵之后基本上已经被动过手脚(网上流传着大量的rootkit.假如是内核级的木马,那么该方法就无效了).因为修改系统内核相对复杂(假如内核被修改过,或者是内核级的木马,就更难发现了),所以在/proc下,基本上还都可以找到木马的痕迹. 思路:在/proc中存在的进程ID,在 ps 中查看不到(被

  • 一个简单的linux命令 mv

    mv命令是用于移动文件或者将文件改名 一.命令格式: mv [选项] 源文件或目录 目标文件或目录 二.命令参数: -b :若需覆盖文件,则覆盖前先行备份. -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖: -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖! -u :若目标文件已经存在,且 source 比较新,才会更新(update) -t  : --target-directory=DIRECTORY move all SOURCE ar

  • 一个简单的linux命令 cp

    cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是在shell脚本中执行cp时,没有-i参数时不会询问是否覆盖.这说明命令行和shell脚本的执行方式有些不同. 命令格式 cp [选项]- [-T] 源 目的 命令参数 -a, –archive 等于-dR –preserve=all –backup[=CONTROL 为每个已存在的目标文件创建备份

  • 一个简单的linux命令 touch

    linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. 命令格式 touch [选项]- 文件- 命令参数 -a 或–time=atime或–time=access或–time=use 只更改存取时间. -c 或–no-create 不建立任何文档. -d 使用指定的日期时间,而非现在的时间. -f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题. -m 或–time=mtime或–time=modify 只更改

  • 一个简单的linux命令 cat

    cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 命令格式 cat [选项] [文件]- 命令功能 cat主要有三大功能: 1.一次显示整个文件:cat filename 2.从键盘创建一个文件:cat > filename 只能创建新文件,不能编辑已有文件. 3.将几个文件合并为一个文件:cat file1 file2 > file 命令参数 -A, –show-all 等价于 -vE

  • 简单实现linux聊天室程序

    花了很长时间用来练习掌握linux上socket的一个聊天室程序,可以实现的哦. 具体代码如下 代码一: #ifndef _I_H #define _I_H #include <math.h> #include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <unistd.h> #include <

随机推荐