diff --git a/internal/engine/allexperiments.go b/internal/engine/allexperiments.go index f702118b2e..705a0c57b8 100644 --- a/internal/engine/allexperiments.go +++ b/internal/engine/allexperiments.go @@ -30,6 +30,7 @@ import ( "github.com/ooni/probe-cli/v3/internal/engine/experiment/vanillator" "github.com/ooni/probe-cli/v3/internal/engine/experiment/webconnectivity" "github.com/ooni/probe-cli/v3/internal/engine/experiment/whatsapp" + "github.com/ooni/probe-cli/v3/internal/engine/experiment/randomtraffic" ) var experimentsByName = map[string]func(*Session) *ExperimentBuilder{ @@ -362,6 +363,17 @@ var experimentsByName = map[string]func(*Session) *ExperimentBuilder{ inputPolicy: InputNone, } }, + "randomtraffic": func(session *Session) *ExperimentBuilder { + return &ExperimentBuilder{ + build: func(config interface{}) *Experiment { + return NewExperiment(session, randomtraffic.NewExperimentMeasurer( + *config.(*randomtraffic.Config), + )) + }, + config: &randomtraffic.Config{}, + inputPolicy: InputNone, + } + }, } // AllExperiments returns the name of all experiments diff --git a/internal/engine/experiment/randomtraffic/iparray.go b/internal/engine/experiment/randomtraffic/iparray.go new file mode 100644 index 0000000000..9f1d438bcd --- /dev/null +++ b/internal/engine/experiment/randomtraffic/iparray.go @@ -0,0 +1,2184 @@ +package randomtraffic + +import ( + "math/rand" +) + +func GetIP() string { + IP := [...]string{ + "157.230.42.85:80", + "142.93.184.187:80", + "142.93.176.54:80", + "142.93.191.60:80", + "157.230.38.242:80", + "157.230.40.155:80", + "157.230.44.0:80", + "66.42.40.44:80", + "157.230.36.248:80", + "142.93.184.31:80", + "142.93.191.73:80", + "66.42.43.123:80", + "157.230.42.3:80", + "157.230.32.48:80", + "142.93.184.93:80", + "139.180.144.173:80", + "66.42.42.108:80", + "157.230.36.169:80", + "66.42.40.60:80", + "157.230.40.65:80", + "66.42.33.22:80", + "142.93.182.125:80", + "139.180.146.17:80", + "142.93.185.92:80", + "142.93.184.164:80", + "142.93.182.121:80", + "157.230.38.241:80", + "142.93.176.166:80", + "139.180.144.246:80", + "142.93.182.88:80", + "66.42.45.116:80", + "157.230.40.214:80", + "66.42.32.28:80", + "142.93.185.122:80", + "66.42.43.231:80", + "139.180.144.101:80", + "157.230.38.66:80", + "142.93.185.74:80", + "157.230.32.72:80", + "142.93.184.39:80", + "142.93.191.248:80", + "66.42.32.135:80", + "157.230.46.251:80", + "66.42.32.208:80", + "157.230.47.9:80", + "142.93.182.248:80", + "157.230.47.69:80", + "139.180.146.3:80", + "142.93.182.173:80", + "157.230.32.117:80", + "157.230.36.25:80", + "157.230.47.252:80", + "157.230.44.93:80", + "47.244.247.167:80", + "139.180.147.139:80", + "157.230.34.236:80", + "142.93.191.242:80", + "47.244.252.239:80", + "66.42.41.151:80", + "157.230.44.105:80", + "157.230.36.178:80", + "142.93.185.126:80", + "157.230.46.65:80", + "157.230.47.55:80", + "157.230.38.249:80", + "142.93.176.102:80", + "142.93.185.135:80", + "157.230.42.214:80", + "157.230.40.157:80", + "142.93.182.174:80", + "66.42.41.4:80", + "157.230.42.11:80", + "142.93.182.66:80", + "157.230.32.137:80", + "157.230.42.115:80", + "142.93.191.235:80", + "66.42.44.252:80", + "157.230.36.241:80", + "139.180.146.87:80", + "142.93.176.68:80", + "139.180.144.200:80", + "157.230.40.62:80", + "157.230.34.247:80", + "142.93.184.163:80", + "157.230.42.235:80", + "157.230.40.159:80", + "142.93.184.138:80", + "157.230.38.40:80", + "157.230.47.250:80", + "142.93.191.25:80", + "142.93.184.74:80", + "66.42.40.38:80", + "139.180.144.83:80", + "139.180.144.14:80", + "142.93.185.243:80", + "157.230.32.22:80", + "157.230.36.239:80", + "66.42.43.16:80", + "142.93.191.185:80", + "157.230.34.141:80", + "157.230.40.164:80", + "142.93.176.223:80", + "142.93.184.245:80", + "142.93.191.151:80", + "139.180.147.175:80", + "157.230.46.13:80", + "142.93.185.72:80", + "142.93.185.165:80", + "157.230.34.85:80", + "139.180.147.117:80", + "142.93.176.35:80", + "66.42.40.73:80", + "157.230.38.156:80", + "157.230.34.220:80", + "139.180.146.208:80", + "157.230.47.18:80", + "142.93.191.176:80", + "139.180.146.27:80", + "142.93.176.144:80", + "142.93.182.22:80", + "142.93.185.21:80", + "139.180.146.12:80", + "142.93.185.231:80", + "142.93.182.41:80", + "157.230.44.152:80", + "157.230.34.158:80", + "142.93.191.79:80", + "139.180.147.67:80", + "139.180.147.185:80", + "157.230.47.239:80", + "142.93.191.81:80", + "142.93.176.91:80", + "157.230.32.74:80", + "142.93.182.167:80", + "157.230.32.85:80", + "139.180.144.124:80", + "157.230.40.32:80", + "139.180.146.103:80", + "142.93.182.27:80", + "157.230.44.198:80", + "157.230.34.58:80", + "157.230.36.206:80", + "142.93.185.147:80", + "142.93.185.237:80", + "142.93.182.236:80", + "157.230.42.20:80", + "157.230.44.199:80", + "157.230.44.81:80", + "139.180.145.241:80", + "157.230.40.61:80", + "139.180.146.254:80", + "142.93.184.70:80", + "139.180.147.181:80", + "157.230.36.222:80", + "142.93.176.133:80", + "157.230.38.254:80", + "142.93.184.170:80", + "142.93.185.178:80", + "142.93.191.61:80", + "47.244.244.30:80", + "157.230.38.71:80", + "157.230.46.175:80", + "142.93.176.132:80", + "157.230.38.193:80", + "157.230.44.14:80", + "157.230.47.121:80", + "139.180.147.122:80", + "142.93.191.117:80", + "142.93.185.248:80", + "142.93.191.88:80", + "47.244.245.125:80", + "142.93.182.217:80", + "139.180.144.57:80", + "142.93.182.69:80", + "157.230.42.136:80", + "157.230.42.104:80", + "157.230.42.64:80", + "142.93.191.165:80", + "66.42.43.3:80", + "139.180.147.82:80", + "142.93.184.26:80", + "139.180.147.130:80", + "157.230.46.203:80", + "47.244.252.165:80", + "157.230.42.9:80", + "157.230.42.91:80", + "142.93.176.94:80", + "66.42.45.189:80", + "66.42.39.109:80", + "142.93.176.159:80", + "66.42.40.76:80", + "157.230.36.64:80", + "157.230.34.208:80", + "139.180.145.182:80", + "157.230.32.111:80", + "142.93.191.145:80", + "157.230.40.179:80", + "157.230.38.186:80", + "139.180.144.181:80", + "157.230.44.139:80", + "157.230.47.96:80", + "142.93.185.2:80", + "139.180.147.251:80", + "157.230.32.232:80", + "142.93.191.203:80", + "157.230.34.15:80", + "157.230.32.106:80", + "139.180.146.199:80", + "139.180.144.144:80", + "157.230.47.93:80", + "157.230.47.166:80", + "142.93.185.234:80", + "157.230.36.27:80", + "157.230.36.204:80", + "139.180.144.79:80", + "157.230.42.0:80", + "142.93.191.132:80", + "157.230.36.0:80", + "142.93.176.125:80", + "47.244.249.99:80", + "142.93.191.250:80", + "157.230.44.158:80", + "157.230.46.167:80", + "157.230.32.19:80", + "139.180.147.114:80", + "142.93.184.192:80", + "157.230.44.167:80", + "157.230.40.156:80", + "139.180.145.194:80", + "157.230.44.69:80", + "157.230.44.7:80", + "157.230.32.92:80", + "157.230.44.140:80", + "142.93.191.155:80", + "142.93.182.43:80", + "157.230.34.144:80", + "66.42.45.26:80", + "142.93.182.163:80", + "142.93.184.49:80", + "157.230.32.244:80", + "142.93.182.111:80", + "139.180.145.29:80", + "157.230.44.31:80", + "157.230.44.35:80", + "157.230.46.165:80", + "142.93.182.223:80", + "157.230.32.93:80", + "157.230.47.192:80", + "157.230.44.233:80", + "142.93.185.233:80", + "142.93.184.214:80", + "142.93.185.117:80", + "157.230.32.12:80", + "139.180.144.129:80", + "66.42.41.153:80", + "142.93.185.235:80", + "139.180.145.8:80", + "142.93.184.140:80", + "157.230.46.235:80", + "157.230.36.113:80", + "142.93.176.189:80", + "139.180.144.3:80", + "142.93.182.3:80", + "139.180.146.89:80", + "66.42.44.179:80", + "142.93.182.70:80", + "142.93.176.203:80", + "157.230.40.81:80", + "157.230.42.227:80", + "157.230.42.37:80", + "157.230.36.34:80", + "157.230.34.199:80", + "66.42.39.126:80", + "66.42.44.211:80", + "157.230.36.153:80", + "157.230.44.210:80", + "142.93.185.78:80", + "142.93.182.203:80", + "157.230.47.104:80", + "157.230.47.29:80", + "139.180.145.127:80", + "157.230.36.211:80", + "142.93.191.194:80", + "157.230.34.245:80", + "157.230.40.37:80", + "157.230.36.150:80", + "66.42.33.83:80", + "157.230.42.42:80", + "142.93.184.25:80", + "157.230.40.162:80", + "66.42.43.98:80", + "157.230.44.8:80", + "142.93.176.173:80", + "157.230.34.164:80", + "157.230.40.142:80", + "66.42.42.17:80", + "142.93.182.221:80", + "157.230.32.143:80", + "157.230.34.113:80", + "157.230.47.244:80", + "157.230.32.201:80", + "142.93.185.148:80", + "66.42.45.222:80", + "157.230.36.28:80", + "142.93.185.174:80", + "157.230.42.38:80", + "157.230.47.2:80", + "142.93.176.86:80", + "157.230.46.188:80", + "139.180.147.66:80", + "139.180.147.76:80", + "157.230.47.26:80", + "66.42.43.75:80", + "157.230.42.173:80", + "142.93.191.175:80", + "142.93.176.99:80", + "157.230.42.16:80", + "66.42.42.28:80", + "139.180.145.224:80", + "142.93.184.215:80", + "157.230.32.234:80", + "157.230.34.18:80", + "157.230.44.13:80", + "142.93.191.160:80", + "157.230.47.212:80", + "157.230.32.95:80", + "157.230.32.113:80", + "157.230.34.157:80", + "139.180.144.15:80", + "142.93.176.201:80", + "66.42.32.175:80", + "157.230.38.185:80", + "157.230.36.106:80", + "139.180.144.232:80", + "157.230.42.174:80", + "66.42.42.63:80", + "66.42.32.93:80", + "142.93.184.213:80", + "142.93.184.17:80", + "157.230.44.213:80", + "157.230.34.191:80", + "142.93.184.61:80", + "47.244.247.200:80", + "142.93.176.83:80", + "142.93.185.170:80", + "157.230.36.97:80", + "157.230.38.220:80", + "66.42.43.119:80", + "157.230.46.63:80", + "157.230.47.92:80", + "142.93.182.172:80", + "66.42.40.25:80", + "157.230.44.74:80", + "157.230.40.227:80", + "157.230.42.197:80", + "142.93.184.3:80", + "157.230.44.163:80", + "139.180.147.182:80", + "157.230.36.35:80", + "142.93.182.132:80", + "139.180.147.92:80", + "66.42.32.182:80", + "157.230.42.147:80", + "142.93.191.246:80", + "47.244.252.129:80", + "142.93.176.21:80", + "66.42.33.37:80", + "157.230.42.102:80", + "139.180.145.251:80", + "142.93.182.255:80", + "139.180.146.220:80", + "66.42.41.158:80", + "142.93.191.205:80", + "142.93.184.191:80", + "157.230.46.163:80", + "142.93.191.146:80", + "142.93.191.251:80", + "157.230.42.12:80", + "142.93.185.13:80", + "157.230.44.254:80", + "157.230.46.23:80", + "157.230.44.19:80", + "66.42.39.83:80", + "157.230.40.135:80", + "66.42.33.195:80", + "157.230.34.11:80", + "157.230.46.21:80", + "66.42.42.150:80", + "157.230.38.61:80", + "157.230.34.67:80", + "157.230.42.143:80", + "139.180.146.243:80", + "142.93.191.84:80", + "139.180.147.231:80", + "157.230.34.228:80", + "139.180.144.193:80", + "157.230.47.175:80", + "139.180.144.81:80", + "142.93.191.168:80", + "157.230.34.142:80", + "142.93.182.52:80", + "142.93.185.133:80", + "157.230.44.224:80", + "157.230.36.161:80", + "157.230.44.112:80", + "142.93.182.145:80", + "157.230.44.130:80", + "139.180.145.223:80", + "139.180.146.173:80", + "157.230.44.90:80", + "66.42.40.31:80", + "157.230.34.163:80", + "157.230.42.218:80", + "157.230.36.37:80", + "142.93.191.227:80", + "157.230.44.244:80", + "142.93.184.118:80", + "157.230.34.174:80", + "157.230.40.237:80", + "139.180.147.142:80", + "157.230.34.209:80", + "157.230.42.8:80", + "157.230.47.158:80", + "157.230.38.143:80", + "139.180.146.97:80", + "142.93.182.232:80", + "142.93.176.45:80", + "157.230.47.183:80", + "157.230.46.19:80", + "139.180.145.69:80", + "66.42.41.42:80", + "142.93.191.55:80", + "157.230.34.95:80", + "139.180.146.255:80", + "139.180.144.97:80", + "157.230.44.165:80", + "139.180.147.193:80", + "139.180.147.189:80", + "142.93.191.186:80", + "66.42.39.0:80", + "142.93.185.173:80", + "142.93.191.158:80", + "157.230.47.163:80", + "157.230.46.14:80", + "142.93.182.123:80", + "142.93.191.72:80", + "157.230.46.98:80", + "157.230.40.220:80", + "157.230.42.161:80", + "142.93.185.195:80", + "142.93.191.102:80", + "157.230.40.126:80", + "157.230.44.82:80", + "142.93.182.214:80", + "157.230.40.204:80", + "142.93.191.195:80", + "66.42.39.77:80", + "142.93.182.238:80", + "142.93.184.87:80", + "157.230.46.225:80", + "157.230.42.186:80", + "157.230.36.18:80", + "142.93.182.23:80", + "157.230.40.127:80", + "139.180.144.47:80", + "139.180.147.123:80", + "142.93.182.226:80", + "139.180.147.73:80", + "142.93.191.53:80", + "142.93.182.220:80", + "66.42.42.104:80", + "142.93.184.209:80", + "157.230.44.203:80", + "142.93.185.196:80", + "157.230.46.45:80", + "157.230.46.177:80", + "66.42.41.243:80", + "157.230.46.70:80", + "142.93.176.79:80", + "66.42.40.251:80", + "142.93.182.46:80", + "142.93.176.32:80", + "157.230.38.142:80", + "142.93.182.78:80", + "142.93.185.76:80", + "157.230.42.246:80", + "142.93.176.145:80", + "157.230.34.37:80", + "142.93.191.244:80", + "139.180.147.25:80", + "139.180.144.115:80", + "66.42.44.193:80", + "157.230.36.196:80", + "157.230.38.1:80", + "157.230.36.198:80", + "139.180.144.119:80", + "139.180.146.120:80", + "157.230.38.253:80", + "142.93.185.172:80", + "157.230.32.147:80", + "66.42.32.53:80", + "157.230.34.55:80", + "157.230.38.34:80", + "157.230.32.120:80", + "139.180.145.1:80", + "157.230.36.9:80", + "66.42.40.115:80", + "66.42.42.254:80", + "157.230.38.164:80", + "142.93.191.137:80", + "66.42.43.243:80", + "66.42.44.255:80", + "157.230.34.161:80", + "157.230.42.105:80", + "157.230.38.74:80", + "157.230.44.144:80", + "157.230.40.8:80", + "157.230.46.52:80", + "142.93.184.107:80", + "157.230.32.94:80", + "142.93.191.133:80", + "142.93.185.80:80", + "157.230.40.187:80", + "142.93.191.136:80", + "142.93.191.16:80", + "139.180.145.148:80", + "157.230.32.119:80", + "66.42.44.110:80", + "157.230.47.31:80", + "142.93.185.131:80", + "47.244.248.59:80", + "157.230.47.142:80", + "157.230.36.159:80", + "157.230.47.153:80", + "157.230.36.219:80", + "47.244.245.237:80", + "66.42.43.206:80", + "66.42.42.117:80", + "142.93.182.15:80", + "157.230.34.44:80", + "139.180.147.110:80", + "157.230.32.164:80", + "142.93.185.192:80", + "142.93.184.63:80", + "157.230.36.201:80", + "142.93.184.127:80", + "142.93.191.94:80", + "139.180.145.128:80", + "139.180.146.35:80", + "157.230.34.71:80", + "157.230.36.10:80", + "157.230.42.253:80", + "142.93.185.104:80", + "66.42.33.177:80", + "66.42.42.197:80", + "157.230.46.242:80", + "142.93.176.11:80", + "157.230.46.215:80", + "142.93.191.33:80", + "139.180.146.158:80", + "157.230.38.221:80", + "139.180.146.168:80", + "157.230.44.97:80", + "157.230.32.30:80", + "157.230.32.171:80", + "157.230.44.18:80", + "157.230.36.31:80", + "157.230.34.240:80", + "157.230.44.217:80", + "142.93.191.112:80", + "142.93.185.121:80", + "142.93.185.187:80", + "47.244.254.186:80", + "142.93.184.239:80", + "157.230.32.11:80", + "142.93.176.213:80", + "66.42.40.95:80", + "142.93.185.242:80", + "157.230.44.230:80", + "142.93.185.214:80", + "157.230.46.101:80", + "142.93.185.191:80", + "157.230.34.51:80", + "47.244.245.175:80", + "157.230.38.238:80", + "157.230.42.125:80", + "157.230.44.117:80", + "142.93.185.202:80", + "139.180.145.227:80", + "157.230.44.91:80", + "157.230.34.92:80", + "139.180.146.188:80", + "142.93.191.30:80", + "139.180.145.180:80", + "157.230.47.116:80", + "157.230.44.49:80", + "142.93.182.205:80", + "157.230.44.181:80", + "157.230.40.43:80", + "157.230.32.132:80", + "142.93.176.153:80", + "139.180.145.39:80", + "157.230.36.68:80", + "66.42.40.175:80", + "157.230.34.214:80", + "139.180.144.59:80", + "157.230.38.109:80", + "142.93.176.143:80", + "142.93.184.151:80", + "157.230.42.132:80", + "157.230.47.53:80", + "157.230.42.76:80", + "157.230.38.245:80", + "142.93.185.8:80", + "142.93.182.86:80", + "139.180.146.26:80", + "157.230.44.135:80", + "66.42.33.43:80", + "157.230.32.71:80", + "157.230.44.55:80", + "157.230.36.218:80", + "157.230.36.109:80", + "157.230.42.195:80", + "66.42.45.122:80", + "157.230.36.69:80", + "142.93.182.60:80", + "142.93.182.186:80", + "157.230.40.28:80", + "142.93.176.10:80", + "139.180.146.148:80", + "157.230.47.215:80", + "142.93.191.181:80", + "142.93.191.163:80", + "157.230.46.154:80", + "157.230.44.121:80", + "157.230.32.193:80", + "142.93.191.57:80", + "157.230.38.137:80", + "142.93.184.131:80", + "157.230.44.153:80", + "157.230.32.188:80", + "142.93.182.134:80", + "139.180.145.94:80", + "157.230.32.218:80", + "142.93.176.27:80", + "47.244.253.193:80", + "157.230.34.106:80", + "142.93.184.91:80", + "139.180.144.40:80", + "66.42.42.69:80", + "139.180.144.247:80", + "142.93.191.86:80", + "157.230.44.184:80", + "139.180.147.184:80", + "142.93.191.166:80", + "142.93.176.87:80", + "66.42.39.65:80", + "157.230.38.224:80", + "157.230.40.193:80", + "157.230.32.157:80", + "139.180.145.176:80", + "142.93.191.31:80", + "157.230.38.101:80", + "142.93.176.58:80", + "66.42.32.42:80", + "142.93.185.179:80", + "142.93.176.237:80", + "66.42.41.98:80", + "157.230.46.73:80", + "157.230.47.131:80", + "157.230.46.250:80", + "142.93.184.172:80", + "157.230.32.47:80", + "139.180.145.89:80", + "157.230.44.170:80", + "66.42.40.211:80", + "157.230.46.205:80", + "157.230.32.199:80", + "157.230.40.91:80", + "139.180.147.225:80", + "157.230.40.166:80", + "142.93.185.144:80", + "66.42.43.236:80", + "66.42.40.240:80", + "157.230.38.37:80", + "157.230.36.58:80", + "66.42.33.95:80", + "157.230.34.171:80", + "157.230.40.153:80", + "157.230.46.191:80", + "157.230.40.149:80", + "142.93.184.136:80", + "157.230.40.182:80", + "157.230.34.112:80", + "157.230.36.49:80", + "142.93.184.211:80", + "142.93.182.37:80", + "139.180.144.18:80", + "157.230.44.29:80", + "142.93.176.161:80", + "157.230.46.34:80", + "142.93.184.50:80", + "157.230.46.190:80", + "157.230.32.238:80", + "157.230.36.87:80", + "157.230.38.21:80", + "139.180.146.244:80", + "142.93.184.90:80", + "142.93.184.217:80", + "157.230.42.221:80", + "157.230.34.46:80", + "66.42.45.195:80", + "157.230.46.206:80", + "142.93.191.71:80", + "142.93.176.194:80", + "142.93.184.159:80", + "142.93.184.156:80", + "157.230.46.241:80", + "157.230.46.173:80", + "142.93.185.6:80", + "157.230.36.40:80", + "157.230.32.79:80", + "157.230.44.65:80", + "157.230.44.5:80", + "157.230.40.4:80", + "157.230.36.243:80", + "157.230.42.234:80", + "139.180.146.114:80", + "157.230.44.246:80", + "157.230.34.223:80", + "66.42.40.131:80", + "157.230.46.140:80", + "139.180.147.8:80", + "157.230.42.78:80", + "157.230.47.123:80", + "157.230.44.52:80", + "157.230.38.237:80", + "157.230.47.62:80", + "157.230.42.74:80", + "139.180.144.116:80", + "142.93.182.102:80", + "142.93.184.221:80", + "157.230.47.54:80", + "139.180.145.126:80", + "66.42.32.104:80", + "66.42.43.105:80", + "157.230.34.89:80", + "157.230.44.206:80", + "142.93.185.45:80", + "157.230.34.177:80", + "139.180.146.102:80", + "142.93.185.180:80", + "66.42.39.254:80", + "139.180.144.136:80", + "139.180.147.131:80", + "157.230.34.90:80", + "157.230.40.167:80", + "157.230.42.130:80", + "66.42.33.104:80", + "139.180.145.53:80", + "142.93.182.89:80", + "139.180.146.186:80", + "139.180.146.93:80", + "142.93.182.152:80", + "157.230.47.168:80", + "157.230.44.22:80", + "66.42.45.219:80", + "157.230.44.59:80", + "66.42.45.223:80", + "157.230.34.165:80", + "139.180.144.155:80", + "157.230.32.170:80", + "157.230.38.170:80", + "142.93.185.59:80", + "157.230.42.137:80", + "139.180.145.21:80", + "142.93.182.176:80", + "157.230.44.202:80", + "157.230.34.226:80", + "139.180.144.186:80", + "142.93.191.43:80", + "142.93.191.144:80", + "142.93.191.198:80", + "66.42.39.14:80", + "157.230.42.4:80", + "157.230.46.10:80", + "157.230.42.107:80", + "142.93.184.85:80", + "157.230.40.19:80", + "142.93.191.121:80", + "157.230.47.206:80", + "157.230.36.29:80", + "139.180.147.134:80", + "157.230.34.243:80", + "66.42.39.26:80", + "142.93.176.22:80", + "157.230.46.129:80", + "157.230.42.223:80", + "66.42.39.229:80", + "142.93.184.234:80", + "142.93.185.50:80", + "139.180.146.251:80", + "157.230.42.144:80", + "157.230.46.6:80", + "157.230.40.100:80", + "139.180.146.106:80", + "157.230.42.206:80", + "157.230.40.208:80", + "157.230.42.210:80", + "157.230.47.79:80", + "66.42.32.8:80", + "142.93.176.92:80", + "142.93.182.65:80", + "157.230.34.42:80", + "139.180.147.48:80", + "66.42.44.240:80", + "142.93.191.76:80", + "157.230.38.8:80", + "142.93.176.112:80", + "139.180.145.135:80", + "157.230.46.180:80", + "142.93.182.160:80", + "142.93.182.158:80", + "157.230.34.14:80", + "142.93.176.29:80", + "142.93.176.43:80", + "66.42.44.217:80", + "142.93.182.195:80", + "157.230.46.124:80", + "139.180.147.121:80", + "157.230.47.11:80", + "142.93.191.100:80", + "142.93.184.78:80", + "157.230.46.137:80", + "157.230.36.225:80", + "157.230.38.184:80", + "157.230.34.225:80", + "139.180.146.216:80", + "142.93.184.241:80", + "142.93.176.183:80", + "157.230.46.46:80", + "157.230.42.157:80", + "157.230.32.173:80", + "66.42.33.149:80", + "157.230.32.84:80", + "139.180.147.240:80", + "139.180.146.111:80", + "66.42.44.140:80", + "66.42.39.90:80", + "66.42.32.54:80", + "157.230.34.135:80", + "142.93.176.202:80", + "142.93.191.156:80", + "157.230.40.207:80", + "142.93.176.20:80", + "157.230.40.23:80", + "139.180.147.85:80", + "139.180.144.123:80", + "157.230.32.41:80", + "157.230.42.208:80", + "157.230.34.103:80", + "157.230.47.63:80", + "47.244.249.45:80", + "139.180.146.83:80", + "157.230.46.117:80", + "66.42.41.72:80", + "157.230.36.226:80", + "157.230.40.247:80", + "139.180.145.27:80", + "66.42.39.159:80", + "66.42.40.28:80", + "157.230.32.165:80", + "66.42.32.111:80", + "157.230.32.73:80", + "66.42.42.130:80", + "142.93.185.93:80", + "66.42.33.217:80", + "157.230.32.59:80", + "157.230.38.15:80", + "157.230.44.235:80", + "157.230.42.109:80", + "142.93.185.216:80", + "139.180.145.102:80", + "157.230.38.108:80", + "142.93.185.215:80", + "139.180.145.244:80", + "142.93.176.70:80", + "66.42.39.145:80", + "142.93.184.218:80", + "157.230.47.56:80", + "66.42.40.172:80", + "157.230.46.71:80", + "139.180.147.238:80", + "142.93.184.113:80", + "157.230.34.197:80", + "157.230.46.9:80", + "142.93.191.64:80", + "157.230.40.103:80", + "139.180.147.129:80", + "157.230.46.33:80", + "157.230.47.208:80", + "66.42.45.96:80", + "157.230.46.229:80", + "157.230.36.234:80", + "157.230.34.84:80", + "142.93.191.216:80", + "142.93.185.98:80", + "157.230.42.188:80", + "157.230.40.67:80", + "47.244.248.183:80", + "157.230.42.240:80", + "139.180.145.62:80", + "157.230.38.216:80", + "157.230.40.243:80", + "157.230.38.255:80", + "157.230.36.99:80", + "157.230.47.3:80", + "142.93.176.113:80", + "142.93.184.197:80", + "139.180.146.183:80", + "142.93.176.40:80", + "157.230.47.209:80", + "142.93.176.90:80", + "157.230.36.143:80", + "157.230.42.80:80", + "142.93.184.102:80", + "157.230.36.209:80", + "142.93.185.139:80", + "157.230.40.68:80", + "142.93.182.135:80", + "142.93.185.103:80", + "66.42.39.208:80", + "142.93.176.238:80", + "142.93.185.146:80", + "142.93.184.36:80", + "157.230.44.137:80", + "142.93.176.172:80", + "142.93.191.3:80", + "139.180.147.100:80", + "157.230.47.44:80", + "66.42.41.215:80", + "157.230.40.3:80", + "139.180.144.71:80", + "157.230.32.208:80", + "139.180.147.19:80", + "157.230.38.214:80", + "142.93.182.83:80", + "66.42.42.217:80", + "66.42.32.33:80", + "157.230.47.162:80", + "142.93.185.37:80", + "139.180.145.31:80", + "157.230.36.22:80", + "142.93.191.122:80", + "157.230.34.2:80", + "157.230.44.44:80", + "157.230.42.84:80", + "139.180.145.9:80", + "157.230.32.116:80", + "66.42.40.108:80", + "142.93.185.184:80", + "142.93.176.149:80", + "142.93.191.107:80", + "142.93.182.61:80", + "142.93.191.214:80", + "142.93.185.22:80", + "157.230.38.106:80", + "139.180.145.15:80", + "139.180.144.184:80", + "157.230.40.106:80", + "47.244.251.11:80", + "142.93.176.104:80", + "142.93.182.206:80", + "139.180.145.160:80", + "139.180.144.154:80", + "157.230.34.196:80", + "142.93.184.204:80", + "157.230.34.114:80", + "142.93.182.219:80", + "142.93.176.66:80", + "157.230.40.205:80", + "66.42.43.117:80", + "157.230.36.202:80", + "142.93.182.175:80", + "157.230.46.151:80", + "157.230.38.147:80", + "142.93.182.24:80", + "142.93.184.21:80", + "157.230.47.247:80", + "139.180.146.170:80", + "142.93.191.154:80", + "157.230.47.40:80", + "142.93.185.27:80", + "142.93.176.158:80", + "139.180.146.36:80", + "142.93.176.148:80", + "139.180.144.166:80", + "157.230.42.44:80", + "142.93.176.236:80", + "142.93.184.33:80", + "139.180.144.13:80", + "142.93.176.114:80", + "142.93.184.80:80", + "139.180.146.215:80", + "157.230.34.231:80", + "142.93.176.164:80", + "157.230.38.171:80", + "157.230.46.27:80", + "157.230.34.68:80", + "139.180.144.210:80", + "142.93.185.181:80", + "157.230.42.47:80", + "157.230.34.101:80", + "142.93.184.75:80", + "157.230.47.22:80", + "157.230.34.139:80", + "157.230.32.112:80", + "139.180.147.160:80", + "157.230.40.201:80", + "157.230.44.201:80", + "142.93.191.196:80", + "157.230.44.173:80", + "142.93.184.116:80", + "157.230.44.4:80", + "157.230.38.45:80", + "139.180.145.105:80", + "157.230.46.29:80", + "139.180.145.213:80", + "142.93.191.140:80", + "157.230.42.53:80", + "139.180.147.148:80", + "142.93.176.28:80", + "142.93.176.141:80", + "157.230.36.41:80", + "157.230.42.142:80", + "142.93.185.245:80", + "66.42.41.175:80", + "142.93.191.153:80", + "66.42.33.62:80", + "66.42.41.61:80", + "139.180.145.199:80", + "139.180.147.120:80", + "157.230.40.58:80", + "142.93.184.0:80", + "142.93.176.89:80", + "66.42.45.201:80", + "157.230.38.5:80", + "157.230.40.240:80", + "157.230.47.19:80", + "139.180.146.44:80", + "66.42.33.75:80", + "139.180.144.24:80", + "157.230.36.185:80", + "139.180.147.177:80", + "157.230.32.154:80", + "157.230.32.60:80", + "157.230.40.199:80", + "157.230.38.233:80", + "157.230.38.161:80", + "157.230.47.114:80", + "139.180.145.250:80", + "157.230.47.115:80", + "139.180.147.178:80", + "157.230.46.68:80", + "157.230.46.118:80", + "142.93.182.234:80", + "66.42.40.157:80", + "142.93.185.246:80", + "157.230.42.14:80", + "157.230.36.15:80", + "139.180.146.5:80", + "157.230.40.147:80", + "157.230.44.221:80", + "157.230.42.112:80", + "142.93.185.150:80", + "142.93.184.19:80", + "157.230.36.145:80", + "142.93.176.84:80", + "142.93.191.49:80", + "142.93.191.91:80", + "66.42.33.10:80", + "157.230.44.26:80", + "142.93.185.94:80", + "157.230.47.39:80", + "142.93.185.113:80", + "142.93.182.245:80", + "66.42.39.188:80", + "66.42.44.215:80", + "142.93.182.109:80", + "139.180.144.74:80", + "139.180.147.207:80", + "139.180.144.237:80", + "142.93.176.177:80", + "66.42.43.106:80", + "139.180.147.203:80", + "157.230.38.11:80", + "157.230.46.81:80", + "157.230.34.175:80", + "157.230.38.43:80", + "142.93.182.57:80", + "139.180.144.203:80", + "66.42.45.104:80", + "139.180.144.192:80", + "142.93.176.5:80", + "139.180.147.115:80", + "157.230.46.120:80", + "66.42.43.187:80", + "157.230.34.29:80", + "157.230.44.131:80", + "157.230.38.145:80", + "157.230.47.81:80", + "142.93.182.128:80", + "139.180.145.167:80", + "142.93.182.199:80", + "139.180.147.56:80", + "142.93.182.166:80", + "66.42.42.93:80", + "157.230.36.170:80", + "142.93.184.79:80", + "139.180.144.201:80", + "139.180.146.38:80", + "157.230.38.23:80", + "157.230.46.254:80", + "142.93.182.142:80", + "157.230.46.179:80", + "142.93.182.150:80", + "157.230.34.152:80", + "157.230.46.224:80", + "142.93.184.248:80", + "157.230.40.130:80", + "157.230.38.140:80", + "157.230.47.187:80", + "142.93.191.134:80", + "142.93.184.233:80", + "157.230.44.38:80", + "157.230.42.17:80", + "157.230.34.204:80", + "157.230.40.170:80", + "66.42.44.232:80", + "157.230.42.131:80", + "157.230.32.70:80", + "157.230.42.69:80", + "157.230.38.98:80", + "139.180.145.54:80", + "142.93.184.44:80", + "139.180.146.16:80", + "157.230.38.153:80", + "66.42.33.239:80", + "157.230.38.16:80", + "142.93.184.157:80", + "157.230.46.170:80", + "139.180.147.119:80", + "157.230.40.173:80", + "66.42.40.101:80", + "66.42.45.138:80", + "157.230.36.200:80", + "142.93.185.145:80", + "142.93.185.77:80", + "139.180.147.191:80", + "139.180.147.118:80", + "142.93.176.180:80", + "139.180.145.12:80", + "66.42.40.110:80", + "157.230.36.63:80", + "157.230.32.195:80", + "157.230.42.77:80", + "142.93.176.130:80", + "66.42.32.112:80", + "139.180.144.196:80", + "157.230.42.121:80", + "66.42.44.182:80", + "142.93.191.20:80", + "157.230.42.81:80", + "139.180.144.89:80", + "139.180.147.103:80", + "139.180.147.124:80", + "157.230.46.109:80", + "157.230.42.181:80", + "142.93.191.41:80", + "157.230.47.67:80", + "157.230.44.77:80", + "157.230.47.8:80", + "157.230.47.164:80", + "157.230.34.160:80", + "157.230.40.120:80", + "157.230.42.72:80", + "157.230.42.35:80", + "157.230.46.182:80", + "142.93.182.185:80", + "142.93.185.227:80", + "142.93.191.15:80", + "157.230.32.178:80", + "142.93.185.30:80", + "157.230.32.210:80", + "139.180.144.148:80", + "157.230.36.210:80", + "142.93.185.107:80", + "157.230.44.187:80", + "157.230.47.251:80", + "142.93.176.220:80", + "157.230.46.111:80", + "142.93.185.9:80", + "157.230.36.194:80", + "139.180.147.147:80", + "139.180.144.249:80", + "157.230.32.198:80", + "142.93.185.83:80", + "157.230.47.179:80", + "139.180.146.222:80", + "142.93.185.149:80", + "157.230.36.104:80", + "157.230.46.200:80", + "157.230.47.217:80", + "139.180.147.79:80", + "142.93.184.110:80", + "157.230.47.74:80", + "142.93.184.231:80", + "157.230.34.237:80", + "157.230.38.28:80", + "157.230.32.62:80", + "157.230.38.126:80", + "142.93.185.87:80", + "139.180.147.128:80", + "157.230.44.222:80", + "157.230.46.102:80", + "157.230.36.162:80", + "139.180.144.157:80", + "157.230.34.108:80", + "142.93.182.108:80", + "157.230.47.224:80", + "139.180.145.85:80", + "139.180.146.245:80", + "142.93.182.49:80", + "157.230.47.112:80", + "157.230.46.103:80", + "157.230.34.99:80", + "142.93.191.128:80", + "157.230.36.84:80", + "157.230.36.125:80", + "157.230.47.127:80", + "142.93.184.105:80", + "142.93.176.101:80", + "157.230.46.43:80", + "157.230.42.94:80", + "142.93.176.16:80", + "157.230.44.138:80", + "157.230.38.44:80", + "157.230.34.41:80", + "142.93.182.177:80", + "157.230.36.245:80", + "157.230.47.184:80", + "157.230.34.150:80", + "66.42.44.58:80", + "142.93.182.51:80", + "142.93.184.212:80", + "66.42.39.114:80", + "157.230.38.178:80", + "142.93.182.29:80", + "157.230.36.74:80", + "66.42.40.134:80", + "157.230.40.150:80", + "157.230.34.73:80", + "157.230.46.7:80", + "66.42.43.45:80", + "139.180.147.12:80", + "157.230.47.86:80", + "157.230.42.26:80", + "142.93.182.230:80", + "139.180.145.200:80", + "157.230.32.4:80", + "157.230.32.161:80", + "142.93.176.50:80", + "142.93.182.97:80", + "157.230.44.200:80", + "157.230.38.20:80", + "139.180.146.63:80", + "157.230.34.9:80", + "157.230.32.155:80", + "142.93.176.62:80", + "139.180.146.193:80", + "157.230.36.47:80", + "142.93.176.187:80", + "66.42.33.243:80", + "157.230.38.94:80", + "157.230.46.96:80", + "142.93.176.105:80", + "142.93.185.211:80", + "142.93.176.65:80", + "142.93.182.208:80", + "157.230.42.139:80", + "157.230.46.93:80", + "142.93.185.162:80", + "157.230.38.54:80", + "66.42.39.222:80", + "66.42.39.94:80", + "157.230.38.27:80", + "157.230.36.115:80", + "157.230.36.187:80", + "157.230.44.86:80", + "142.93.176.129:80", + "157.230.44.191:80", + "157.230.32.46:80", + "66.42.42.126:80", + "66.42.43.108:80", + "157.230.47.135:80", + "66.42.32.137:80", + "157.230.46.253:80", + "139.180.147.106:80", + "142.93.182.31:80", + "139.180.146.127:80", + "157.230.34.72:80", + "139.180.145.83:80", + "66.42.43.247:80", + "139.180.146.240:80", + "142.93.182.148:80", + "157.230.38.138:80", + "157.230.38.127:80", + "66.42.41.30:80", + "139.180.147.204:80", + "157.230.38.144:80", + "139.180.146.9:80", + "157.230.46.181:80", + "157.230.36.59:80", + "66.42.33.24:80", + "157.230.36.132:80", + "157.230.32.66:80", + "157.230.46.20:80", + "66.42.39.242:80", + "157.230.47.236:80", + "66.42.39.68:80", + "66.42.39.211:80", + "139.180.147.15:80", + "157.230.42.127:80", + "66.42.41.91:80", + "157.230.47.186:80", + "66.42.45.12:80", + "139.180.144.42:80", + "157.230.44.195:80", + "157.230.44.172:80", + "157.230.44.164:80", + "142.93.184.59:80", + "157.230.40.25:80", + "66.42.41.234:80", + "142.93.182.138:80", + "157.230.44.239:80", + "157.230.42.58:80", + "142.93.176.36:80", + "157.230.46.89:80", + "157.230.38.19:80", + "142.93.185.41:80", + "157.230.34.28:80", + "142.93.182.212:80", + "157.230.40.186:80", + "142.93.176.19:80", + "142.93.176.13:80", + "157.230.47.232:80", + "157.230.47.94:80", + "142.93.176.17:80", + "66.42.40.222:80", + "66.42.39.152:80", + "142.93.182.250:80", + "157.230.32.153:80", + "142.93.191.190:80", + "142.93.182.9:80", + "157.230.40.143:80", + "142.93.176.88:80", + "157.230.38.75:80", + "142.93.176.179:80", + "157.230.34.88:80", + "142.93.191.74:80", + "142.93.184.235:80", + "142.93.176.4:80", + "157.230.34.140:80", + "157.230.38.197:80", + "157.230.40.196:80", + "142.93.185.143:80", + "157.230.40.57:80", + "66.42.40.84:80", + "142.93.185.43:80", + "142.93.191.120:80", + "157.230.36.168:80", + "139.180.146.118:80", + "157.230.46.198:80", + "66.42.45.177:80", + "139.180.145.152:80", + "66.42.44.74:80", + "157.230.47.145:80", + "157.230.44.6:80", + "157.230.42.231:80", + "157.230.38.239:80", + "142.93.176.239:80", + "139.180.145.75:80", + "157.230.32.246:80", + "66.42.41.168:80", + "142.93.185.134:80", + "139.180.147.30:80", + "142.93.191.24:80", + "157.230.47.111:80", + "157.230.38.53:80", + "139.180.145.219:80", + "157.230.40.55:80", + "142.93.185.197:80", + "157.230.40.21:80", + "139.180.145.123:80", + "142.93.185.55:80", + "157.230.32.166:80", + "139.180.144.125:80", + "157.230.36.6:80", + "139.180.147.45:80", + "157.230.32.36:80", + "157.230.46.107:80", + "157.230.46.3:80", + "139.180.146.95:80", + "142.93.184.114:80", + "139.180.146.24:80", + "139.180.147.234:80", + "157.230.36.213:80", + "142.93.182.35:80", + "66.42.39.50:80", + "142.93.184.8:80", + "139.180.145.90:80", + "142.93.182.162:80", + "157.230.42.19:80", + "142.93.184.246:80", + "157.230.34.117:80", + "139.180.144.26:80", + "66.42.44.132:80", + "157.230.42.75:80", + "66.42.45.239:80", + "157.230.40.1:80", + "157.230.32.133:80", + "139.180.144.205:80", + "139.180.147.233:80", + "142.93.185.115:80", + "157.230.32.68:80", + "142.93.191.42:80", + "142.93.185.230:80", + "139.180.144.36:80", + "157.230.32.183:80", + "66.42.44.183:80", + "139.180.145.16:80", + "157.230.42.249:80", + "139.180.146.239:80", + "142.93.176.219:80", + "157.230.32.23:80", + "142.93.185.220:80", + "47.244.244.230:80", + "142.93.184.64:80", + "139.180.145.202:80", + "142.93.185.185:80", + "157.230.44.92:80", + "157.230.36.172:80", + "139.180.145.118:80", + "66.42.43.134:80", + "139.180.146.40:80", + "157.230.36.165:80", + "142.93.191.192:80", + "157.230.34.19:80", + "157.230.40.213:80", + "157.230.46.201:80", + "139.180.144.225:80", + "142.93.191.197:80", + "142.93.176.224:80", + "139.180.147.190:80", + "142.93.176.230:80", + "139.180.146.197:80", + "157.230.32.184:80", + "139.180.145.58:80", + "157.230.46.131:80", + "157.230.47.249:80", + "157.230.42.187:80", + "139.180.145.134:80", + "157.230.47.225:80", + "157.230.40.72:80", + "157.230.46.88:80", + "66.42.43.250:80", + "157.230.32.101:80", + "142.93.176.243:80", + "157.230.44.171:80", + "66.42.42.176:80", + "142.93.184.162:80", + "157.230.42.151:80", + "142.93.185.88:80", + "142.93.184.129:80", + "66.42.32.66:80", + "157.230.47.37:80", + "142.93.176.100:80", + "142.93.176.134:80", + "157.230.38.80:80", + "157.230.38.73:80", + "139.180.147.228:80", + "157.230.38.130:80", + "139.180.146.31:80", + "142.93.185.89:80", + "47.244.255.252:80", + "66.42.33.141:80", + "142.93.185.108:80", + "139.180.144.113:80", + "157.230.32.160:80", + "157.230.42.27:80", + "66.42.41.189:80", + "66.42.40.105:80", + "157.230.46.83:80", + "157.230.34.169:80", + "142.93.176.212:80", + "142.93.191.29:80", + "157.230.47.122:80", + "142.93.182.122:80", + "157.230.36.128:80", + "142.93.191.189:80", + "142.93.176.142:80", + "157.230.36.212:80", + "157.230.47.59:80", + "157.230.47.16:80", + "157.230.36.1:80", + "66.42.42.100:80", + "157.230.44.116:80", + "139.180.144.222:80", + "142.93.191.162:80", + "157.230.42.215:80", + "157.230.47.35:80", + "139.180.145.30:80", + "157.230.38.95:80", + "142.93.182.239:80", + "139.180.146.56:80", + "157.230.32.39:80", + "142.93.184.155:80", + "142.93.184.29:80", + "66.42.43.147:80", + "66.42.45.254:80", + "139.180.147.33:80", + "157.230.36.166:80", + "157.230.40.82:80", + "157.230.46.82:80", + "142.93.191.114:80", + "139.180.146.253:80", + "139.180.145.116:80", + "157.230.36.144:80", + "139.180.146.154:80", + "157.230.34.217:80", + "66.42.45.119:80", + "47.244.251.48:80", + "139.180.144.76:80", + "142.93.191.14:80", + "142.93.185.17:80", + "142.93.184.130:80", + "157.230.34.38:80", + "157.230.34.75:80", + "157.230.38.190:80", + "139.180.147.99:80", + "139.180.144.63:80", + "66.42.42.134:80", + "142.93.185.188:80", + "66.42.39.213:80", + "142.93.185.254:80", + "157.230.46.166:80", + "157.230.36.123:80", + "157.230.47.91:80", + "157.230.34.115:80", + "66.42.32.220:80", + "157.230.42.251:80", + "142.93.185.26:80", + "157.230.47.193:80", + "157.230.47.66:80", + "157.230.47.241:80", + "157.230.47.221:80", + "142.93.185.175:80", + "142.93.176.6:80", + "157.230.46.77:80", + "142.93.176.199:80", + "66.42.43.126:80", + "157.230.36.156:80", + "157.230.40.36:80", + "139.180.146.218:80", + "139.180.144.127:80", + "157.230.46.86:80", + "66.42.45.171:80", + "142.93.176.120:80", + "66.42.40.181:80", + "142.93.191.35:80", + "157.230.32.100:80", + "139.180.144.251:80", + "142.93.185.36:80", + "157.230.32.8:80", + "142.93.191.93:80", + "142.93.191.109:80", + "66.42.44.8:80", + "139.180.144.149:80", + "142.93.182.225:80", + "157.230.34.7:80", + "142.93.176.93:80", + "142.93.182.96:80", + "66.42.45.199:80", + "142.93.182.233:80", + "66.42.32.204:80", + "139.180.146.61:80", + "66.42.40.80:80", + "142.93.182.79:80", + "142.93.185.222:80", + "139.180.147.126:80", + "142.93.191.221:80", + "157.230.46.168:80", + "139.180.145.144:80", + "139.180.146.205:80", + "157.230.44.10:80", + "157.230.47.42:80", + "142.93.184.237:80", + "157.230.40.38:80", + "157.230.42.134:80", + "157.230.40.98:80", + "142.93.191.44:80", + "157.230.34.20:80", + "139.180.144.25:80", + "142.93.182.34:80", + "142.93.184.128:80", + "157.230.40.46:80", + "66.42.44.178:80", + "157.230.42.179:80", + "157.230.46.255:80", + "157.230.32.216:80", + "139.180.145.245:80", + "157.230.46.104:80", + "157.230.32.104:80", + "157.230.38.32:80", + "142.93.176.227:80", + "157.230.34.16:80", + "66.42.44.145:80", + "157.230.34.250:80", + "47.244.246.221:80", + "47.244.247.231:80", + "142.93.184.182:80", + "157.230.40.161:80", + "157.230.34.96:80", + "157.230.32.99:80", + "142.93.182.39:80", + "142.93.191.230:80", + "139.180.147.242:80", + "157.230.36.30:80", + "66.42.42.114:80", + "142.93.182.68:80", + "157.230.34.43:80", + "157.230.42.111:80", + "66.42.42.24:80", + "66.42.45.114:80", + "157.230.32.197:80", + "142.93.176.118:80", + "157.230.34.54:80", + "157.230.38.90:80", + "139.180.147.208:80", + "157.230.44.63:80", + "157.230.36.60:80", + "157.230.47.237:80", + "139.180.145.35:80", + "157.230.36.110:80", + "142.93.184.106:80", + "142.93.191.95:80", + "142.93.191.126:80", + "142.93.185.141:80", + "157.230.42.228:80", + "157.230.36.247:80", + "157.230.38.189:80", + "142.93.191.204:80", + "139.180.144.98:80", + "142.93.184.142:80", + "66.42.45.113:80", + "157.230.42.250:80", + "66.42.43.58:80", + "157.230.44.11:80", + "157.230.47.117:80", + "139.180.147.205:80", + "47.244.245.3:80", + "157.230.44.122:80", + "139.180.144.212:80", + "157.230.42.18:80", + "157.230.42.244:80", + "157.230.46.84:80", + "157.230.42.96:80", + "157.230.47.180:80", + "139.180.147.137:80", + "142.93.191.27:80", + "139.180.144.240:80", + "139.180.146.172:80", + "142.93.184.5:80", + "139.180.144.175:80", + "66.42.42.152:80", + "142.93.182.151:80", + "157.230.42.155:80", + "139.180.144.120:80", + "142.93.182.85:80", + "157.230.40.194:80", + "157.230.34.218:80", + "157.230.44.111:80", + "142.93.185.129:80", + "157.230.36.23:80", + "157.230.42.129:80", + "142.93.182.171:80", + "157.230.32.15:80", + "142.93.182.1:80", + "157.230.40.85:80", + "157.230.47.189:80", + "157.230.32.27:80", + "66.42.39.130:80", + "157.230.38.99:80", + "157.230.46.244:80", + "66.42.39.20:80", + "139.180.146.131:80", + "142.93.176.97:80", + "157.230.36.36:80", + "139.180.147.202:80", + "139.180.147.51:80", + "157.230.47.84:80", + "157.230.44.96:80", + "47.244.254.221:80", + "142.93.191.138:80", + "142.93.176.31:80", + "157.230.44.136:80", + "157.230.36.57:80", + "142.93.182.32:80", + "157.230.36.167:80", + "142.93.184.45:80", + "157.230.47.71:80", + "142.93.176.63:80", + "157.230.34.50:80", + "157.230.40.88:80", + "139.180.147.154:80", + "157.230.47.78:80", + "157.230.40.185:80", + "142.93.184.94:80", + "66.42.32.50:80", + "157.230.47.48:80", + "142.93.191.110:80", + "142.93.182.218:80", + "157.230.42.92:80", + "139.180.147.102:80", + "157.230.42.192:80", + "139.180.147.40:80", + "157.230.34.10:80", + "157.230.47.12:80", + "142.93.184.225:80", + "142.93.176.190:80", + "157.230.36.12:80", + "139.180.145.139:80", + "157.230.42.237:80", + "157.230.38.48:80", + "66.42.43.225:80", + "139.180.146.206:80", + "157.230.36.3:80", + "157.230.32.118:80", + "142.93.182.243:80", + "47.244.242.9:80", + "157.230.40.212:80", + "157.230.36.112:80", + "66.42.42.71:80", + "157.230.36.24:80", + "142.93.185.232:80", + "142.93.176.241:80", + "142.93.182.48:80", + "66.42.41.236:80", + "139.180.145.34:80", + "142.93.182.38:80", + "157.230.32.5:80", + "157.230.44.99:80", + "139.180.146.225:80", + "66.42.41.114:80", + "142.93.176.210:80", + "157.230.44.132:80", + "157.230.36.120:80", + "142.93.182.155:80", + "157.230.46.128:80", + "139.180.147.2:80", + "157.230.47.73:80", + "142.93.184.174:80", + "157.230.38.125:80", + "142.93.185.18:80", + "157.230.42.62:80", + "157.230.42.118:80", + "139.180.147.55:80", + "157.230.34.246:80", + "139.180.147.136:80", + "157.230.44.80:80", + "139.180.146.132:80", + "157.230.47.190:80", + "142.93.176.137:80", + "157.230.47.228:80", + "157.230.36.163:80", + "142.93.176.37:80", + "139.180.146.141:80", + "157.230.46.150:80", + "139.180.147.140:80", + "142.93.182.107:80", + "142.93.191.172:80", + "142.93.184.240:80", + "142.93.182.7:80", + "142.93.176.110:80", + "157.230.38.70:80", + "142.93.176.121:80", + "157.230.44.98:80", + "157.230.47.134:80", + "139.180.145.99:80", + "142.93.191.167:80", + "47.244.246.226:80", + "157.230.34.181:80", + "157.230.40.96:80", + "139.180.146.108:80", + "142.93.176.195:80", + "142.93.176.217:80", + "157.230.42.167:80", + "157.230.36.189:80", + "157.230.40.74:80", + "139.180.144.197:80", + "157.230.32.146:80", + "157.230.46.135:80", + "157.230.34.91:80", + "47.244.245.164:80", + "139.180.145.201:80", + "157.230.36.203:80", + "157.230.44.166:80", + "157.230.40.70:80", + "157.230.42.88:80", + "157.230.44.197:80", + "142.93.182.197:80", + "139.180.145.191:80", + "157.230.44.12:80", + "142.93.184.23:80", + "157.230.47.17:80", + "157.230.34.34:80", + "157.230.38.69:80", + "142.93.176.111:80", + "66.42.43.1:80", + "157.230.34.205:80", + "157.230.36.135:80", + "66.42.42.226:80", + "66.42.44.10:80", + "142.93.176.229:80", + "142.93.182.72:80", + "142.93.185.69:80", + "157.230.34.110:80", + "142.93.185.142:80", + "142.93.185.156:80", + "157.230.32.235:80", + "157.230.46.11:80", + "142.93.182.110:80", + "157.230.42.168:80", + "157.230.40.177:80", + "142.93.191.10:80", + "142.93.184.133:80", + "142.93.176.48:80", + "139.180.146.18:80", + "142.93.182.149:80", + "66.42.44.243:80", + "157.230.34.82:80", + "157.230.34.230:80", + "142.93.182.114:80", + "139.180.146.190:80", + "66.42.32.249:80", + "142.93.184.146:80", + "157.230.47.75:80", + "157.230.47.98:80", + "142.93.185.247:80", + "157.230.34.136:80", + "139.180.144.55:80", + "142.93.184.117:80", + "157.230.42.243:80", + "157.230.40.210:80", + "157.230.40.191:80", + "157.230.32.223:80", + "157.230.47.103:80", + "142.93.191.183:80", + "142.93.182.213:80", + "139.180.146.181:80", + "157.230.38.198:80", + "157.230.34.79:80", + "66.42.33.167:80", + "157.230.44.32:80", + "142.93.185.4:80", + "142.93.184.183:80", + "157.230.40.129:80", + "157.230.40.77:80", + "139.180.147.109:80", + "157.230.46.247:80", + "66.42.33.148:80", + "66.42.33.89:80", + "157.230.47.220:80", + "66.42.32.248:80", + "142.93.176.23:80", + "142.93.184.158:80", + "142.93.182.222:80", + "157.230.46.230:80", + "157.230.38.180:80", + "142.93.185.24:80", + "157.230.47.227:80", + "157.230.36.174:80", + "157.230.44.45:80", + "157.230.40.29:80", + "66.42.45.75:80", + "66.42.44.92:80", + "142.93.184.150:80", + "157.230.44.185:80", + "142.93.184.253:80", + "139.180.146.126:80", + "139.180.146.20:80", + "157.230.47.130:80", + "157.230.40.16:80", + "157.230.40.51:80", + "142.93.185.5:80", + "139.180.144.156:80", + "157.230.34.238:80", + "157.230.42.224:80", + "157.230.34.215:80", + "142.93.182.84:80", + "157.230.38.97:80", + "157.230.38.179:80", + "142.93.191.207:80", + "157.230.44.250:80", + "66.42.39.250:80", + "142.93.184.124:80", + "157.230.34.62:80", + "139.180.144.229:80", + "157.230.38.33:80", + "142.93.191.115:80", + "142.93.176.80:80", + "157.230.34.145:80", + "157.230.47.25:80", + "139.180.147.24:80", + "157.230.32.149:80", + "157.230.32.202:80", + "157.230.34.64:80", + "139.180.144.75:80", + "139.180.144.207:80", + "157.230.34.216:80", + "157.230.42.213:80", + "66.42.32.143:80", + "157.230.40.101:80", + "66.42.39.235:80", + "139.180.144.141:80", + "139.180.145.164:80", + "157.230.42.99:80", + "142.93.185.251:80", + "157.230.40.113:80", + "157.230.32.7:80", + "139.180.145.217:80", + "142.93.182.30:80", + "66.42.43.26:80", + "142.93.184.198:80", + "157.230.47.161:80", + "142.93.182.87:80", + "142.93.185.189:80", + "139.180.145.122:80", + "139.180.147.230:80", + "66.42.44.254:80", + "157.230.38.47:80", + "157.230.42.159:80", + "157.230.32.241:80", + "66.42.41.162:80", + "157.230.46.74:80", + "157.230.46.162:80", + "139.180.145.96:80", + "142.93.184.153:80", + "139.180.147.81:80", + "142.93.191.222:80", + "139.180.145.207:80", + "142.93.176.98:80", + "157.230.32.237:80", + "157.230.44.238:80", + "139.180.147.70:80", + "157.230.34.138:80", + "157.230.42.202:80", + "142.93.176.207:80", + "66.42.33.242:80", + "157.230.36.38:80", + "157.230.46.148:80", + "142.93.184.196:80", + "142.93.182.198:80", + "142.93.185.228:80", + "142.93.184.98:80", + "142.93.191.89:80", + "142.93.176.174:80", + "142.93.184.2:80", + "157.230.36.207:80", + "66.42.42.133:80", + "157.230.47.6:80", + "157.230.32.214:80", + "139.180.144.142:80", + "142.93.184.89:80", + "142.93.185.53:80", + "142.93.184.20:80", + "157.230.36.107:80", + "157.230.34.151:80", + "142.93.191.148:80", + "142.93.184.40:80", + "157.230.44.102:80", + "139.180.144.28:80", + "139.180.144.140:80", + "157.230.34.182:80", + "142.93.176.244:80", + "47.244.253.237:80", + "157.230.42.95:80", + "139.180.147.250:80", + "142.93.185.15:80", + "142.93.185.127:80", + "142.93.176.152:80", + "139.180.147.4:80", + "47.244.243.240:80", + "142.93.176.64:80", + "66.42.41.212:80", + "142.93.185.198:80", + "142.93.182.17:80", + "157.230.44.248:80", + "142.93.191.213:80", + "157.230.44.220:80", + "142.93.182.19:80", + "142.93.191.106:80", + "139.180.145.80:80", + "66.42.32.244:80", + "66.42.43.201:80", + "157.230.32.177:80", + "142.93.191.4:80", + "142.93.184.46:80", + "66.42.44.220:80", + "66.42.39.221:80", + "139.180.144.22:80", + "157.230.34.25:80", + "157.230.38.121:80", + "66.42.41.194:80", + "157.230.36.141:80", + "66.42.40.244:80", + "142.93.185.224:80", + "142.93.176.197:80", + "142.93.184.137:80", + "157.230.40.250:80", + "142.93.176.205:80", + "142.93.185.81:80", + "139.180.147.47:80", + "157.230.38.9:80", + "157.230.36.61:80", + "139.180.146.19:80", + "157.230.44.212:80", + "157.230.32.43:80", + "157.230.36.228:80", + "139.180.144.255:80", + "157.230.40.44:80", + "142.93.182.80:80", + "142.93.176.160:80", + "142.93.191.193:80", + "139.180.147.156:80", + "142.93.185.51:80", + "142.93.176.42:80", + "142.93.191.5:80", + "157.230.42.180:80", + "157.230.47.197:80", + "157.230.32.56:80", + "142.93.184.122:80", + "157.230.46.209:80", + "47.244.244.225:80", + "157.230.44.30:80", + "157.230.46.144:80", + "157.230.46.245:80", + "47.244.242.57:80", + "139.180.146.166:80", + "142.93.185.116:80", + "157.230.42.67:80", + "157.230.47.159:80", + "139.180.145.193:80", + "157.230.42.205:80", + "139.180.146.105:80", + "142.93.182.133:80", + "157.230.47.172:80", + "142.93.185.100:80", + "142.93.176.24:80", + "157.230.44.33:80", + "157.230.42.71:80", + "142.93.182.228:80", + "66.42.39.151:80", + "139.180.145.210:80", + "139.180.144.87:80", + "139.180.144.213:80", + "157.230.42.49:80", + "157.230.46.0:80", + "157.230.44.62:80", + "139.180.144.104:80", + "139.180.145.133:80", + "142.93.191.208:80", + "157.230.36.39:80", + "157.230.34.219:80", + "157.230.44.107:80", + "157.230.46.212:80", + "157.230.42.185:80", + "157.230.32.226:80", + "142.93.191.141:80", + "142.93.191.67:80", + "157.230.32.21:80", + "157.230.44.218:80", + "157.230.42.30:80", + "139.180.147.84:80", + "142.93.184.152:80", + "157.230.44.162:80", + "157.230.34.198:80", + "157.230.46.37:80", + "142.93.182.59:80", + "142.93.185.114:80", + "142.93.182.216:80", + "66.42.32.211:80", + "139.180.146.112:80", + "157.230.34.185:80", + "157.230.40.99:80", + "139.180.147.60:80", + "142.93.184.86:80", + "142.93.191.159:80", + "157.230.38.165:80", + "142.93.185.213:80", + "157.230.40.217:80", + "142.93.184.60:80", + "142.93.184.126:80", + "139.180.146.163:80", + "142.93.182.106:80", + "157.230.47.120:80", + "142.93.182.115:80", + "66.42.41.11:80", + "157.230.44.114:80", + "157.230.38.87:80", + "157.230.44.182:80", + "157.230.36.195:80", + "139.180.147.163:80", + "142.93.182.58:80", + "139.180.146.176:80", + "157.230.44.72:80", + "157.230.40.171:80", + "157.230.42.178:80", + "157.230.36.73:80", + "66.42.44.174:80", + "157.230.46.240:80", + "66.42.40.193:80", + "142.93.191.85:80", + "142.93.185.160:80", + "142.93.191.217:80", + "139.180.147.98:80", + "157.230.40.245:80", + "157.230.47.211:80", + "157.230.38.132:80", + "157.230.32.185:80", + "142.93.191.228:80", + "142.93.182.137:80", + "157.230.46.152:80", + "66.42.33.208:80", + "157.230.36.133:80", + "139.180.146.135:80", + "139.180.144.161:80", + "66.42.39.217:80", + "157.230.40.190:80", + "157.230.44.208:80", + "157.230.36.251:80", + "139.180.145.19:80", + "139.180.147.245:80", + "142.93.176.103:80", + "142.93.185.118:80", + "142.93.182.74:80", + "157.230.38.205:80", + "142.93.184.202:80", + "157.230.32.67:80", + "157.230.42.23:80", + "157.230.46.217:80", + "157.230.38.227:80", + "157.230.36.190:80", + "142.93.182.36:80", + "157.230.38.133:80", + "157.230.40.110:80", + "142.93.176.245:80", + "157.230.34.86:80", + "157.230.46.1:80", + "142.93.184.103:80", + } + + randomIndex := rand.Intn(len(IP)) + pick := IP[randomIndex] + return pick +} \ No newline at end of file diff --git a/internal/engine/experiment/randomtraffic/randomtraffic.go b/internal/engine/experiment/randomtraffic/randomtraffic.go new file mode 100644 index 0000000000..616088885d --- /dev/null +++ b/internal/engine/experiment/randomtraffic/randomtraffic.go @@ -0,0 +1,508 @@ +// Package randomtraffic contains the randomtraffic experiment. + +package randomtraffic + +import ( + "context" + "errors" + "math/rand" + "net" + "strconv" + "time" + + "github.com/ooni/probe-cli/v3/internal/model" + "github.com/ooni/probe-cli/v3/internal/netxlite" +) + +// testVersion is the experiment version. +const testVersion = "0.1.0" + +// Config contains the experiment config. +type Config struct { + // Target IP of the experiment + Target string `ooni:"Target IP"` +} + +// TestKeys contains the experiment's result. +type TestKeys struct { + // True if no errors occurred + Success bool `json:"success"` + + // Number of successful connections after control test + ConnectionCount int `json:"connection_count"` + + // The popcount of the triggering packet + FinalPopcount float64 `json:"final_popcount"` + + // True if first six bytes of the final payload are printable + FirstSix bool `json:"first_six"` + + // True if there exist twenty contiguous bytes of printable ASCII in the final payload + TwentyContig bool `json:"twenty_contig"` + + // True if at least half of the final payload is made up of printable ASCII + HalfPrintable bool `json:"half_printable"` + + // True if final popcount is less than 3.4 or greater than 4.6 + PopcountRange bool `json:"popcount_range"` + + // True if fingerprinted as HTTP + MatchesHTTP bool `json:"matches_http"` + + // True if fingerprinted as TLS + MatchesTLS bool `json:"matches_tls"` + + // Payload of final packet + Payload []byte `json:"payload"` + + // False if all 20 connections succeeded + Censorship bool `json:"censorship"` + + // String of error + Failure *string `json:"failure"` +} + +// Measurer performs the measurement. +type Measurer struct { + // config contains the experiment settings. + config Config +} + +// ExperimentName implements model.ExperimentMeasurer.ExperimentName. +func (m *Measurer) ExperimentName() string { + return "randomtraffic" +} + +// ExperimentVersion implements model.ExperimentMeasurer.ExperimentVersion. +func (m *Measurer) ExperimentVersion() string { + return testVersion +} + +// Prediction stores the boolean value of each exemption rule +// (as specified in Algorithm 1) of the final packet sent +type Prediction struct { + // True if first six bytes of the payload are printable + FirstSix bool + + // True if there exist twenty contiguous bytes of printable ASCII in the payload + TwentyContig bool + + // True if at least half of the payload is made up of printable ASCII + HalfPrintable bool + + // True if popcount is less than 3.4 or greater than 4.6 + PopcountRange bool + + // True if fingerprinted as HTTP + MatchesHTTP bool + + // True if fingerprinted as TLS + MatchesTLS bool +} + +// Sets defaults of prediction in the event of no payloads being sent +func defaultPrediction() Prediction { + return Prediction{ + FirstSix: false, + TwentyContig: false, + HalfPrintable: false, + PopcountRange: false, + MatchesHTTP: false, + MatchesTLS: false} +} + +// Checks if a byte represents a printable ASCII character +func isPrintable(b byte) bool { + return (b >= 0x20 && b <= 0x7e) +} + +// Checks if all bytes in a byte array are printable ASCII characters +func allPrintable(bytes []byte) bool { + for _, b := range bytes { + if !isPrintable(b) { + return false + } + } + return true +} + +// Counts the number of one bits there are in any given byte +func bitsInByte(b byte) int { + count := 0 + var mask byte = 0x01 + for p := 1; p <= 8; p++ { + // Isolate bit and see if zero + if b&mask != 0x00 { + count++ + } + // Move mask + mask = mask << 1 + } + return count +} + +// Returns the popcount of the given byte stream +func popcount(bytes []byte) float64 { + bitCount := 0 + // Sum all one bits + for _, b := range bytes { + bitCount += bitsInByte(b) + } + // Calculate average bits per byte + return (float64(bitCount) / float64(len(bytes))) +} + +// Compares two byte array slices +func slicesEqual(a, b []byte) bool { + if len(a) != len(b) { + return false + } + for i, v := range a { + if v != b[i] { + return false + } + } + return true +} + +// Returns true if bytes match HTTP fingerprint +func fingerprintHTTP(bytes []byte) bool { + + // Specific HTTP headers that are exempt from blocking + GET := [4]byte{0x47, 0x45, 0x54, 0x20} + PUT := [4]byte{0x50, 0x55, 0x54, 0x20} + POST := [5]byte{0x50, 0x4F, 0x53, 0x54, 0x20} + HEAD := [5]byte{0x48, 0x45, 0x41, 0x44, 0x20} + + // Check if byte array begins with one of the above and return + return (slicesEqual(bytes[:4], GET[:]) || + slicesEqual(bytes[:4], PUT[:]) || + slicesEqual(bytes[:5], POST[:]) || + slicesEqual(bytes[:5], HEAD[:])) +} + +// Returns true if bytes match TLS fingerprint +func fingerprintTLS(bytes []byte) bool { + if bytes[0] == 0x16 || bytes[0] == 0x17 { + return (bytes[1] == 0x03 && bytes[2] >= 0x00 && bytes[2] <= 0x09) + } else { + return false + } +} + +// Checks if popcount is allowed +func popcountTest(bytes []byte) bool { + popcount := popcount(bytes) + return (popcount > 4.6 && popcount < 3.4) +} + +// Checks all three ASCII criteria and popcount that the censorship looks for +func getPrediction(bytes []byte) Prediction { + + // Initializing values + firstSix := false + twentyContig := false + halfPrintable := false + + // Checks the first six bytes are printable ASCII characters + if allPrintable(bytes[:6]) { + firstSix = true + } + + contig := 0 + total := 0 + for _, b := range bytes { + if isPrintable(b) { + // Keeping count of contiguous printable ASCII bytes + contig = contig + 1 + // If there are twenty contiguous printable ASCII bytes the packet is not censored + if contig >= 20 { + twentyContig = true + } + // Count total printable ASCII bytes + total = total + 1 + } else { + // Reset contiguous count if not printable ASCII + contig = 0 + } + } + // If more than 50% of the packet is printable ASCII the packet is not censored + halfPrintable = (float64(total) / float64(len(bytes))) > .5 + + // Remaining exemptions + popcountRange := popcountTest(bytes) + matchesHTTP := fingerprintHTTP(bytes) + matchesTLS := fingerprintTLS(bytes) + + // Returning prediction + return Prediction{ + FirstSix: firstSix, + TwentyContig: twentyContig, + HalfPrintable: halfPrintable, + PopcountRange: popcountRange, + MatchesHTTP: matchesHTTP, + MatchesTLS: matchesTLS} +} + +// maxRuntime is the maximum runtime for this experiment +const maxRuntime = 300 * time.Second + +// Converts domain name to IP address +func domainToIP(hostname string, ctx context.Context, sess model.ExperimentSession) { + reso := netxlite.NewStdlibResolver(sess.Logger()) + + addrs, err := reso.LookupHost(ctx, "dns.google") + if err != nil { + handle(err, false, sess) + } + sess.Logger().Infof("resolver addrs: %+v", addrs) +} + +const maxTests = 20 + +// Run implements model.ExperimentMeasurer.Run. +func (m *Measurer) Run( + ctx context.Context, sess model.ExperimentSession, + measurement *model.Measurement, callbacks model.ExperimentCallbacks, +) error { + // Creating timeout context + ctx, cancel := context.WithTimeout(ctx, maxRuntime) + defer cancel() + + // Running control + var err error = nil + var timeout bool = false + var residual bool = false + var payload []byte = nil + + var controlAttempts int = 3 + + // We count in 22th's because 22 messages will be logged + // One for the control, one each of the 20 tests, and one after all is cleaned up + callbacks.OnProgress(1.0/(float64(maxTests)+2.0), "Initializing IP") + + if m.config.Target != "" { + // If IP provided, run control on that IP + sess.Logger().Infof("Running control on %s", m.config.Target) + timeout, err = testIP(m.config.Target, true, &payload, ctx, sess) + if err != nil { + // If control test fails inform and carry error + sess.Logger().Warnf("%s", "Control test failed. This may be due to residual censorship. Try again in 3-5 minutes.") + } else { + // If control test successful continue with test + sess.Logger().Infof("Control test successful") + + // Logging IP and port + sess.Logger().Infof("Running tests on %s", m.config.Target) + } + } else { + // If no IP given, continue testing while attempts remain until we find a valid IP + checkForIP := true + for checkForIP == true && controlAttempts > 0 { + // Fetching IP address + m.config.Target = GetIP() + + // Beginning control test + sess.Logger().Infof("Running control on %s", m.config.Target) + timeout, err = testIP(m.config.Target, true, &payload, ctx, sess) + + // Decrementing attempts left + controlAttempts = controlAttempts - 1 + if err != nil { + if controlAttempts > 0 { + // If failed with more attempts, inform user + sess.Logger().Infof("Control test failed. Fetching new IP") + } else { + // If failed with no attempts, inform user and end search + sess.Logger().Infof("Failed to connect at this time") + checkForIP = false + } + } else { + // If control test successful log and end search + sess.Logger().Infof("Control test successful") + + // Logging IP and port + sess.Logger().Infof("Running tests on %s", m.config.Target) + checkForIP = false + } + } + } + + // Running tests + testCount := 1 + + // If there is censorship detected or an experiment error, end the experiment + // Note: This will not run if the control test fails + for testCount <= maxTests && err == nil && residual == false { + + // Informing client, running test, and looping to next test + callbacks.OnProgress(float64(testCount+1)/(float64(maxTests)+2.0), "Running test "+strconv.Itoa(testCount)) + timeout, err = testIP(m.config.Target, false, &payload, ctx, sess) + + // If timeout, it should timeout again due to residual censorship. This tests that + if timeout == true { + + // Logging and running test + sess.Logger().Infof("Checking residual") + residual, err = testIP(m.config.Target, false, &payload, ctx, sess) + + // If not residual, log and continue testing + if residual == false { + sess.Logger().Infof("Connection successful") + timeout = false + } + + } + + // Incrementing test count + testCount = testCount + 1 + } + + testCount = testCount - 1 + callbacks.OnProgress(1, "Done.") + + // Configuring testkeys + measurement.TestKeys = configureTestKeys(testCount, timeout, residual, payload, err, sess.Logger()) + + // Return error (nil if no error) + return err +} + +// This function establishes and returns a TCP connection between the client and a target IP address +func dialTCP(ctx context.Context, address string, logger model.DebugLogger) (net.Conn, error) { + d := netxlite.NewDialerWithoutResolver(logger) + return d.DialContext(ctx, "tcp", address) +} + +// This function handles errors as a result of establishing a connection +// If handling a control test error, any error including a timeouts will be returned +func handle(err error, control bool, sess model.ExperimentSession) (bool, error) { + var ew *netxlite.ErrWrapper + if !errors.As(err, &ew) { + // Experiment error, no timeout + return false, errors.New("Error not wrapped") + } + + // If timeout, log and return + if err.Error() == netxlite.FailureGenericTimeoutError { + sess.Logger().Infof("Connection timed out") + if control { + return true, err + } else { + return true, nil + } + } + + // Otherwise, log error and return the error + sess.Logger().Warnf("error string : %s", err.Error()) + sess.Logger().Warnf("OONI failure : %s", ew.Failure) + sess.Logger().Warnf("failed operation: %s", ew.Operation) + sess.Logger().Warnf("underlying error: %+v", ew.WrappedErr) + + // Experiment error and no timeout returned + return false, err +} + +// This function runs a single test on an IP by establishing a connection and if successful +// then sending random data through the connection as an attempt to trigger the censorship + +// Note: The control test does NOT expect timeout errors and will return an error +func testIP( + IP string, control bool, payload *[]byte, + ctx context.Context, sess model.ExperimentSession, +) (bool, error) { + + // Connecting to target IP address + conn, err := dialTCP(ctx, IP, sess.Logger()) + + // Handling error + if err != nil { + sess.Logger().Warnf("%s", "Failed to connect") + return handle(err, control, sess) + } + defer conn.Close() + + // If this is not the control test then make the payload random + if !control { + // The average payload length is between 500 and 1000. This creates + // an array of bytes in that range, all of which are zero + bytes := make([]byte, rand.Intn(500)+500) + + // Filling byte array with random bytes + rand.Read(bytes) + + // Record payload + *payload = bytes + + // Bytes are sent through the connection + conn.Write(bytes) + } + + // No timeout and no experiment error + return false, nil +} + +func configureTestKeys( + testCount int, timeout bool, residual bool, + payload []byte, err error, logger model.InfoLogger, +) *TestKeys { + testkeys := &TestKeys{} + + // If there is no error the test was successfully conducted + testkeys.Success = (err == nil) + + // If the connection timed out and residual censorship was observed + // then censorship is logged + testkeys.Censorship = (timeout == true && residual == true) + + // If there is an error, save its string in the test keys + if err != nil { + errString := err.Error() + testkeys.Failure = &errString + } else { + testkeys.Failure = nil + } + + // Amount of successful connections is the test count + // one is subtracted due to the one failed connection + testkeys.ConnectionCount = testCount - 1 + + // Using payload to set both Payload and FinalPopcount testkeys + testkeys.Payload = payload + testkeys.FinalPopcount = popcount(payload) + + // Setting prediction using payload + prediction := defaultPrediction() + if err == nil { + prediction = getPrediction(payload) + } + + // Setting remaining testkeys + testkeys.FirstSix = prediction.FirstSix + testkeys.TwentyContig = prediction.TwentyContig + testkeys.HalfPrintable = prediction.HalfPrintable + testkeys.PopcountRange = prediction.PopcountRange + testkeys.MatchesHTTP = prediction.MatchesHTTP + testkeys.MatchesTLS = prediction.MatchesTLS + + // Logging Results + logger.Infof("Success: %s", strconv.FormatBool(testkeys.Success)) + logger.Infof("Censorship: %s", strconv.FormatBool(timeout == true && residual == true)) + + return testkeys +} + +// NewExperimentMeasurer creates a new ExperimentMeasurer. +func NewExperimentMeasurer(config Config) model.ExperimentMeasurer { + return &Measurer{config: config} +} + +// SummaryKeys contains summary keys for this experiment. +type SummaryKeys struct { + IsAnomaly bool `json:"-"` +} + +// GetSummaryKeys implements model.ExperimentMeasurer.GetSummaryKeys. +func (m Measurer) GetSummaryKeys(measurement *model.Measurement) (interface{}, error) { + return SummaryKeys{IsAnomaly: false}, nil +} diff --git a/internal/engine/experiment/randomtraffic/randomtraffic_test.go b/internal/engine/experiment/randomtraffic/randomtraffic_test.go new file mode 100644 index 0000000000..eb6f20eb34 --- /dev/null +++ b/internal/engine/experiment/randomtraffic/randomtraffic_test.go @@ -0,0 +1,122 @@ +package randomtraffic_test + +import ( + "context" + "testing" + + "github.com/apex/log" + "github.com/ooni/probe-cli/v3/internal/engine/experiment/randomtraffic" + "github.com/ooni/probe-cli/v3/internal/engine/mockable" + "github.com/ooni/probe-cli/v3/internal/model" +) + +func TestNewExperimentMeasurer(t *testing.T) { + measurer := randomtraffic.NewExperimentMeasurer(randomtraffic.Config{}) + if measurer.ExperimentName() != "randomtraffic" { + t.Fatal("unexpected name") + } + if measurer.ExperimentVersion() != "0.1.0" { + t.Fatal("unexpected version") + } +} + +// Tests successful connection +func TestSuccess(t *testing.T) { + m := randomtraffic.NewExperimentMeasurer(randomtraffic.Config{ + Target: "18.67.76.44:443", // Replace with Edgenet IP when ready + }) + ctx := context.Background() + sess := &mockable.Session{MockableLogger: log.Log} + callbacks := model.NewPrinterCallbacks(sess.Logger()) + measurement := new(model.Measurement) + err := m.Run(ctx, sess, measurement, callbacks) + if err != nil { + t.Fatal(err) + } + sk, err := m.GetSummaryKeys(measurement) + if err != nil { + t.Fatal(err) + } + if _, ok := sk.(randomtraffic.SummaryKeys); !ok { + t.Fatal("invalid type for summary keys") + } + tk := measurement.TestKeys.(*randomtraffic.TestKeys) + if tk.Success != true { + t.Fatal("invalid Failure") + } + if tk.Censorship != false { + t.Fatal("invalid Censorship") + } + t.Logf("%d", tk.ConnectionCount) +} + +// Tests connection timeout +func TestTimeout(t *testing.T) { + m := randomtraffic.NewExperimentMeasurer(randomtraffic.Config{ + Target: "8.8.4.4:1", + }) + ctx := context.Background() + sess := &mockable.Session{MockableLogger: log.Log} + callbacks := model.NewPrinterCallbacks(sess.Logger()) + measurement := new(model.Measurement) + err := m.Run(ctx, sess, measurement, callbacks) + if err == nil { + t.Fatal(err) + } + sk, err := m.GetSummaryKeys(measurement) + if err != nil { + t.Fatal(err) + } + if _, ok := sk.(randomtraffic.SummaryKeys); !ok { + t.Fatal("invalid type for summary keys") + } + tk := measurement.TestKeys.(*randomtraffic.TestKeys) + if tk.Success != false { + t.Fatal("invalid Failure") + } + if tk.Censorship != false { + t.Fatal("invalid Censorship") + } +} + +// Tests unrelated connection failure +func TestFailure(t *testing.T) { + m := randomtraffic.NewExperimentMeasurer(randomtraffic.Config{ + Target: "127.0.0.1:443", + }) + ctx := context.Background() + sess := &mockable.Session{MockableLogger: log.Log} + callbacks := model.NewPrinterCallbacks(sess.Logger()) + measurement := new(model.Measurement) + err := m.Run(ctx, sess, measurement, callbacks) + if err == nil { + t.Fatal(err) + } + sk, err := m.GetSummaryKeys(measurement) + if err != nil { + t.Fatal(err) + } + if _, ok := sk.(randomtraffic.SummaryKeys); !ok { + t.Fatal("invalid type for summary keys") + } + tk := measurement.TestKeys.(*randomtraffic.TestKeys) + if tk.Success != false { + t.Fatal("invalid Failure") + } + if tk.Censorship != false { + t.Fatal("invalid Censorship") + } +} + +func TestSummaryKeysGeneric(t *testing.T) { + measurement := &model.Measurement{TestKeys: &randomtraffic.TestKeys{}} + m := &randomtraffic.Measurer{} + osk, err := m.GetSummaryKeys(measurement) + if err != nil { + t.Fatal(err) + } + sk := osk.(randomtraffic.SummaryKeys) + if sk.IsAnomaly { + t.Fatal("invalid isAnomaly") + } +}