3月 28

[记录]内网穿透 frp

云服务器性能高的费用太高,特别是学习ai(人工智能后)。内网的实体服务器性价比高,但是访问和使用不方便。
现在开始使用frp内网穿透服务,将内网服务器映射到公网。特此记录。
https://github.com/fatedier/frp
安装和配置都很简单。启动服务器和客户段即可。
服务器防火规则
#### frp nat
# bind
-A INPUT -p tcp -m tcp –dport 7000 -j ACCEPT
# ssh
-A INPUT -p tcp -m tcp –dport 7022 -j ACCEPT
# mysql
-A INPUT -p tcp -m tcp –dport 33306 -j ACCEPT
####
# bind
-A OUTPUT -p tcp -m tcp –sport 7000 -j ACCEPT
# ssh
-A OUTPUT -p tcp -m tcp –sport 7022 -j ACCEPT
# mysql
-A OUTPUT -p tcp -m tcp –sport 33306 -j ACCEPT

5月 22

centos7搭建sftp服务器

为了安全起见搭建sftp服务器。网上使用internal-sftp的方案很多都是照抄,在centos7没有跑通。
还有两个软件MySecureShell和proftpd。MySecureShell已经测试成功,proftpd没有试,看网上介绍也很简单好用。
我的主要步骤记录。安装就不写了。
新建用户名在/etc/passwd的格式。(推荐使用sftp-user create 命令创建新用户)
testsftp:x:999:999::/home/sftp/test:/bin/MySecureShell
配置部分
# cat /etc/ssh/sftp_config


	GlobalDownload		50k	#total speed download for all clients
					# o -> bytes   k -> kilo bytes   m -> mega bytes
	GlobalUpload		0	#total speed download for all clients (0 for unlimited)
	Download 		5k	#limit speed download for each connection
	Upload 			0	#unlimit speed upload for each connection
	StayAtHome		true	#limit client to his home
	VirtualChroot		true	#fake a chroot to the home account
	LimitConnection		10	#max connection for the server sftp
	LimitConnectionByUser	3	#max connection for the account
	LimitConnectionByIP	2	#max connection by ip for the account
	IdleTimeOut		5m	#(in second) deconnect client is idle too long time
	ResolveIP		true	#resolve ip to dns
	HideNoAccess		true	#Hide file/directory which user has no access



       StayAtHome true
	HideNoAccess		true	#Hide file/directory which user has no access
       UserFullPath false

重启sshd服务,大功告成。

2月 26

iPhone 手机控制linux服务器,swift2语言使用pickerview控件源码

之前的写的“iPhone 手机控制linux服务器程序源码”(http://www.simonzhang.net/?p=2861 )。开启时间使用textfidld,太麻烦了。就保留常用的几个时间即可。所以改为使用pickerview控件。控制没有使用故事板,直接代码控制位置。源码如下,其他部分使用之前的代码。iphone6调试正常。

//
//  door.swift
//  mydoor
//
//  Created by zhangzimeng on 16/1/6.
//  Copyright © 2016年 com. All rights reserved.
//

import UIKit
import Alamofire
import Crypto

class ViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate {
    var timePicker:UIPickerView!
    var buildString = ["3秒", "30分钟" , "1小时", "2小时", "3小时", "4小时"]
    var buildInt = ["3", "1800" , "7200", "7200", "10800", "14400"]
    let kk = "09999999999999"
    let url = "http://www.simonzhang.net/door?"
    
    @IBAction func dangdang(sender: AnyObject) {
        // 获取要开发的时间
        let row:Int = self.timePicker.selectedRowInComponent(0)
        let getSec=buildInt[row]
        // 获取当前两位小时和分
        let Hour:NSDate = NSDate()
        let Min:NSDate = NSDate()
        let dateForm=NSDateFormatter()
        dateForm.dateFormat="HH"
        let getHour=dateForm.stringFromDate(Hour)
        dateForm.dateFormat="mm"
        let getMin=dateForm.stringFromDate(Min)
        // 拼接要加密的穿
        let ss=kk+getHour+getMin
        let authMd5 = ss.MD5
        // 拼接要访问的字符串
        let doorUrl = url+"se="+getSec+"&au="+authMd5!
        // 开始访问
        var returnText = ""
        Alamofire.request(.GET, doorUrl)
            .responseString{ openStatus in
                if openStatus.result.value == "成功"{
                    returnText="成功"
                }else{
                    returnText="失败"
                }
                UIAlertView(title: "敲门结果", message: returnText,
                    delegate: nil, cancelButtonTitle: "确定").show()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        timePicker=UIPickerView()
        // 定义位置
        self.timePicker.frame = CGRectMake(120, 100, 150, 200)
        // 绑定数据
        self.timePicker.delegate=self
        self.timePicker.dataSource=self
        //设置选择框的默认值
        timePicker.selectRow(3,inComponent:0,animated:true)
        //添加到界面中
        self.view.addSubview(timePicker)
    }
    
    //设置选择框的列数为1列,继承于UIPickerViewDataSource协议
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }
    
    // 返回要显示文字的列表
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if (pickerView.tag == 1){
            return buildString.count
        }else{
            return buildString.count
        }
    }
    
    // 返回显示内容
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if (pickerView.tag == 1){
            return "\(buildString[row])"
        }else{
            return "\(buildString[row])"
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

2月 15

iptables 开启 icmp

在debian的操作系统中做iptables。要求限制的比较严,出入都要过滤,内网可以ping通。
网上的规则,但还是ping不通
-A INPUT -s 192.168.1.0/24 -p icmp -j ACCEPT
-A OUTPUT -d 192.168.1.0/24 -p icmp -j ACCEPT
通过抓包看到icmp-type使用0和8
ping1
ping2
将规则修改为如下,可以ping通了
-A INPUT -s 192.168.1.0/24 -p icmp -m icmp –icmp-type 8 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -p icmp -m icmp –icmp-type 0 -j ACCEPT
-A OUTPUT -d 192.168.1.0/24 -p icmp -m icmp –icmp-type 0 -j ACCEPT
-A OUTPUT -d 192.168.1.0/24 -p icmp -m icmp –icmp-type 8 -j ACCEPT

但是127.0.0.1还需要添加。如果简单的直接出去的不做限制,就比较方便了。icmp还有很多其他类型,需要根据实际业务编写。

这是一个完整的ICMP类型的列表:Table C-1. ICMP类型 见http://baike.baidu.com/view/30564.htm