«

openwrt 建造vpn 隧道通过ddns

学长 发布于 阅读:4902 网络


上一篇讲过怎么在newifi中建立vpn在没有固定IP的拨号环境下。

后来实际运行起来效果不是很满意。原因归根到底是路由需要插一个小U盘。。。这也不是什么大问题,但是我的U盘插上去太久总是变成只读模式,或者在偶尔的断电重启后不得不插拔U盘才能让程序继续工作。

不出现断电的情况下系统是稳定但是linux或者newifi自身U盘的保护算法问题使得每次重启后就出现种种的问题。。。我最终决定把所有要用的东西都写到路由里而不是把程序安装在U盘上。。。

默认的安装包都是安装到U盘中的.iso镜像中,这是个好的方法在不增加生产硬件前提下解决了路由的闪存太小。。。但是我实际用起来linux糟糕的文件管理。。。或许因为U盘格式不是ext2。。。


言归正传

这次只需要两个核心软件

pptpd和ddns-scripts

但是这两个软件都没法直接从应用中心找到,即使找到也无法安装到路由自身闪存中


首先还是要插U盘的,开启SSH, 官方应用中有,如果没有了这里是链接 http://pan.baidu.com/s/1boxfy4f

后发现Newifi Mini 开启SSH 不需要安装这些,直接在浏览器中输入http://192.168.99.1/newifi/ifiwen_hss.html  看到返回success  说明开启SSH


然后要做的就是开启openwrt 中的opkg 功能

ssh登陆路由 输入root和密码

直接输入下面的代码 然后加回车,更改opkg.conf设置


mv /etc/opkg.conf /etc/opkg.conf.orig
cat > /etc/opkg.conf <<EOF
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
src/gz barrier_breaker_base http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/base
#src/gz barrier_breaker_extra http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/extra
src/gz barrier_breaker_luci http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/luci
src/gz barrier_breaker_management http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/management
src/gz barrier_breaker_oldpackages http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/oldpackages
src/gz barrier_breaker_packages http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/packages
src/gz barrier_breaker_routing http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/routing
src/gz barrier_breaker_telephony http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/telephony
arch all 1
arch noarch 1
arch ralink 10 
arch ramips_24kec 20
EOF

然后更新opkg列表



opkg update



开始安装pptpd



opkg install pptpd



然后安装ddns-scripts
opkg install ddns-scripts

opkg info '关键词*'可以搜索想要的软件



设置pptpd
先去 vi /etc/config/pptpd
键入i 开始编辑
开启pptpd
option 'enabled' '1' 这一项改成1表示开启服务。
option 'localip' ''  最后的单引号中的地址改成路由的内网地址,当然你有公网地址就直接用啦。。。
option 'remoteip' '' 地址段应该跟路由的地址在同一段上。
config 'login' 这一项跟newifi的不同,它支持多个用户,需要多个用户按照这样的格式写

config 'login'
        option 'username' '用户一'
        option 'password' '用户一密码'

config 'login'
        option 'username' '用户二'
        option 'password' '用户二密码'
修改完成后修改VPN的dns和mtu参数
vi /etc/ppp/options.pptpd
mtu和mru 我设置的是1200,根据具体网络环境决定,一般跨国vpn在1400以下这样才可以
chap-secrets虽然是记录用户信息的文件但是这里的用户信息是根据config下的信息产生的,如果不同会被config中的信息覆盖掉
所有的设置别忘了esc 后输入大写的两个Z保存,或者你也可以下载安装openssh-sftp-server,直接通过SFTP修改更直观些。

  opkg -d ram install openssh-sftp-server
  mkdir -p /usr/libexec
  cp /tmp/usr/lib/sftp-server /usr/libexec/
SecureCRT套件中的SecureFX就有SFTP功能

设置防火墙记录
vi /etc/firewall.user
增加 
iptables -I FORWARD -i ppp+ -j ACCEPT
并且在 vi /etc/config/firewall
中添加 
config rule
 option name 'PPTPD'
 option src 'wan'
 option proto 'tcp'
 option dest_port '1723'
 option target 'ACCEPT'  
重启以下防火墙和pptpd服务。
/etc/init.d/pptpd restart
 
/etc/init.d/firewall restart
如果你设置出错请不要保存直接esc 到输入命令状态输入 :q! 不保存退出,vi没有鼠标界面光标只随着键盘方向键走。
下面开始设置DDNS
vi /usr/lib/ddns/dynamic_dns_updater.sh
文件找到 
#some constants
在103行
将下面一句中的
 
 retrieve_prog="/usr/bin/wget -O - ";
改成
if [ -z "$retrieve_prog" ]
then
 retrieve_prog="/usr/bin/wget -O - ";
fi 
然后修改配置文件
vi /etc/config/ddns 
上面一大段注释可以删掉了反正没人读。。。浪费容量。。。
并且可以注释掉这一段:
option service_name    "dyndns.org"
option domain       "mypersonaldomain.dyndns.org"
option username     "myusername"
option password     "mypassword" 
option use_https    "0" 
这一段是dyndns.org的登陆方式,相对于DNSPOD来说登陆方式账号和密码都是明文。。。
option enabled     "1" 打开ddns服务。。。 
在配置文件的最后加上dnspod配置
    option retrieve_prog '/usr/bin/curl -k -X POST https://dnsapi.cn/Record.Modify -d '
    option update_url 'login_token=[LOGIN_TOKEN]&format=json&domain_id=[DOMAIN_ID]&record_id=[RECORD_ID]&sub_domain=[DOMAIN]&value=[IP]&record_type=[RECORD_TYPE]&record_line=%e9%bb%98%e8%ae%a4'
    option login_token 'API登陆用token'
    option domain_id '域名ID'
    option record_id '域名记录ID'
    option domain '子域名'
    option record_type '解析类型'
登陆用token在dnspod管理控制台--用户中心--安全设置--API Token--查看里申请,务必妥善保管。具体填写到设置文件的格式是 ID,API 本文中所有需要修改保存的符号都是英文符号。
域名ID 和 域名记录ID 具体获取方法在这里 https://support.dnspod.cn/Kb/showarticle/tsid/19
如果你觉得麻烦又不绿色,https://support.dnspod.cn/Support/api 中官方客户端是绿色的,可以查看这个两个ID,但是不能复制。。。
子域名应与域名记录ID对应,解析类型不出意外是 A。。。目前没见过那个运营商给AAAA IPv6地址的。。。
输入
/usr/lib/ddns/dynamic_dns_updater.sh myddns 
测试上传
/etc/init.d/ddns restart
重启ddns服务,最好亲眼看到IP地址变更了再确认全部完成。
15.05以后版本ddns脚本自带支持post
配置文件中
update_url 部分改成
update_url '--request POST https://dnsapi.cn/Record.Modify --data login_token=[LOGIN_TOKEN]&format=json&domain_id=[DOMAIN_ID]&record_id=[RECORD_ID]&sub_domain=[DOMAIN]&value=[IP]&record_type=[RECORD_TYPE]&record_line=%e9%bb%98%e8%ae%a4 
如果像继续使用curl需要开启 USE_CURL=1
若想让curl支持post需要在
/usr/lib/ddns/dynamic_dns_function.sh
__PROG="/usr/bin/curl -RsS -o $DATFILE --stderr $ERRFILE"
后面加入
if [ $use_post -eq 1 ]; then

export __POST="$__URL"

__PROG="$__PROG -d '${__POST#*\?}'"

__URL="${__POST%\?*}"

fi
并在配置文件/etc/config/ddns中声明
option use_post '1' 
并且开起ddns服务
/etc/init.d/ddns enable


扫描二维码,在手机上阅读