├── config └── Port.go /config: -------------------------------------------------------------------------------- 1 | # default scan port 2 | Port: 80 3 | 4 | # timeout 5 | Timeout: 2 6 | 7 | # scan 8 | # ip 9 | # 127.0.0.1 10 | # ip-ip 11 | # 127.0.0.1-127.0.0.2 12 | # ip: port 13 | # 127.0.0.1:80 14 | # ip-ip: port 15 | # 127.0.0.1-127.0.0.2:80 16 | # ip: port-port 17 | # 127.0.0.1:80-81 18 | # ip-ip: port-port 19 | # 127.0.0.1-127.0.0.2:80-81 20 | #127.0.0.1-127.0.0.10:0-5;127.0.0.1-127.0.0.5:1-10 21 | 127.0.0.1:80 -------------------------------------------------------------------------------- /Port.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net" 6 | "time" 7 | "strings" 8 | "strconv" 9 | "io" 10 | "os" 11 | "bufio" 12 | ) 13 | 14 | type ipf struct { 15 | ip string 16 | port uint16 17 | flag bool 18 | } 19 | 20 | type Exception struct { 21 | message string 22 | code int 23 | } 24 | func (e Exception) Error() string { 25 | return e.message 26 | } 27 | 28 | func IpSformat(ip int) (string, error) { 29 | return fmt.Sprintf("%d.%d.%d.%d", uint8(ip >> 24), uint8(ip >> 16), uint8(ip >> 8), uint8(ip)) , nil 30 | } 31 | 32 | func IpIformat(ip string) (int, error) { 33 | ipSplit := strings.Split(ip, ".") 34 | if len(ipSplit) != 4 { 35 | return 0, Exception{"IP Parse Error", -10} 36 | } 37 | p1, err := strconv.Atoi(ipSplit[0]) 38 | if err != nil { 39 | return 0, Exception{"IP Parse Error", -10} 40 | } 41 | p2, err := strconv.Atoi(ipSplit[1]) 42 | if err != nil { 43 | return 0, Exception{"IP Parse Error", -10} 44 | } 45 | p3, err := strconv.Atoi(ipSplit[2]) 46 | if err != nil { 47 | return 0, Exception{"IP Parse Error", -10} 48 | } 49 | p4, err := strconv.Atoi(ipSplit[3]) 50 | if err != nil { 51 | return 0, Exception{"IP Parse Error", -10} 52 | } 53 | return p1 << 24 + p2 << 16 + p3 << 8 + p4, nil 54 | } 55 | 56 | type Config struct{ 57 | records ipTables 58 | running int 59 | timeOut int 60 | } 61 | 62 | type ipTables map[string]bool 63 | 64 | func (c *Config) Parser(fileName string) { 65 | c.records = make(ipTables) 66 | c.timeOut = 2 67 | // open file 68 | file, err := os.Open(fileName) 69 | if err != nil { 70 | panic("File not found") 71 | } 72 | reader := bufio.NewReader(file) 73 | var b byte 74 | 75 | token, key, value, lLeftRange, lRightRange, rLeftRange, rRightRange := "", "", "", "", "", "", "" 76 | defaultPort, lineNum, status := 80, 1, 0 77 | 78 | for { 79 | eof := false 80 | b, err = reader.ReadByte() 81 | if err == io.EOF && status == 0 { 82 | break 83 | }else if err == io.EOF && !eof { 84 | eof = true 85 | b = '\r' 86 | }else if err != nil { 87 | panic(fmt.Sprintf("Line %d: ", lineNum)) 88 | } 89 | if b == ' ' || b == '\t' || b == '\n' { 90 | continue 91 | } 92 | switch status { 93 | case -1: // comment 94 | if b == '\r' { 95 | key = "#" 96 | status = 100 97 | reader.UnreadByte() 98 | } 99 | case 0: // start 100 | token, key, value, lLeftRange, lRightRange, rLeftRange, rRightRange = "", "", "", "", "", "", "" 101 | if b == '#' { 102 | status = -1 103 | }else if b == ';' || b == '\r' { 104 | key = "#" 105 | status = 100 106 | reader.UnreadByte() 107 | }else if b < '0' || b > '9' { 108 | status = 5 109 | token += string(b) 110 | }else{ 111 | status = 1 112 | token += string(b) 113 | } 114 | case 1: // lLeftRange 115 | if b == '\r' || b == ';' || b == '#' { 116 | status = 100 117 | lLeftRange = token 118 | reader.UnreadByte() 119 | }else if b == ':' { 120 | status = 2 121 | lLeftRange = token 122 | token = "" 123 | }else if b == '-' { 124 | status = 3 125 | lLeftRange = token 126 | token = "" 127 | }else if (b < '0' || b > '9') && b != '.' { 128 | panic(fmt.Sprintf("Line %d: Invalid IP", lineNum)) 129 | }else{ 130 | token += string(b) 131 | } 132 | case 2: // rLeftRange 133 | if b == '\r' || b == ';' || b == '#' { 134 | status = 100 135 | rLeftRange = token 136 | reader.UnreadByte() 137 | }else if b == '-' { 138 | status = 4 139 | rLeftRange = token 140 | token = "" 141 | }else if b < '0' || b > '9' { 142 | panic(fmt.Sprintf("Line %d: Invalid Port", lineNum)) 143 | }else{ 144 | token += string(b) 145 | } 146 | case 3: // lRightRange 147 | if b == '\r' || b == ';' || b == '#' { 148 | status = 100 149 | lRightRange = token 150 | reader.UnreadByte() 151 | }else if b == ':' { 152 | status = 2 153 | lRightRange = token 154 | token = "" 155 | }else if (b < '0' || b > '9') && b != '.' { 156 | panic(fmt.Sprintf("Line %d: Invalid IP", lineNum)) 157 | }else{ 158 | token += string(b) 159 | } 160 | case 4: // rRightRange 161 | if b == '\r' || b == ';' || b == '#' { 162 | status = 100 163 | rRightRange = token 164 | reader.UnreadByte() 165 | }else if b < '0' || b > '9' { 166 | panic(fmt.Sprintf("Line %d: Invalid Port", lineNum)) 167 | }else{ 168 | token += string(b) 169 | } 170 | case 5: // config-key 171 | if b == ':' { 172 | status = 6 173 | key = token 174 | token = "" 175 | }else{ 176 | token += string(b) 177 | } 178 | case 6: // config-value 179 | if token != "" && ( b == '\r' || b == ';' || b == '#') { 180 | status = 100 181 | value = token 182 | reader.UnreadByte() 183 | }else if token == "" && ( b == '\r' || b == ';') { 184 | panic(fmt.Sprintf("Line %d: Empty Value", lineNum)) 185 | }else{ 186 | token += string(b) 187 | } 188 | case 100: // expression end 189 | if key != "" { // config 190 | switch strings.ToLower(key) { 191 | case "#": 192 | case "timeout": 193 | c.timeOut, err = strconv.Atoi(value) 194 | if err != nil || c.timeOut < 1 { 195 | panic(fmt.Sprintf("Line %d: Invalid Timeout", lineNum)) 196 | } 197 | case "port": 198 | defaultPort, err = strconv.Atoi(value) 199 | if err != nil || defaultPort < 0 || defaultPort > 65535 { 200 | panic(fmt.Sprintf("Line %d: Invalid Port", lineNum)) 201 | } 202 | default: 203 | // panic(fmt.Sprintf("Line %d: Invalid Config", lineNum)) 204 | } 205 | }else{ 206 | startIp, endIp, startPort, endPort := 0, 0, 0, 0 207 | // map ip 208 | if lRightRange != "" { // range ip 209 | startIp, err = IpIformat(lLeftRange) 210 | if err != nil { 211 | panic(fmt.Sprintf("Line %d: Invalid IP", lineNum)) 212 | } 213 | endIp, err = IpIformat(lRightRange) 214 | if err != nil { 215 | panic(fmt.Sprintf("Line %d: Invalid IP", lineNum)) 216 | } 217 | if startIp > endIp { 218 | panic(fmt.Sprintf("Line %d: Invalid IP Range", lineNum)) 219 | } 220 | }else{ // single ip 221 | startIp, err = IpIformat(lLeftRange) 222 | if err != nil { 223 | panic(fmt.Sprintf("Line %d: Invalid IP", lineNum)) 224 | } 225 | endIp = startIp 226 | } 227 | 228 | // map port 229 | if rLeftRange == "" { // default port 230 | startPort = defaultPort 231 | endPort = startPort 232 | }else if rRightRange == "" { // single port 233 | startPort, err = strconv.Atoi(rLeftRange) 234 | if err != nil { 235 | panic(fmt.Sprintf("Line %d: Invalid Port", lineNum)) 236 | } 237 | endPort = startPort 238 | }else{ // range port 239 | startPort, err = strconv.Atoi(rLeftRange) 240 | if err != nil { 241 | panic(fmt.Sprintf("Line %d: Invalid Port", lineNum)) 242 | } 243 | endPort, err = strconv.Atoi(rRightRange) 244 | if err != nil { 245 | panic(fmt.Sprintf("Line %d: Invalid Port", lineNum)) 246 | } 247 | } 248 | if startPort < 0 || startPort > 65535 || endPort < 0 || endPort > 65535 || startPort > endPort { 249 | panic(fmt.Sprintf("Line %d: Invalid Port Range", lineNum)) 250 | } 251 | 252 | // create map 253 | for ip := startIp; ip <= endIp; ip++ { 254 | ipStr, err := IpSformat(ip) 255 | if err != nil { 256 | panic(fmt.Sprintf("Line %d: Invalid Ip", lineNum)) 257 | } 258 | for port := startPort; port <= endPort; port++ { 259 | c.records[ipStr + fmt.Sprintf(":%d", port)] = false 260 | } 261 | } 262 | } 263 | if b == '\r' { 264 | lineNum++ 265 | } 266 | if status == 100 { 267 | status = 0 268 | } 269 | default: 270 | panic(fmt.Sprintf("Line %d: Unknown Config Status", lineNum)) 271 | } 272 | } 273 | } 274 | 275 | var config Config 276 | 277 | func main() { 278 | defer func() { 279 | if e := recover(); e != nil { 280 | fmt.Println(e) 281 | } 282 | }() 283 | config.Parser("config") 284 | CheckPort(&config) 285 | fmt.Println(config.records) 286 | } 287 | 288 | func CheckPort(c *Config) { 289 | for record := range c.records { 290 | for c.running >= 5 { 291 | time.Sleep(1 * time.Second) 292 | } 293 | r := strings.Split(record, ":") 294 | port,_ := strconv.Atoi(r[1]) 295 | c.running++ 296 | go check(c, r[0], uint16(port)) 297 | } 298 | 299 | for c.running != 0 { 300 | time.Sleep(1 * time.Second) 301 | } 302 | } 303 | 304 | func check(c *Config, ip string, port uint16) { 305 | connection, err := net.DialTimeout("tcp", ip + ":" + fmt.Sprintf("%d", port), time.Duration(c.timeOut) * time.Second) 306 | if err == nil { 307 | c.records[fmt.Sprintf("%s:%d", ip, port)] = true 308 | fmt.Println(fmt.Sprintf("%s:%d - true", ip, port)) 309 | connection.Close() 310 | }else{ 311 | c.records[fmt.Sprintf("%s:%d", ip, port)] = false 312 | fmt.Println(fmt.Sprintf("%s:%d - %s", ip, port, err)) 313 | } 314 | c.running-- 315 | } 316 | --------------------------------------------------------------------------------