在家里利用宽带花生壳架设服务器

  |   0 评论   |   1,505 浏览

作为一个程序员,如果有自己的服务器,做个svn什么的,放点代码, 做个网站,存放一些数据, 在外面通过网络能直接访问, 这也算是一个比较美好的事情吧。当然,在天朝, 就不要期望在自己的服务器上做个外网访问的网站了。除非你能不用80端口来做网站,还有人访问,否者的话, 就放弃吧。不过自己用的网站,或者测试用的, 还是没有问题的。下面就说说我自己的配置

一、前置条件

  • 一台电脑 (稳定的,性能不用太好省电,最好是台式机,你总不能天天开着笔记本放那,为了稳定性,还是放弃windows吧,server也不行,建议还是弄个linux,我对ubuntu熟悉一点, 所以就用ubuntu了。)

  • 宽带(这个就不说了,网速越快越好了,不过如果你家里的网络是小区宽带,宽带通什么的, 直接放弃吧,没有外网ip,什么都做不了, 我用的是联通的20M光纤,坑爹的联通上传速度是300k左右,在这里要痛诉一下假宽带,如果ADSL基本上都能实现的)

  • 花生壳账号 (这不需要有独立的域名, 现在绑定独立域名好像收费了,我绑定的早,免费的用的挺好,就直接上http://hsk.oray.com/去注册申请一个吧,用花生壳提供的二级域名就好了,这个主要用来获取唯一的公网IP用的)

二、获取公网IP

其实最好的方法也是最简单的方法,就是在路由器上设置, 我的路由器上也能设置, 就是丫的不稳定, 也不知道是不是花生壳免费的不稳定,反正稳定不了几天 路由器配置主要是两个地方

  1. DMZ主机

<img src="" alt="DMZ主机设置方式" />http://www.swjsj.com/wp-content/uploads/2014/12/QQ图片20141220220550.png

这个方式简单,但是正个服务器也都暴露在外网了,如果你熟悉端口, 一个一个端口映射也没有关系。

<img src="" alt="端口映射" />http://www.swjsj.com/wp-content/uploads/2014/12/QQ图片20141220221345.png

  1. 花生壳路由器配置 记得选择启用后提交哦

<img src="" alt="花生壳配置图片" />http://www.swjsj.com/wp-content/uploads/2014/12/QQ截图20141220221826.png

如果你的路由器设置上花生壳账号密码还能正常的话,那恭喜你了, 后面的东西就不用看了。

三、通过花生壳给的API,动态的提交请求, 同步域名解析地址

由于路由器的不稳定, 所以还是通过自己的程序来实现,
<a href="" target="_blank">花生壳的API说明地址http://open.oray.com/wiki/doku.php?id=%E6%96%87%E6%A1%A3:%E8%8A%B1%E7%94%9F%E5%A3%B3:http%E5%8D%8F%E8%AE%AE%E8%AF%B4%E6%98%8E

其实主要做的事情就是获取你路由器的公网IP地址: 和实际上域名映射的IP地址比较,如果不一样的,就需要提交请求, 让花生壳解析到正确的IP地址上。

参考上面的连接的地址的《例子》
1.使用URL验证
适用于浏览器或应用程序(fetch, curl, lwp-request),可以在URL中包含验证信息。
http://username:password@ddns.oray.com/ph/update?hostname=yourhostname&myip=ipaddress

这个方式在浏览器的时候调用特别有用, 但是我用nodejs的ajax异步请求的时候总是出现不能反回正确的情况。
我直接用java来模拟模拟浏览器提交了,反正特别的稳定。

2.原始HTTP GET请求
实际的HTTP请求,类似下面的代码。
其中 base-64-authorization 请使用 Base64 加密 username:password 后的字符替换。
GET /ph/update?hostname=yourhostname&myip=ipaddress HTTP/1.0
Host: ddns.oray.com
Authorization: Basic base-64-authorization
User-Agent: Oray
请注意必须使用GET请求,POST是不被允许的。
这个方法应该是一样的, 我没有试过,

我实现的方式,是通过定时器的方式, 定时1分钟执行一次。来检测IP地址是否有变化,如果有,参照API提交,并且发邮件通知, 这个域名解析不是实时生效饿, 如果你着急用, 能通过邮件,获取到IP地址也是不错的,通过IP来连接自己的主机,如果没有变化, 不做任何操作

实现中主要的代码信息

获取远程域名对应的IP地址

public static String getRemountIPByHSK() {
    Document doc = null;
    try {
        URL url = new URL(\"http://ddns.oray.com/checkip\");
        doc = Jsoup.parse(url, 10 * 1000);
        Elements es = doc.select(\"body\");
        String ipstr = es.text();
        Pattern pattern = Pattern
                .compile(\"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\"); // 正则表达式匹配格式
        Matcher matcher = pattern.matcher(ipstr);
        if (matcher.find()) {
            String srcStr = matcher.group(); // 这里得到的ip
            return srcStr;
        }
    } catch (IOException e) {
        Logger.getLogger(\"publish\").error(e.getMessage(), e);
        return getRemountIP();
    }
    return \"\";
}

获取本地路由器的IP

public static String getIPByName(String name) {
    InetAddress address = null;
    String ip = \"\";
    try {
        address = InetAddress.getByName(name);
        ip = address.getHostAddress().toString();
    } catch (Exception e) {
        Logger.getLogger(\"publish\").error(e.getMessage(), e);
    }
    return ip;
}

需要更新IP的方法 注册花生壳的时候送你的二级域名 这个一定你的申请时二级域名

public static String sendGet(String ip) {
    String result = \"\";
    BufferedReader in = null;
    try {
        // String urlNameString = url + \"?\" + param;
        String url = \"http://ddns.oray.com/ph/update?hostname=注册花生壳的时候送你的二级域名&myip=\"
                + ip;
        URL realUrl = new URL(url);
        // 打开和URL之间的连接
        URLConnection connection = realUrl.openConnection();
        // 设置通用的请求属性
        connection
                .setRequestProperty(\"Accept\",
                        \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\");
        connection.setRequestProperty(\"Connection\", \"Keep-Alive\");
        // Authorization:Basic amlzaGlqdW4yMDQ6c3dqc2o4OTAxMDM=
        connection.setRequestProperty(\"User-agent\",
                \"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)\");
        connection.setRequestProperty(\"Authorization\",\"这里为了安全,使用浏览器中提取的权限验证字符串\");
        // 建立实际的连接
        connection.connect();
        // 获取所有响应头字段
        Map<String, List<String>> map = connection.getHeaderFields();
        // 遍历所有的响应头字段
        for (String key : map.keySet()) {
            Logger.getLogger(\"publish\").info(key + \"--->\" + map.get(key));
        }
        // 定义 BufferedReader输入流来读取URL的响应
        in = new BufferedReader(new InputStreamReader(
                connection.getInputStream()));
        String line;
        while ((line = in.readLine()) != null) {
            result += line;
        }
    } catch (Exception e) {
        System.out.println(\"发送GET请求出现异常!\" + e);
        Logger.getLogger(\"publish\").error(e.getMessage(), e);
    }
    // 使用finally块来关闭输入流
    finally {
        try {
            if (in != null) {
                in.close();
            }
        } catch (Exception e2) {
            Logger.getLogger(\"publish\").error(e2.getMessage(), e2);
        }
    }
    return result;
}

其实上面的 ”这里为了安全,使用浏览器中提取的权限验证字符串“ 就是需要用到下图的这个提交方式,采用授权加密的提交方式。
如果不知道怎么计算,直接打开浏览器通过get方式请求一下(就是在地址里面输入用户密码的方式), 里面的开发工具,找到对应的请求信息直接复制下来就行了,

<a href=""><img src="" alt="QQ截图20141228002917" width="613" height="174" class="alignnone size-full wp-image-2802" />http://www.swjsj.com/wp-content/uploads/2014/12/QQ截图20141228002917.jpghttp://www.swjsj.com/wp-content/uploads/2014/12/QQ截图20141228002917.jpg

评论

发表评论

validate