From 763652cb0142a0e0f868007b6c05013163fd97ba Mon Sep 17 00:00:00 2001 From: "arraykeys@gmail.com" Date: Tue, 19 Sep 2017 17:16:16 +0800 Subject: [PATCH] Signed-off-by: arraykeys@gmail.com --- .gitignore | 6 + CHANGELOG | 23 + auth-file | 3 + blocked | 4833 ++++++++++++++++++++++++++++++++++++++++++++++ config.go | 115 ++ direct | 456 +++++ functions.go | 346 ++++ io-limiter.go | 97 + keygen.sh | 3 + main.go | 382 ++++ map.go | 315 +++ pool.go | 145 ++ proxy.toml | 72 + proxyd | 36 + release.sh | 57 + serve-channel.go | 125 ++ structs.go | 219 +++ 17 files changed, 7233 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG create mode 100644 auth-file create mode 100644 blocked create mode 100755 config.go create mode 100644 direct create mode 100755 functions.go create mode 100644 io-limiter.go create mode 100755 keygen.sh create mode 100644 main.go create mode 100644 map.go create mode 100755 pool.go create mode 100644 proxy.toml create mode 100755 proxyd create mode 100755 release.sh create mode 100644 serve-channel.go create mode 100644 structs.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..300f8c6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +proxy +*.exe +*.exe~ +release-* +proxy.crt +proxy.key diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..4816624 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,23 @@ +proxy更新日志: +v2.2 +1.增加了强制使用上级代理参数always.可以使所有流量都走上级代理. +2.增加了定时检查网络是否正常,可以在本地网络不稳定的时候修复连接池状态,提升代理访问体验. +3.http代理增加了对ipv6地址的支持。 + +v2.1 +1.增加了http basic验证功能,可以对http代理协议设置basic验证,用户名和密码支持来自文件或者命令行. +2.优化了域名检查方法,避免空连接的出现。 +3.修复了连接上级代理超时参数传递错误导致超时过大的问题. +4.增加了连接池状态监测,如果上级代理或者网络出现问题,会及时重新初始化连接池,防止大量无效连接,降低浏览体验. +5.增加了对系统kill信号的捕获,可以在收到系统kill信号之后执行清理释放连接的操作.避免出现大量CLOSE_WAIT. + +v2.0 +1.增加了连接池功能,大幅提高了通过上级代理访问的速度. +2.HTTP代理模式,优化了请求URL的获取逻辑,可以支持:http,https,websocket +3.增加了TCP代理模式,支持是否加密通讯. +4.优化了链接关闭逻辑,避免出现大量CLOSE_WAIT. +5.增加了黑白名单机制,更自由快速的访问. +6.优化了网站Block机制检测,判断更准确. + +v1.0 +1.始发版本,可以代理http,https. diff --git a/auth-file b/auth-file new file mode 100644 index 0000000..26024e0 --- /dev/null +++ b/auth-file @@ -0,0 +1,3 @@ +#comment +user3:pass3 +user4:pass4 \ No newline at end of file diff --git a/blocked b/blocked new file mode 100644 index 0000000..cadcda6 --- /dev/null +++ b/blocked @@ -0,0 +1,4833 @@ +0rz.tw +0to255.com +0zz0.com +1-apple.com.tw +1000dosok.ru +1000giri.net +1024.inc.gs +10conditionsoflove.com +10musume.com +10youtube.com +123cha.com +123rf.com +123sdfsdfsdfsd.ru +12bet.com +12vpn.com +141hongkong.com +1688.com.au +173ng.com +177wyt.com +17t17p.com +1800flowers.com +18onlygirls.com +18virginsex.com +1984bbs.com +1984bbs.org +1998cdp.org +1bao.org +1eew.com +1pondo.tv +2-hand.info +2000fun.com +2008xianzhang.info +213.so +21andy.com +21sextury.com +228.net.tw +24smile.org +2cat.twbbs.org +2shared.com +301works.org +315lz.com +32red.com +343dy.net +365singles.com.ar +36rain.com +3a5a.com +3boys2girls.com +3ren.ca +3suisses.fr +3tui.net +4bluestones.biz +4chan.org +4everproxy.com +4life.com +4proxy.de +4shared.com +4sq.com +4sqi.net +4tube.com +51.ca +5278.cc +5i01.com +5isotoi5.org +5maodang.com +6-4.net +64museum.org +64tianwang.com +64wiki.com +666kb.com +6park.com +6v6dota.com +7capture.com +7cow.com +8-d.com +84000.co +85cc.net +85st.com +881903.com +888.com +89-64.org +8news.com.tw +9001700.com +908taiwan.org +91porn.com +92ccav.com +9bis.com +9bis.net +9to5mac.com +a-normal-day.com +a5.com.ru +aamacau.com +aarki.net +abc.com.py +abc.pp.ru +abc.xyz +abchinese.com +abercrombie.com +abitno.linpie.com +ablwang.com +aboluowang.com +aboutgfw.com +ac.jiruan.net +accounts.blogger.com +acgkj.com +actimes.com.au +aculo.us +adblockplus.org +addictedtocoffee.de +addthis.com +admob.com +adult-empire.com +adult.friendfinder.com +adultfriendfinder.com +adultkeep.net +advanscene.com +advertfan.com +aenhancers.com +af.mil +agoogleaday.com +ahcdn.com +aiph.net +aisex.com +ait.org.tw +aiweiwei.com +aiweiweiblog.com +ajaxplorer.info +ajsands.com +akamai.net +akamaihd.net +akiba-online.com +aktifhaber.com +al-qimmah.net +alabout.com +alarabiya.net +alasbarricadas.org +aldi.co.uk +aldi.us +alexlur.org +alien-ufos.com +aliengu.com +aliorbank.pl +alkasir.com +all-that-is-interesting.com +allaboutalpha.com +allasians.com +allgirlsallowed.org +alliance.org.hk +allinfa.com +allinfo.com +alllaw.com +allmovie.com +allmusic.com +allonlinux.free.fr +allproducts.com.tw +alphaporno.com +alternate-tools.com +altrec.com +alvinalexander.com +alwaysdata.com +alwaysdata.net +am730.com.hk +amakings.com +amateurhomevids.com +amateursexy.net +amazon.com +amazonaws.com +ameblo.jp +americangreencard.com +americorps.gov +amiblockedornot.com +amnesty.ca +amnesty.org +amnesty.org.au +amnesty.org.il +amnesty.org.pl +amnesty.org.ru +amnesty.org.uk +amnestyusa.org +amnyemachen.org +amoiist.com +ampproject.org +amtrak.com +amusingplanet.com +amzs.me +ana.co.jp +analyze-v.com +anchorfree.com +ancsconf.org +andfaraway.net +android-x86.org +android.com +angel-live.com +angularjs.org +animalpolitico.com +animecrazy.net +animeshippuuden.com +aniscartujo.com +anobii.com +anontext.com +anonym.to +anonymitynetwork.com +anonymizer.com +anonymouse.org +anpopo.com +answering-islam.org +antd.org +anthonycalzadilla.com +antidrm.hpg.ig.com.br +antiwave.net +anying.ca +anysex.com +aobo.com.au +aolchannels.aol.com +aolnews.com +aomiwang.com +apetube.com +api.linksalpha.com +api.mobilepicture.com +api.path.com +api.proxlet.com +api.supertweet.net +apiary.io +apidocs.linksalpha.com +apigee.com +app.box.com +app.heywire.com +app.hkatvnews.com +appannie.com +appleactionews.com +appledaily.com +appledaily.com.hk +appledaily.com.tw +apps.admob.com +apps.hloli.net +appspot.com +aprs.net +ar.hao123.com +arabic-keyboard.org +archdaily.net +archive.is +archive.org +archlinuxarm.org +arctosia.com +areca-backup.org +arlingtoncemetery.mil +army.mil +art-or-porn.com +artifacts.com.tw +artsy.net +artwitter.com +arzon.jp +asahichinese.com +asana.com +asdfg.jp +asg.to +asiaharvest.org +asianews.it +asianspiss.com +asianwomensfilm.de +askstudent.com +askynz.net +assembla.com +assembly.com +assets-yammer.com +astonmartinnews.com +astrill.com +atc.org.au +atchinese.com +atdmt.com +atgfw.org +ath.cx +atj.org.tw +atlaspost.com +atnext.com +augsburger-allgemeine.de +auth.keyhole.com +autoblog.com +av100fun.com +avaaz.org +avast.com +avdb.in +avdb.tv +avery.com +avidemux.org +avito.ru +avnoma.com +avoision.com +avval.ir +awardwinningfjords.com +axureformac.com +azerbaycan.tv +azubu.tv +bab-ul-islam.net +babynet.com.hk +backblaze.com +backchina.com +backpackers.com.tw +backpage.com +backtotiananmen.com +badassjs.com +badjojo.com +badoo.com +baidu.jp +baixing.me +bajarfacebook.com +bajaryoutube.com +balatarin.com +ballpure.com +bananaman.kir.jp +bananarepublic.com +bankmillennium.pl +bannedbook.org +barenakedislam.com +barnabu.co.uk +barracudanetworks.com +basetimesheightdividedby2.com +bayvoice.net +bb.ttv.com.tw +bbc.co +bbc.co.uk +bbc.com +bbc.in +bbcchinese.com +bbci.co.uk +bbg.gov +bbs-tw.com +bbs.cantonese.asia +bbs.ecstart.com +bbs.hanminzu.org +bbs.kimy.com.tw +bbs.morbell.com +bbs.mychat.to +bbs.ozchinese.com +bbs.qmzdd.com +bbs.sina.com +bbs.skykiwi.com +bbs.soul-plus.net +bbs.tuitui.info +bbsfeed.com +bbsland.com +bbsone.com +bbtoystore.com +bcast.co.nz +bcc.com.tw +bcchinese.net +bd.zhe.la +bdsmvideos.net +beaconevents.com +beanstalkapp.com +bebo.com +beeg.com +behindkink.com +beijing1989.com +beijingspring.com +benjaminste.in +benjerry.com +berlintwitterwall.com +berm.co.nz +beslist.nl +bestadbid.com +bestforchina.org +bestgore.com +bestofyoutube.com +bestvpn.com +bestvpnservice.com +bestvpnusa.com +bet365.com +beta.iset.com.tw +beta.usejump.com +betbase1.info +betfair.com +betfair.com.au +betternet.co +bettween.com +betvictor.com +bewww.net +beyondfirewall.com +bfnn.org +bfsh.hk +bhg.com +biantailajiao.com +biantailajiao.in +biblesforamerica.org +bic2011.org +big.az +bigcommerce.com +bigfools.com +bignews.org +bigsound.org +bigtits.com +bigtitstokyo.com +bill.zhong.pp.ru +bill2-software.com +billypan.com +billywr.com +binaryage.com +bind2.com +bintray.com +bipic.net +birdsontwitter.com +bit.ly +bitbucket.org +bitcointalk.org +bitly.com +bitshare.com +bizhat.com +bjnewlife.org +bjs.com +bjzc.org +blinkx.com +blinw.com +blip.tv +blockcn.com +blockedsiteaccess.com +blog.birdhouseapp.com +blog.bitly.com +blog.boxcar.io +blog.com +blog.conviso.com.br +blog.davidziegler.net +blog.dayoneapp.com +blog.de +blog.dribbble.com +blog.exblog.co.jp +blog.excite.co.jp +blog.expofutures.com +blog.fizzik.com +blog.foolsmountain.com +blog.gowalla.com +blog.hotpotato.com +blog.ifttt.com +blog.instagram.com +blog.instapaper.com +blog.iphone-dev.org +blog.istef.info +blog.jackjia.com +blog.joeyrobert.org +blog.jp +blog.kangye.org +blog.kickstarter.com +blog.kl.am +blog.klip.me +blog.lester850.info +blog.lightbox.com +blog.mongodb.org +blog.openinkpot.org +blog.palm.com +blog.path.com +blog.pathtosharepoint.com +blog.pentalogic.net +blog.pikchur.com +blog.pilotmoon.com +blog.qooza.hk +blog.ranxiang.com +blog.rockmelt.com +blog.romanandreg.com +blog.sina.com.tw +blog.sogoo.org +blog.sparrowmailapp.com +blog.summify.com +blog.syx86.cn +blog.syx86.com +blog.taragana.com +blog.tiney.com +blog.topify.com +blog.trello.com +blog.usa.gov +blog.webmproject.org +blog.wenweipo.com +blog.writelonger.com +blog.xuite.net +blog.youthwant.com.tw +blog.youxu.info +blogblog.com +blogcatalog.com +blogcdn.com +blogcity.me +blogger.com +blogger.com.br +blogimg.jp +bloglines.com +bloglovin.com +blogs.icerocket.com +blogs.tampabay.com +blogs.yahoo.co.jp +blogsky.com +blogsmithmedia.com +blogspot.ca +blogspot.ch +blogspot.cl +blogspot.co.id +blogspot.co.ke +blogspot.co.uk +blogspot.co.za +blogspot.com +blogspot.com.br +blogspot.com.co +blogspot.com.es +blogspot.com.ng +blogspot.com.tr +blogspot.cz +blogspot.de +blogspot.dk +blogspot.fi +blogspot.hk +blogspot.hu +blogspot.in +blogspot.jp +blogspot.kr +blogspot.mx +blogspot.no +blogspot.ro +blogspot.ru +blogspot.sg +blogspot.tw +blogtd.net +blogtd.org +bloodshed.net +bloomberg.cn +bloomberg.com +bloomberg.com.br +bloomberg.de +bloombergbusiness.com +bloombergview.com +bloomfortune.com +bloomingdales.com +blueangellive.com +bnrmetal.com +boardreader.com +bobsredmill.com +bobulate.com +bod.asia +bodog88.com +bolin.netfirms.com +bomnegocio.com +bonbonme.com +bond-adventures.com +bondageco.com +bonjourlesgeeks.com +boobstagram.com +book.com.tw +bookbrowse.com +books.com.tw +bookshelfporn.com +bootstrapcdn.com +bot.nu +botanwang.com +botonestwitter.com +bowenpress.com +box.com +box.net +boxcdn.net +boxpn.com +boxun.com +boxun.tv +boxunblog.com +boxunclub.com +boyfriendtv.com +boysfood.com +boysmaster.com +br.hao123.com +br.st +bralio.com +branch.com +brandonhutchinson.com +braumeister.org +bravoerotica.com +bravoteens.com +bravotube.net +brazzers.com +break.com +breakingtweets.com +breakwall.net +briefdream.com +brightkite.com +briian.com +brizzly.com +broadbook.com +broadpressinc.com +brokebackasians.com +browserscope.org +brucewang.net +brutaltgp.com +bt95.com +btdigg.org +btspread.com +btunnel.com +budaedu.org +buddhistchannel.tv +buff.ly +bugclub.org +bulbous.freeserve.co.uk +bullog.org +bullogger.com +bullogs.com +bunbunhk.com +busayari.com +businessinsider.com +businessinsider.com.au +businesstimes.com.cn +businessweek.com +busytrade.com +buugaa.com +buzzhand.com +buzztter.com +buzzurl.jp +bwsj.hk +bx.tl +bypassthe.net +c-and-a.com +c-est-simple.com +c-spanvideo.org +c1521.biz.tm +c1522.mooo.com +cablenews.i-cable.com +cachvaofacebook.com +cacnw.com +cactusvpn.com +caf.fr +cafepress.com +cafepress.com.au +cahr.org.tw +calameo.com +calebelston.com +calgarysun.com +cam4.com +cam4.jp +cam4.sg +cambio.com +camdough.com +cameleo.ru +camfrog.com +cams.com +cams.org.sg +canadameet.com +canoe.ca +canyu.org +cao.im +caobian.info +caochangqing.com +carabinasypistolas.com +cardinalkungfoundation.org +cargill.com +cargurus.com +cari.com.my +carmotorshow.com +cartoonmovement.com +casatibet.org.mx +casinobellini.com +casinoking.com +casinoriva.com +caspion.com +cat-world.com.au +catcatbox.com +catch22.net +catfightpayperview.xxx +cathnews.com +catholic.org.hk +catholic.org.tw +cathvoice.org.tw +cattt.com +cbc.ca +cbs.ntu.edu.tw +cbsnews.com +cbtc.org.hk +ccavtop10.com +ccdtr.org +ccim.org +cclife.org +ccthere.com +cctongbao.com +ccue.ca +ccue.com +cdbook.org +cdd.me +cdef.org +cdig.info +cdjp.org +cdn.embedly.com +cdn.optimizely.com +cdn.printfriendly.com +cdn.softlayer.net +cdn.sstatic.net +cdn.staticstuff.net +cdn.v2ex.com +cdnews.com.tw +cdninstagram.com +cdp.sinica.edu.tw +cdp1989.org +cdp1998.org +cdp2006.org +cdpa.url.tw +cdpeu.org +cdpusa.org +cdpweb.org +cdpwu.org +cduniverse.com +cdw.com +cecc.gov +celebritymovieblog.com +cellulo.info +cenci.tk +cenews.eu +centralnation.com +centurys.net +certificate-transparency.org +certificate.revocationcheck.com +cfhks.org.hk +cftfc.com +cgdepot.org +cgst.edu +ch.shvoong.com +chacha.com +chandoo.org +change.org +changp.com +chaos.e-spacy.com +chapm25.com +charter.com +chaturbate.com +chengmingmag.com +chenguangcheng.com +chenpokong.com +cherrysave.com +chevronwp7.com +chhongbi.org +chicagoncmtv.com +china-labour.org.hk +china-week.com +china101.com +china18.org +china21.com +china21.org +china5000.us +chinaaffairs.org +chinaaid.me +chinaaid.net +chinaaid.org +chinaaid.us +chinabuye.com +chinachange.org +chinachannel.hk +chinacomments.org +chinadigitaltimes.net +chinaeweekly.com +chinafreepress.org +chinagate.com +chinageeks.org +chinagfw.org +chinagreenparty.org +chinahorizon.org +chinahush.com +chinainperspective.com +chinainperspective.net +chinainperspective.org +chinainterimgov.org +chinalaborwatch.org +chinalawandpolicy.com +chinalawtranslate.com +chinamule.com +chinamz.org +chinapress.com.my +chinarightsia.org +chinasocialdemocraticparty.com +chinasoul.org +chinatimes.com +chinatown.com.au +chinatweeps.com +chinaway.org +chinaworker.info +chinaxchina.com +chinayouth.org.hk +chinayuanmin.org +chinese-hermit.net +chinese-memorial.org +chinese.engadget.com +chinese.net.au +chinese.rfi.fr +chinese.rnw.nl +chinese.soifind.com +chinesedaily.com +chinesedailynews.com +chinesefriendfinders.com +chinesen.de +chinesenewsnet.com +chinesepen.org +chinesetalks.net +chingcheong.com +chinman.net +chithu.org +chn.chosun.com +chrdnet.com +chrispederick.com +chrispederick.net +christianstudy.com +christiantimes.org.hk +christusrex.org +chrlawyers.hk +chrlcg-hk.org +chrome.angrybirds.com +chrome.com +chromeadblock.com +chromeexperiments.com +chromercise.com +chromium.org +chubun.com +chuizi.net +cineastentreff.de +cipherdyne.org +circleofmoms.com +circlethebayfortibet.org +citizenlab.org +citizenscommission.hk +citizensradio.org +city365.ca +city9x.com +citysearch.com +civicparty.hk +civilhrfront.org +civiliangunner.com +civilmedia.tw +cjb.net +ck101.com +cl.d0z.net +cl.ly +cl.ufree.org +classicalguitarblog.net +classically.me +classicscore.hut2.ru +classmarker.com +clb.org.hk +clearclips.com +clearharmony.net +clearwisdom.net +click.xda-developers.com +clientsfromhell.net +cling.omy.sg +clinica-tibet.ru +clip.dj +clipfish.de +cliphunter.com +cloudflare.com +cloudfront.com +cloudfront.net +club1069.com +cmi.org.tw +cmoinc.org +cms.gov +cmule.com +cmule.org +cn.calameo.com +cn.dayabook.com +cn.fmnnow.com +cn.giganews.com +cn.ibtimes.com +cn.reuters.com +cn.streetvoice.com +cn.uncyclopedia.wikia.com +cn.voa.mobi +cn2.streetvoice.com +cn6.eu +cna.com +cna.com.tw +cnavista.com.tw +cnd.org +cnn.com +cochina.co +cochina.org +cocoa.zonble.net +cocoapods.org +cocolog-nifty.com +code1984.com +codeboxapp.com +codeshare.io +codeskulptor.org +colgate.com +collateralmurder.com +collateralmurder.org +collegefashion.net +colormyfacebook.com +comefromchina.com +commandarms.com +commentshk.com +commercebank.com +compileheart.com +connect.facebook.net +connectedchina.reuters.com +conoyo.com +contactmagazine.net +contests.twilio.com +convio.net +coobai.com +coobay.com +cookingtothegoodlife.com +cool18.com +coolaler.com +coolder.com +coolloud.org.tw +coolncute.com +corumcollege.com +cosmiq.de +costumesupercenter.com +cotweet.com +couchdbwiki.com +coupang.com +couverturefacebook.com +coveringweb.com +cpj.org +cracked.com +crackle.com +crackle.com.ar +crackle.com.br +crackle.com.co +crackle.com.mx +crackle.com.ve +crashlytics.com +crchina.org +crd-net.org +creaders.net +crocoguide.com +crossthewall.net +crowy.net +csdparty.com +css.pixnet.in +csuchen.de +ctfriend.net +ctheroux.com +cthlo.github.io +ctitv.com.tw +cts.com.tw +cubicle17.com +cuhkacs.org +cuihua.org +cuiweiping.net +cultpens.com +culture.tw +cumlouder.com +curvefish.com +cvs.com +cw.com.tw +cwahi.net +cyberghost.natado.com +cyberghostvpn.com +cylex.de +cynscribe.com +cytode.us +d20pfsrd.com +dabr.co.uk +dabr.me +dabr.mobi +dadazim.com +dadi360.com +dafagood.com +dafahao.com +dailidaili.com +dailymotion.com +dailynews.sina.com +dajiyuan.com +dajiyuan.eu +dajusha.baywords.com +dalailama.com +dalailama.ru +dalailamaprotesters.info +dalailamavisit.org.nz +dalailamaworld.com +dalianmeng.org +daliulian.org +dallasobserver.com +danawa.com +dancingbear.com +danke4china.net +danwei.org +daolan.net +darpa.mil +dastrassi.org +data-vocabulary.org +date.fm +datpiff.com +david-kilgour.com +davidslog.com +daxa.cn +dayaarmongol.ning.com +daylife.com +dcard.tw +dcmilitary.com +ddc.com.tw +ddfnetwork.com +ddhw.com +ddoo.cc +de-sci.org +deck.ly +default.secureserver.net +definebabe.com +delcamp.net +delcampe.net +deletefacebook.com +delicious.com +demo.opera-mini.net +democrats.org +derekhsu.homeip.net +desc.se +descargaryoutube.com +designerol.com +designyoutube.com +desipapa.com +destiny.xfiles.to +destroy-china.jp +destroytwitter.com +deutsche-welle.de +dev102.com +developer.android.com +developers.box.net +deviantart.com +deviantart.net +devio.us +devpn.com +dfanning.com +dfas.mil +dharamsalanet.com +dhl.de +diaoyuislands.org +digicert.com +digiland.tw +digitalnomadsproject.org +digitalocean.com +diigo.com +dimitrik.free.fr +dingoonity.org +dinside.no +dipity.com +directcreative.com +directlyrics.com +diretta.it +dirty.ru +discogs.com +discuss.com.hk +dish.com +disneyrollergirl.net +disp.cc +dit-inc.us +dizhidizhi.com +dizhuzhishang.com +djangosnippets.org +djorz.com +dl-laby.jp +dl.box.net +dl.dropboxusercontent.com +dlsite.com +dmcdn.net +dmm.co.jp +dmm.com +dns2go.com +dnscrypt.org +dnsimple.com +dnssec.net +do.co +docker.com +docs.chef.io +docs.docker.com +documentingreality.com +dogfartnetwork.com +dojin.com +dok-forum.net +dolc.de +dolf.org.hk +dollf.com +domain.club.tw +domain4ik.ru +domainhelp.search.com +domains.googlesyndication.com +dongde.com +dongtaiwang.com +dongtaiwang.net +dongyangjing.com +dontfilter.us +dontmovetochina.com +dotheyfolloweachother.com +dotnettwitter.com +dotplane.com +dotsub.com +dotup.org +doubleaf.com +doubleclick.com +doubleclick.net +dougscripts.com +dowei.org +down4youtube.com +downfacebook.com +download.aircrack-ng.org +download.ithome.com.tw +doxygen.org +dphk.org +dpp.org.tw +dracoola.org +dragtimes.com +draw.io +drdobbs.com +dreamcheeky.com +dreammask.org +drepung.org +drewolanoff.com +drgan.net +dribbble.com +dropbox.com +dropboxstatic.com +dropboxusercontent.com +droplr.com +drsunacademy.com +drtuber.com +dscn.info +dslr-forum.de +dtiblog.com +dtic.mil +dtiserv2.com +duck.hk +duckduckgo.com +duckload.com +duckmylife.com +duga.jp +duihua.org +duihuahrjournal.org +duoweitimes.com +duping.net +duplicati.com +dupola.com +dupola.net +dupont.com +dvorak.org +dw-world.com +dw-world.de +dw.com +dw.de +dwheeler.com +dwnews.com +dwnews.net +dy24k.info +dynawebinc.com +dyndns.org +dz3w.com +dzze.com +e-classical.com.tw +e-gold.com +e-hentai.org +e-info.org.tw +e-shop.gr +e-traderland.net +e-travel.com +e123.hk +e15.cz +eamonnbrennan.com +earthcam.com +earthquake.usgs.gov +eastturkestan.com +eastturkistan-gov.org +eastturkistan.net +eastturkistangovernmentinexile.us +easybranches.com +easybytez.com +easyca.ca +easypic.com +ebony-beauty.com +ebookbrowse.com +ebookee.com +echofon.com +ecministry.net +econ.st +economist.com +ecsm.vs.com +edgecastcdn.net +edgesuite.net +edicypages.com +edigitalsurvey.com +editmysite.com +edoors.com +edubridge.com +eevpn.com +efcc.org.hk +efksoft.com +efmoe.com +efukt.com +egyig.com +eic-av.com +eksisozluk.com +electionsmeter.com +electrical-engineering-portal.com +elementaryos.org +elgoog.im +eloqua.com +elotrolado.net +elpais.com +elpais.com.co +elpais.com.uy +eltondisney.com +emacsblog.org +embedly.com +embr.in +emgn.com +emgog.com +emory.edu +emule-ed2k.com +emuparadise.me +en.favotter.net +en.hao123.com +enewstree.com +enfal.de +engadget.com +englishforeveryone.org +englishfromengland.co.uk +englishtown.com +enormego.com +entermap.com +entnt.com +eogli.org +episcopalchurch.org +epoch-archive.com +epochtimes-bg.com +epochtimes-romania.com +epochtimes.co.id +epochtimes.co.il +epochtimes.co.kr +epochtimes.com +epochtimes.com.au +epochtimes.com.br +epochtimes.com.tw +epochtimes.com.ua +epochtimes.de +epochtimes.fr +epochtimes.ie +epochtimes.jp +epochtimes.ru +epochtimes.se +epochtimestr.com +epochweekly.com +equestriadaily.com +equinenow.com +erabaru.net +eraysoft.com.tr +erepublik.com +erights.net +eriversoft.com +erktv.com +ernestmandel.org +ero-video.net +eroharuhi.net +eroprofile.com +eroshinbo.com +eroticsaloon.net +esky.pl +eslite.com +esmas.com +etaa.org.au +etaiwannews.com +etizer.org +etools.ncol.com +etracker.com +ettoday.net +eucasino.com +eukhost.com +eulam.com +eurekavpt.com +europages.fr +evchk.wikia.com +eventbrite.com +eventful.com +evernote.com +everyday-carry.com +everythingtwitter.com +exblog.jp +excelforum.com +expatshield.com +expedia.com +expekt.com +experts-univers.com +exploader.net +expressvpn.com +extmatrix.com +extrapetite.com +extremetube.com +eyespirit.info +eyevio.jp +eyny.com +ezpc.tk +ezpeer.com +fabric.io +facebook.com +facebook.com.bd +facebook.com.br +facebook.com.mx +facebook.net +facebookquotes4u.com +faceless.me +facesofnyfw.com +facesoftibetanselfimmolators.info +fail.hk +faithfuleye.com +faiththedog.info +fakku.net +falsefire.com +falun-co.org +falun-ny.net +falunart.org +falunasia.info +falundafa-dc.org +falundafa-florida.org +falundafa-nc.org +falundafa.org +falundafamuseum.org +falungong.org.uk +falunhr.org +faluninfo.net +falunpilipinas.net +falunworld.net +familyfed.org +famunion.com +fan-qiang.com +fangbinxing.com +fangeming.com +fanglizhi.info +fangong.org +fangongheike.com +fanqianghou.com +fanqiangyakexi.net +fanswong.com +fanyue.info +fapdu.com +farwestchina.com +fashionhotbox.com +fashionpulis.com +fastly.net +fastpic.ru +faststone.org +favorious.com +favotter.net +favstar.fm +fawanghuihui.org +faydao.com +fb.com +fb.me +fbcdn.net +fbsbx.com +fc2.com +fc2blog.net +fc2blog.us +fc2china.com +fdc89.jp +feathersite.com +feedblitz.com +feedbooks.mobi +feedburner.com +feedly.com +feeds.feedburner.com +feeds.fileforum.com +feeds2.feedburner.com +feedsportal.com +feedzshare.com +feelssh.com +feer.com +feitian-california.org +feitianacademy.org +felixcat.net +feministteacher.com +fengzhenghu.com +ff.im +fflick.com +fgmtv.net +fgmtv.org +fiberprox.eu +filefactory.com +fileflyer.com +files2me.com +fileserve.com +fillthesquare.org +filterbypass.me +filthdump.com +fimes.gr +finalion.jp +financetwitter.com +findbook.tw +findmespot.com +fingerdaily.com +finler.net +fireofliberty.org +firstfivefollowers.com +firstmerit.com +flagsonline.it +flamefans.com +flashscore.com +flecheinthepeche.fr +fleshbot.com +flexibits.com +flickr.com +flickrhivemind.net +flightcaster.com +flipboard.com +flirt.com +fmnnow.com +fnac.es +fnacspectacles.com +focustaiwan.tw +focusvpn.com +fofg.org +fofldfradio.org +fooooo.com +footwiball.com +forexpf.ru +forgeofempires.com +forum.baby-kingdom.com +forum.cyberctm.com +forum.idsam.com +forum.iset.com.tw +forum.my903.com +forum.mymaji.com +forum.omy.sg +forum.palmislife.com +forum.setty.com.tw +forum.sina.com.hk +forum.slime.com.tw +forum.tvb.com +forum4hk.com +forums.freenas.org +fotop.net +fourface.nodesnoop.com +fourthinternational.org +foxdie.us +foxgay.com +foxsub.com +foxtang.com +fpmt-osel.org +fpmt.org +fpmt.tw +fpmtmexico.org +fqok.org +fqrouter.com +fr-online.de +franceculture.fr +franklc.com +freakshare.com +fredwilson.vc +free-gate.org +free-hada-now.org +free-proxyserver.com +free-ssh.com +free.fr +free4u.com.ar +freealim.com +freebase.com +freechal.com +freechina.net +freedl.org +freedom-ip.com +freedomcollection.org +freedomhouse.org +freeforums.org +freegao.com +freehostia.com +freelancer.com +freelotto.com +freeman2.com +freemoren.com +freemorenews.com +freenet-china.org +freenetproject.org +freenewscn.com +freeoda.com +freeones.com +freeopenvpn.com +freeoz.org +freepik.com +freepornofreeporn.com +freesafeip.com +freessh.us +freetibet.net +freetibet.org +freetibetanheroes.org +freevpn.nl +freewallpaper4.me +freewebs.com +freewebsubmission.com +freeweibo.com +freexinwen.com +freeyellow.com +freeyoutubeproxy.net +frequency.com +friendfeed-media.com +friendfeed.com +friends-of-tibet.org +friendscout24.de +friendsoftibet.org +fring.com +fringenetwork.com +fromchinatousa.net +frommel.net +frontlinedefenders.org +fscked.org +fsdn.com +fsurf.com +ftchinese.com +fucd.com +fuckcnnic.net +fucked-tube.com +fuckgfw.com +fuckgfw.org +fulue.com +funf.tw +funny-games.biz +funp.com +funp.com.tw +fuq.com +furhhdl.org +furinkan.com +furl.net +futurechinaforum.org +futureme.org +futuremessage.org +fux.com +fuyin.net +fw.cm +fxnetworks.com +fzh999.com +fzh999.net +fzlm.com +g-cash.biz +g.co +g.e-hentai.org +gabocorp.com +gaeproxy.com +gaforum.org +galenwu.com +game735.com +gamebase.com.tw +gamefans.com +gamejolt.com +gamer.com.tw +gamerseden.kir.jp +gamez.com.tw +gamousa.com +gandi.net +ganges.com +gaoming.net +gaopi.net +gaozhisheng.net +gaozhisheng.org +gappp.org +gardennetworks.com +gardennetworks.org +garena.tw +gartlive.com +gates.com +gather.com +gaymap.cc +gaytube.com +gazetapraca.pl +gazotube.com +gcc.org.hk +gclooney.com +gcpnews.com +gcr.io +gdbt.net +gdzf.org +geek-art.net +geekerhome.com +geekmade.co.uk +geekmanuals.com +gelbooru.com +generesis.com +gentlecuff.com +genuitec.com +geocities.co.jp +geocities.com +geocities.jp +geohot.com +geometrictools.com +georgiapower.com +get-digital-help.com +get-tune.net +getchu.com +getcloudapp.com +getcomposer.org +getfoxyproxy.org +getfreedur.com +getgom.com +getiton.com +getjetso.com +getlantern.org +getnarrative.com +getonfacebook.com +getprismatic.com +getsmartlinks.com +getsocialscope.com +getuploader.com +getyouram.com +gfw.org.ua +ggpht.com +ggssl.com +ghconduit.com +ghost.org +ghut.org +giga-web.jp +gigacircle.com +gigporno.ru +giltcity.com +gimpshop.com +gioco.it +girisfacebook.com +girlbanker.com +girlfriendvideos.com +gist.github.com +git-scm.com +gitbooks.io +github.com +github.io +githubapp.com +githubusercontent.com +gittigidiyor.com +givemesomethingtoread.com +gizlen.net +glennhilton.com +global-ssl.fastly.net +global.hkepc.com +global.ssl.fastly.net +globaldelight.com +globaljihad.net +globalmediaoutreach.com +globalmuseumoncommunism.org +globalrescue.hopto.org +globalrescue.net +globalvoicesonline.org +glock.com +gloryhole.com +glue-static.s3-external-3.amazonaws.com +gmail.com +gmhz.org +gmiddle.com +gmiddle.net +gmll.org +gmodules.com +gmozomg.izihost.org +gnci.org.hk +gnuradio.org +go-pki.com +goagent.biz +goagentplus.com +god.tv +godaddy.com +godfootsteps.org +godsdirectcontact.com +godsdirectcontact.info +godsdirectcontact.org +godsdirectcontact.org.tw +gohappy.com.tw +gokbayrak.com +golan.org +golang.org +goldbet.com +goldbetsports.com +goldenfrog.com +goldenmelody.com.tw +goldwave.com +golem.de +gongm.in +gongmeng.info +gongminliliang.com +gongwt.com +goo.gl +good.gd +goodreaders.com +goodreads.com +goodshow.tw +goodthaigirl.com +goodtv.com.tw +goodtv.tv +goofind.com +google-analytics.com +google-cardboard.com +google.ae +google.am +google.as +google.at +google.az +google.ba +google.be +google.bg +google.bi +google.bs +google.ca +google.cd +google.cg +google.ch +google.ci +google.cl +google.co.bw +google.co.ck +google.co.cr +google.co.hu +google.co.id +google.co.il +google.co.in +google.co.jp +google.co.ke +google.co.kr +google.co.ls +google.co.ma +google.co.nz +google.co.th +google.co.ug +google.co.uk +google.co.uz +google.co.ve +google.co.vi +google.co.zm +google.com +google.com.af +google.com.ag +google.com.ar +google.com.au +google.com.bd +google.com.bh +google.com.bo +google.com.br +google.com.bz +google.com.co +google.com.cu +google.com.do +google.com.ec +google.com.eg +google.com.et +google.com.gi +google.com.gt +google.com.hk +google.com.jm +google.com.ly +google.com.mt +google.com.mx +google.com.my +google.com.na +google.com.nf +google.com.ni +google.com.np +google.com.om +google.com.pa +google.com.pe +google.com.ph +google.com.pk +google.com.pr +google.com.py +google.com.sa +google.com.sb +google.com.sg +google.com.sv +google.com.tj +google.com.tr +google.com.tw +google.com.ua +google.com.uy +google.com.vc +google.com.vn +google.de +google.dj +google.dk +google.dm +google.es +google.fi +google.fm +google.fr +google.gl +google.gm +google.gr +google.hn +google.hr +google.ht +google.ie +google.is +google.it +google.jo +google.kg +google.kz +google.li +google.lk +google.lt +google.lu +google.lv +google.mn +google.ms +google.mu +google.mw +google.nl +google.no +google.nu +google.off.ai +google.org +google.pl +google.pn +google.pt +google.ro +google.ru +google.rw +google.sc +google.se +google.sh +google.sk +google.sm +google.sn +google.tm +google.to +google.tp +google.tt +google.vg +google.vu +google.ws +googleadservices.com +googleapis.com +googleapps.com +googleartproject.com +googlecode.com +googlecommerce.com +googledomains.com +googledrive.com +googleearth.com +googlegroups.com +googlehosted.com +googlelabs.com +googlemail.com +googlemashups.com +googlepages.com +googleplus.com +googlesile.com +googlesource.com +googlestore.com +googlesyndication.com +googletagmanager.com +googletagservices.com +googleusercontent.com +googlevideo.com +googlewave.com +gopetition.com +goproxing.com +gospelherald.com +gospelherald.com.hk +gosurf.asia +gotgayporn.com +gotovim.ru +gotw.ca +gov.tw +governmentjobs.com +gpass1.com +gplusexpertise.com +gqueues.com +grandtrial.org +grangorz.org +graphis.ne.jp +gratka.pl +gravatar.com +graylog2.org +greasespot.net +great-firewall.com +great-roc.org +greatfire.org +greatfirewall.biz +greatfirewallofchina.net +greatfirewallofchina.org +greatroc.org +greatroc.tw +greatzhonghua.org +greenparty.org.tw +greenpeace.com.tw +greenpeace.org +greenvpn.net +group-facials.com +gs-discuss.com +gstatic.com +gtricks.com +gu-chu-sum.org +guancha.org +guardster.com +guide-twitter.com +guishan.org +guitarlist.net +gumtree.com +gun-world.net +gunsamerica.com +gunsandammo.com +guomin.us +gutefrage.net +gutteruncensored.com +gvlib.com +gvm.com.tw +gvt0.com +gvt1.com +gvt2.com +gvt3.com +gyalwarinpoche.com +gyatsostudio.com +gzm.tv +gzone-anime.info +gzoo.org +h-china.org +h1n1china.org +h2porn.com +hacken.cc +hacking-facebook.com +hackmyfacebook.com +hackthatphone.net +hahlo.com +hakkatv.org.tw +hanunyi.com +happi-game-center.com +haproxy.org +hardsextube.com +harley-davidson.com +harunyahya.com +hasaowall.com +have8.com +haxx.se +hbogo.com +hd1080.org +hdtvb.net +heartyit.com +heatsale.com +hecaitou.net +hechaji.com +heeact.edu.tw +hegre-art.com +heix.pp.ru +heiyo.info +helloandroid.com +hellonewyork.us +helloqueer.com +hellotxt.com +hellouk.org +help.linksalpha.com +help.opera.com +help.trello.com +helpeachpeople.com +helplinfen.com +helpster.de +helpzhuling.org +hen.bao.li +hentaimedia.com +hentaitube.tv +hentaivideoworld.com +heqinglian.net +here4news.com +heritage.org +hersheys.com +heungkongdiscuss.com +hexieshe.com +hexxeh.net +heyzo.com +hgseav.com +hidden-advent.org +hide.me +hidecloud.com +hideipvpn.com +hideman.net +hideme.be +hidemyass.com +hidemyipaddress.org +hideweb.org +higfw.com +highcharts.com +highrockmedia.com +hihiforum.com +hihistory.net +hiitch.com +hikinggfw.org +hilive.tv +himalayan-foundation.org +himalayanglacier.com +himemix.com +himemix.net +hipmunk.com +hizb-ut-tahrir.info +hizb-ut-tahrir.org +hizbuttahrir.org +hjclub.info +hk-pub.com +hk.geocities.com +hk.gradconnection.com +hk.jiepang.com +hk32168.com +hkatvnews.com +hkbc.net +hkbf.org +hkchurch.org +hkdailynews.com.hk +hkday.net +hkej.com +hkepc.com +hkfreezone.com +hkfront.org +hkg.westkit.net +hkgolden.com +hkgreenradio.org +hkheadline.com +hkhkhk.com +hkjc.com +hkjp.easyweb.hk +hkjp.org +hkptu.org +hkreporter.com +hkreporter.loved.hk +hkupop.hku.hk +hkwcc.org.hk +hkzone.org +hmv.com +hnjhj.com +hocusfoc.us +hola.com +hola.org +hollisterco.com +holyspiritspeaks.org +holz.byethost8.com +home.sina.com +home.so-net.net.tw +homedepot.com +homeip.net +homemademoviez.com +homeperversion.com +homeservershow.com +hometeenmovs.com +hongkongfp.com +hongmeimei.com +hongzhi.li +hootsuite.com +hot-sex-tube.com +hotfile.com +hotfrog.com.tw +hotgamesforgirls.com +hotgoo.com +hotpornshow.com +hotpot.hk +hotshame.com +hotspotshield.com +hottystop.com +hougaige.com +howtodownloadmusicfromyoutube.com +howtoforge.com +howtogeek.com +hqcdp.org +hqmovies.com +hrblock.com +hrcchina.org +hrcir.com +hrea.org +hrichina.org +hrw.org +hsbc.com.hk +hsjp.net +hsselite.com +hstern.net +hstt.net +ht.ly +htkou.net +htl.li +html.it +html5rocks.com +htmldog.com +htxt.it +hua-yue.net +huaglad.com +huanghuagang.org +huaren.us +huaxia-news.com +huaxiabao.org +huaxin.ph +hudatoriq.web.id +hugoroy.eu +huhaitai.com +huhamhire.com +hulkshare.com +hulu.com +huluim.com +humanrightsbriefing.org +hung-ya.com +hungerstrikeforaids.org +huping.net +hussytube.com +hutianyi.net +hutong9.net +huyandex.com +hwayue.org.tw +hwinfo.com +hxwq.org +hybrid-analysis.com +hyperrate.com +hypeshell.com +i-cable.com +i-sux.com +i1.hk +i2p2.de +i2runner.com +ialmostlaugh.com +ianslive.in +iask.bz +iask.ca +iata.org +ibiblio.org +iblist.com +iblogserv-f.net +ibros.org +icams.com +icij.org +icl-fi.org +iconfactory.com +iconpaper.org +icu-project.org +id.hao123.com +idemocracy.asia +identi.ca +idesktop.tv +idiomconnection.com +idlcoyote.com +idol-blog.com +idouga.com +idreamx.com +idv.tw +ieasynews.net +ied2k.net +if.ttt +ifan.cz.cc +ifanqiang.com +ifanr.com +ifcss.org +ifjc.org +ifreewares.com +ift.tt +ifttt.com +igfw.net +igmg.de +ignitedetroit.net +igossip.com +igotmail.com.tw +igvita.com +ihakka.net +iicns.com +ilgiornale.it +illusionfactory.com +ilove80.be +ilovelongtoes.com +im.tv +im88.tw +imagefap.com +imageflea.com +imagenparaelfacebook.com +imageoptim.com +imageshack.us +imagevenue.com +imagezilla.net +imb.org +imdb.com +img.dlsite.jp +img.ly +imgix.net +imgur.com +imkev.com +imlive.com +immigration.gov.tw +immoral.jp +impact.org.au +in-disguise.com +incloak.com +incredibox.fr +indeed.co.uk +independent.ie +index.hu +indiaglitz.com +indiemerch.com +infinitylist.com +info-graf.fr +informer.com +infradead.org +initiativesforchina.org +inkui.com +inmediahk.net +inmoment.com +innermongolia.org +insidefacebook.com +instaforex.com +instagram.com +institut-tibetain.org +intelius.com +intellectuapp.com +interestinglaugh.com +interfaceaddiction.com +internationalrivers.org +internet.org +internetdefenseleague.org +internetfreedom.org +internetpopculture.com +intertwitter.com +inxian.com +ipcf.org.tw +iphider.org +iphone4hongkong.com +iphonehacks.com +iphonenews.cc +iphonix.fr +ipicture.ru +ipjetable.net +ipobar.com +ippotv.com +ipredator.se +iptorrents.com +iptv.com.tw +ipvanish.com +iredmail.org +iridiumcao.info +ironbigfools.compython.net +ironfx.com +ironicsoftware.com +ironpython.net +irr.ru +is.gd +isaacmao.com +isgreat.org +iskcondesiretree.com +iskconsandton.co.za +islam.org.hk +islamhouse.com +islamicawakening.com +islamicity.com +islamtoday.net +ismaelan.com +ismprofessional.net +isohunt.com +israbox.com +istars.co.nz +istockphoto.com +isunaffairs.com +isuntv.com +itaboo.info +ithelp.ithome.com.tw +its.caltech.edu +itshidden.com +itweet.net +iu45.com +iuhrdf.org +iuksky.com +iverycd.com +ixiaa.com +ixquick-proxy.com +ixquick.com +ixxx.com +iyouport.com +izaobao.us +izles.net +izlesem.org +izlesene.com +j.mp +jackinthebox.com +jaidefinichon.com +jalan.net +jamaat.org +jams.kir.jp +japan-whores.com +japanesesportcars.com +japanfirst.asianfreeforum.com +jappydolls.net +javbus.com +javfor.me +javhub.net +javlibrary.com +javpee.com +javseeds.com +jayparkinsonmd.com +jazztel.com +jbtalks.cc +jbtalks.com +jbtalks.my +jdwsy.com +jeanyim.com +jetstar.com +jetztspielen.de +jeuxvideo.com +jgoodies.com +jiaoyou8.com +jiehua.cz +jieshibaobao.com +jigong1024.com +jihadology.net +jimoparty.com +jinbushe.org +jingpin.org +jitouch.com +jitsuroku.kir.jp +jizzhut.com +jjgirls.com +jkb.cc +jkforum.net +joachims.org +jobso.tv +joeedelman.com +journalchretien.net +journalofdemocracy.org +jp-sex.com +jp.hao123.com +jpl.nasa.gov +jpopforum.net +jshint.com +juegosdefacebook.com +juliepost.com +juliereyc.com +jumav.com +junauza.com +junefourth-20.net +justfreevpn.com +justpaste.it +justtristan.com +juyuange.org +juziyue.com +jwmusic.org +jwpcdn.com +jyxf.net +jyzj.waqn.com +k2.xrea.com +ka-wai.com +kagyuoffice.org +kagyuoffice.org.tw +kaiyuan.de +kakao.com +kanzhongguo.com +kanzhongguo.eu +kaotic.com +karayou.com +kat.cr +kat.ph +kcoolonline.com +kcsoftwares.com +kebrum.com +kechara.com +keepandshare.com +keepvid.com +keepyoutube.com +kendincos.net +kenengba.com +keontech.net +kepard.com +keurig.com +khabdha.org +khmusic.com.tw +kickyoutube.com +killwall.com +kineox.free.fr +kingdomsalvation.org +kinghost.com +kinghost.com.br +kinghost.net +kingstone.com.tw +kissyoutube.com +kiwi.kz +kkbobo.com +klip.me +klmty.net +kmart.com +kmt.org.tw +knightmaster.kir.jp +knowledgerush.com +kobo.com +kodingen.com +kokoro.kir.jp +kompozer.net +konami.jp +koolsolutions.com +koornk.com +korea-twitter.com +kproxy.com +kraftrecipes.com +kt.kcome.org +ktzhk.com +kui.name +kuliwang.com +kun.im +kurashsultan.com +kurtmunger.com +kusocity.com +kuvia.eu +kwcg.ca +kwongwah.com.my +kyohk.net +kzeng.info +la-forum.org +labanquepostale.fr +labiennale.org +ladbrokes.com +lagrandeepoque.com +lagranepoca.com +lalulalu.com +lamayeshe.com +lamenhu.com +lancome.com +laogai.org +laomiu.com +laonanren.com +laoyang.info +laptoplockdown.com +laqingdan.net +larsgeorge.com +lastcombat.com +lastfm.es +lastpass.com +lataayoutube.com +latelinenews.com +latibet.org +latimesblogs.latimes.com +lazarsearlymusic.com +lebo.tv +leecheukyan.org +leedeelive.com +legacy.com +legaltech.law.com +leggycash.com +leirentv.ca +leisurecafe.ca +lematin.ch +lemonde.fr +lenwhite.com +lerosua.org +lesoir.be +lesscss.org +letscorp.net +lezcuties.com +lian86.com +liansi.org +lianyue.net +liaowangxizang.net +lib.virginia.edu +liberal.org.hk +libertytimes.com.tw +library.usc.cuhk.edu.hk +librodetwitter.com +licdn.com +lich355.megabyet.net +lidecheng.com +life.fly4ever.me +lifemiles.com +like-facebook.com +limiao.net +line.me +line.naver.jp +linglingfa.com +lingvodics.com +linkedin.com +linkideo.com +links.org.au +linksalpha.com +linode.com +linux-engineer.net +linuxcommand.org +linuxconfig.org +linuxquestions.org +linuxreviews.org +linuxtoy.org +lipuman.com +list.ly +listentoyoutube.com +listorious.com +lists.debian.org +lists.w3.org +lists.webmproject.org +lithium.com +littlebigdetails.com +liu.lu +liudejun.com +liuhanyu.com +liujianshu.com +liuxiaotong.com +livedoor.jp +liveleak.com +livestation.com +livestream.com +livetv.sx +livevideo.com +livingonline.us +livingstream.com +lizhizhuangbi.com +lkcn.net +llnwd.net +load.to +local.com +localhost.com +localpresshk.com +locanto.com +lockdown.com +lockestek.com +locu.com +lofi.e-hentai.org +log.riku.me +logbot.net +logiqx.com +logme.in +logmein.com +logmike.com +loiclemeur.com +london.neighborhoodr.com +longhair.hk +longtermly.net +lookatgame.com +lookingglasstheatre.org +lookpic.com +looktoronto.com +lorealparisusa.com +lotsawahouse.org +lotuslight.org.tw +loudtwitter.com +lovequicksilver.com +loxber.com +lpsg.com +lrfz.com +lrip.org +lsd.org.hk +lsforum.net +lsm.org +lsmchinese.org +lsmkorean.org +lsmradio.com +lsxszzg.com +ltn.com.tw +luke54.org +luntan.zaobao.com +lupm.org +lushstories.com +luxebc.com +lvhai.org +lvv2.com +lyfhk.net +lyrics5.com +lyricsquote.com +m-sport.co.uk +m-team.cc +m.googlemail.com +m.oulove.org +m.plixi.com +m.slandr.net +m.tweete.net +m3.com +m88a.com +ma.hao123.com +mac.com +macauslot.com +maccosmetics.com +macgamestore.com +macrovpn.com +macys.com +mad-ar.ch +maddw.com +madmenunbuttoned.com +madthumbs.com +magazines.com +magazines.sina.com.tw +magiccloak.net +maiio.net +mail-archive.com +mailchimp.com +maiplus.com +makemymood.com +makeuseof.com +makzhou.warehouse333.com +malaysiakini.com +mango.pl +manhub.com +maniash.com +mansion.com +mansionpoker.com +marc.info +marco.org +marguerite.su +marines.mil +marinsm.com +markacadey.net +market.android.com +markmail.org +markmilian.com +mars99.com +martau.com +martincartoons.com +martsangkagyuofficial.org +maruta.be +marxist.com +marxist.net +marxists.org +mash.to +mashable.com +matainja.com +match.com +mathiew-badimon.com +matsushimakaede.com +maturejp.com +maxgif.com +maybelline.com +mayimayi.com +mcadforums.com +mcfog.com +mcreasite.com +md-t.org +mediafire.com +mediafreakcity.com +mediawiki.org +meetav.com +meeticaffinity.fr +meetup.com +mefeedia.com +megaporn.com +megaproxy.com +megarotic.com +megaupload.com +megavideo.com +megurineluka.com +meirixiaochao.com +melhoresdoyoutube.com +melon-peach.com +memehk.com +memrijttm.org +menover30.com +menupages.com +merit-times.com.tw +mesotw.com +metacafe.com +metarthunter.com +meteorshowersonline.com +metro.taipei +metrolife.ca +meyou.jp +mfxmedia.com +mgoon.com +mgstage.com +mh4u.org +mhradio.org +michaelanti.com +michaelmarketl.com +middle-way.net +mihk.hk +mihr.com +mihua.org +mike.cz.cc +milph.net +milsurps.com +mimivip.com +mimivv.com +mindbodygreen.com +mindrolling.org +minergate.com +minghui-a.org +minghui-b.org +minghui-school.org +minghui.org +minghui.tv +mingjinglishi.com +mingjingnews.com +mingjingtimes.com +mingpao.com +mingpaocanada.com +mingpaomonthly.com +mingpaonews.com +mingpaony.com +mingpaosf.com +mingpaotor.com +mingpaovan.com +mingshengbao.com +minhhue.net +minidaili.com +minilua.com +minimalmac.com +mininova.org +ministrybooks.org +minus.com +minzhuhua.net +minzhuzhanxian.com +minzhuzhongguo.org +miroguide.com +mirrorbooks.com +mitbbs.ca +mitbbs.com +mitsuran.kir.jp +mixedmedialabs.com +mixero.com +mixpod.com +mixx.com +mizzmona.com +mjlsh.usc.cuhk.edu.hk +mk5000.com +mlcool.com +mmaaxx.com +mmgp.ru +mmmca.com +mobatek.net +mobile.de +mobile01.com +mobileways.de +moby.to +mobypicture.com +mockable.io +modedamour.com +modfetish.com +modivideo.com +modmyi.com +mog.com +molihua.org +mondex.org +monitorchina.org +monlamit.org +moonbbs.com +mooo.com +mopo.de +morazzia.com +morningsun.org +motherearthliving.com +motor4ik.ru +mousebreaker.com +movabletype.com +movements.org +moviefap.com +moxa.com +moztw.org +mp3buscador.com +mp3ye.eu +mpettis.com +mpfinance.com +mpinews.com +mps.it +mrdoob.com +mrgreen.com +mrtweet.com +msguancha.com +msn.com.tw +mthruf.com +mtw.tl +muchosucko.com +mullvad.net +multiplayerforums.com +multiply.com +multiproxy.org +multiupload.com +mummysgold.com +mundofacebook.com +muouju.com +murmur.tw +musavat.com +muselinks.co.jp +musicade.net +muzi.com +muzi.net +muzu.tv +mvd.ru +mx981.com +mxplayer.j2inter.com +my-addr.com +my-private-network.co.uk +my-proxy.com +my.opera.com +myactimes.com +myaudiocast.com +myav.com.tw +mybloggertricks.com +myca168.com +mychinamyhome.com +mycould.com +mydish.com +myeasytv.com +myeclipseide.com +myequil.com +myforum.com.hk +myforum.com.uk +myfreepaysite.com +myfreshnet.com +myiphide.com +mylust.com +myopenid.com +myparagliding.com +mypopescu.com +myshare.url.com.tw +mysinablog.com +mysocialpoint.com +myspace.com +mywot.com +naacoalition.org +naitik.net +nakido.com +name.com +namsisi.com +nanyang.com +nanyang.com.my +nanyangpost.com +nanzao.com +naol.ca +national-lottery.co.uk +nationalrail.co.uk +naughtyamerica.com +navicat.com +navigeaters.com +navy.mil +nbc.com +nccwatch.org.tw +nch.com.tw +ncn.org +nde.de +ndr.de +ne.jp +ned.org +nekoslovakia.net +nelnet.com +nemesis2.qx.net +netbirds.com +netcolony.com +netflix.com +netme.cc +network54.com +networkedblogs.com +neverforget8964.org +new-3lunch.net +new-akiba.com +newcenturymc.com +newcenturynews.com +newchen.com +newgrounds.com +newipnow.com +newlandmagazine.com.au +newmobilelife.com +newnews.ca +news.atebits.com +news.bbc.co.uk +news.cnyes.com +news.dartlang.org +news.ghostery.com +news.msn.com.tw +news.now.com +news.omy.sg +news.sina.com.hk +news.sina.com.tw +news.sinchew.com.my +news.singtao.ca +news100.com.tw +newsancai.com +newscn.org +newsextube.org +newsforums.bbc.co.uk +newsminer.com +newspeak.cc +newstapa.org +newstarnet.com +newtaiwan.com.tw +newtalk.tw +newyorktimes.com +nexon.com +nexon.net +next11.co.jp +nextbigfuture.com +nextmedia.com +nexton-net.jp +nexttv.com.tw +nf.id.au +nga.mil +ngensis.com +ngrok.com +nhentai.net +nic.cz.cc +nichegalz.com +nicotwitter.com +nicovideo.jp +nighost.org +ninecommentaries.com +ninjacloak.com +nintendium.com +niusnews.com +njactb.org +njuice.com +nlfreevpn.com +nlog.cc +nn.ru +nobel.se +nobelprize.org +noblecasino.com +nobodycanstop.us +nokogiri.org +nokola.com +noobbox.com +norbulingka.org +nordstrom.com +nordstromimage.com +notes.alexdong.com +novelasia.com +nowfoods.com +nownews.com +nowtorrents.com +noypf.com +npa.go.jp +nps.gov +nrk.no +nsc.gov.tw +nsfwyoutube.com +ntd.tv +ntdtv.ca +ntdtv.co +ntdtv.com +ntdtv.jp +ntdtv.org +ntdtv.ru +nubiles.net +nuexpo.com +nurgo-software.com +nuuvem.com +nuvid.com +nuzcom.com +nuzzel.com +nvquan.org +nwtca.org +nxgx.com +ny.visiontimes.com +nyaa.se +nydus.ca +nylon-angel.com +nylonstockingsonline.com +nysingtao.com +nyt.com +nytco.com +nytimes.com +nytimg.com +nzchinese.net.nz +o2online.de +oakland.edu +oasic.net +observechina.net +obutu.com +ocaspro.com +oclp.hk +ocreampies.com +ocsp.digicert.com +october-review.org +offbeatchina.com +officeoftibet.com +ogaoga.org +ohayoutube.com +oi.com.br +oikos.com.tw +oiktv.com +oizoblog.com +ojogos.com.br +okayfreedom.com +okk.tw +okta.com +old-cat.net +old.honeynet.org +old.nabble.com +olivegarden.com +oloadcdn.net +olumpo.com +olx.com.ve +olx.ph +olympicwatch.org +omandaily.om +omgili.com +omnitalk.com +omnitalk.org +on.cc +one.xthost.info +onedrive.live.com +onion.city +online.hk +onlinecha.com +onmoon.com +onmoon.net +onthehunt.com +ontrac.com +ookla.com +ooo-sex.com +oopsforum.com +open-consoles-news.com +open.com.hk +opendemocracy.net +openid.net +openleaks.org +openload.co +openvpn.net +openwall.com +openwebster.com +opml.radiotime.com +opnir.com +optus.com.au +orchidbbs.com +organharvestinvestigation.net +orgfree.com +orient-doll.com +orientaldaily.com.my +orientaldaily.on.cc +orkut.com +orn.jp +orzdream.com +orzistic.org +osaka69.com +osfoora.com +osikko.jp +osmdroid.net +oss.sonatype.org +ostraining.com +ottawasun.com +otto.de +our-twitter.com +ourdearamy.com +oursogo.com +oursteps.com.au +overlapr.com +overplay.net +ow.ly +owind.com +owl.li +oxid.it +oyax.com +ozchinese.com +ozyoyo.com +p-cdn.com +p.twipple.jp +pachosting.com +pacificpoker.com +packages.debian.org +packetix.net +paddle.com +padhuskitchen.com +padmanet.com +page2rss.com +pagodabox.com +paid2youtube.com +paint.net +palacemoon.com +palevo.com +paljorpublications.com +palmbeachpost.com +paltalk.com +pandora.com +pandora.tv +panlon.com +panluan.net +panoramio.com +pao-pao.net +paper-replika.com +paper.li +paperb.us +parade.com +paradisepoker.com +parislemon.com +parkansky.com +partycasino.com +partypoker.com +passion.com +passiontimes.hk +pastebin.com +pastie.org +pbs.org +pbwiki.com +pbworks.com +pbxes.com +pbxes.org +pcdiscuss.com +pcdvd.com.tw +pchome.com.tw +pcij.org +pct.org.tw +pdetails.com +pdproxy.com +pds.nasa.gov +peace.ca +peacefire.org +peacehall.com +pearlher.org +peeasian.com +peerfly.com +peerpong.com +peggo.co +pekingduck.org +pen.io +penchinese.com +penchinese.net +penchinese.org +pengyulong.com +penisbot.com +penthouse.com +penthousebabesworld.com +peopo.org +percy.in +perfectgirls.net +perfectmoney.is +perfectvpn.net +perfspot.com +perlhowto.com +persecutionblog.com +pfizer.com +phapluan.org +phayul.com +philborges.com +philly.com +phncdn.com +phonesat.org +photo.utom.us +photobucket.com +photodharma.net +photofocus.com +photos.dailyme.com +phuquocservices.com +picidae.net +picsee.net +picturedip.com +pictures.playboy.com +picturesocial.com +pidown.com +pigav.com +pign.net +pimg.tw +pimpmyip.com +pin6.com +pinboard.in +ping.fm +pingtest.net +pinimg.com +pinknews.co.uk +pinoy-n.com +pinporn.com +pinterest.com +pioneer-worker.forums-free.com +piposay.com +piraattilahti.org +piring.com +pixelqi.com +pixnet.net +pk.com +placemix.com +planetsuzy.org +playboy.com +playpcesor.com +plays.com.tw +playvid.com +plm.org.hk +plunder.com +plurk.com +plurktop.mmdays.com +plus28.com +plusbb.com +pmates.com +po2b.com +pocketcalculatorshow.com +podcastblaster.com +podictionary.com +poker.betfair.com +pokerbooksdvd.com +pokerstars.com +pokerstars.net +pokervideo4u.com +politicalchina.org +politicalconsultation.org +polysolve.com +popapp.in +popularpages.net +popvote.hk +popyard.com +popyard.org +porn-star.com +porn.com +porn2.com +pornbase.org +pornerbros.com +pornhd.com +pornhome.com +pornhost.com +pornhub.com +pornhublive.com +pornmm.net +pornoxo.com +pornrapidshare.com +pornstarclub.com +porntube.com +porntubecdn.com +porntubenews.com +pornvisit.com +portablevpn.nl +pose.com +post.anyu.org +post.ly +post76.com +post852.com +postadult.com +posterous.com +potora.jp +power.com +powerapple.com +powercx.com +powerpointninja.com +prayforchina.net +premeforwindows7.com +premierinconline.com +presentationzen.com +prestige-av.com +prestigecasino.com +prisoneralert.com +pritunl.com +privacybox.de +privacyprotector.eu +private.com +privateinternetaccess.com +privatepaste.com +privatetunnel.com +privatevoyeur.com +privoxy.org +procopytips.com +proctoru.com +profitcentr.com +programastwitter.com +prosiben.de +protv.ro +provideocoalition.com +proxay.co.uk +proxfree.com +proxifier.com +proxite.net +proxite.us +proxlet.com +proxomitron.info +proxpn.biz +proxpn.com +proxpn.org +proxy.googlezip.net +proxy.org +proxy4free.com +proxypy.net +proxyroad.com +proxysite.com +proxyunblocker.org +prozz.net +psblog.name +psd-tutorials.de +psiphon.ca +psiphon.civisec.org +pso2.jp +pts.org.tw +ptt.cc +pubu.com.tw +puffinbrowser.com +puffstore.com +pullfolio.com +punyu.com +purchasefollowersontwitter.com +pure18.com +pureconcepts.net +pureinsight.org +purepdf.com +purevpn.com +puritan.com +purseblog.com +pussy.org +putlocker.com +putty.org +puttycm.free.fr +puuko.com +pwc.com +pwned.com +pypi.python.org +python.com +python.com.tw +qanote.com +qi-gong.me +qidian.ca +qienkuen.org +qiwen.lu +qkshare.com +qoos.com +qq.co.za +qstatus.com +qt.io +qtrac.eu +qtweeter.com +quadedge.com +quanzi.com.au +quitccp.net +quitccp.org +quora.com +quran.com +qusi8.net +qvodzy.org +qxbbs.org +raaga.com +rabota.ru +radicalparty.org +radiko.jp +radioaustralia.net.au +radiohilight.net +radiovaticana.org +radiovncr.com +rael.org +raidcall.com +raidcall.com.tw +raidtalk.com.tw +rangzen.com +rangzen.net +rangzen.org +ranyunfei.com +rapbull.net +rapidgator.net +rapidshare8.com +rapidsharedata.com +raspberrypi.org +rbs.com +rcinet.ca +rconversation.blogs.com +rd.com +rd.io +rdio.com +read100.com +readingtimes.com.tw +readmoo.com +realcourage.org +realhomesex.net +realitykings.com +realraptalk.com +recaptcha.net +recordhistory.org +redbox.com +redchinacn.org +redmondpie.com +redtube.com +referer.us +refinery29.com +reflectivecode.com +rekrytointipalvelut.info +relakks.com +relaxbbs.com +releaseinternational.org +religioustolerance.org +renminbao.com +rense.com +renyurenquan.org +repo.scala-sbt.org +repo.typesafe.com +repo1.maven.org +research.jmsc.hku.hk +ressim.net +retaildesignblog.net +retweeteffect.com +retweetist.com +retweetrank.com +reuters.com +reviewcentre.com +reviveourhearts.com +revleft.com +revver.com +rfa.org +rfachina.com +rfamobile.org +rferl.org +rfi.fr +rfi.my +rhcloud.com +rian.ru +ricardo.ch +rigpa.org +riitek.com +riku.me +rileyguide.com +ringcentral.com +ritouki.jp +rlwlw.com +rmjdw.com +rnw.nl +robtex.com +robustnessiskey.com +rocmp.org +rojo.com +roksa.pl +ronjoneswriter.com +roodo.com +rosechina.net +rotten.com +rottetstudio.com +routledge.com +rsf-chinese.org +rsf.org +rssmeme.com +rtbot.net +rthk.hk +rthk.hk.edgesuite.net +rthk.org.hk +rti.org.tw +rtl.de +ruanyifeng.com +rubyfortune.com +runningonjuice.com +rushbee.com +rutube.ru +rutwitter.com +ruyiseek.com +rxhj.net +s-cute.com +s-dragon.org +s.xiaod.in +s1heng.com +s3-eu-west-1.amazonaws.com +s3.amazonaws.com +s4miniarchive.com +s8forum.com +sa.hao123.com +sacom.hk +sadpanda.us +sadyoutube.com +safeforwork.net +safeway.com +sai-zen-sen.jp +saiq.me +sakuralive.com +salegamez.cc +salvation.org.hk +samair.ru +sambhota.org +sammyjs.org +samsoff.es +sandnoble.com +sankaizok.com +sanmin.com.tw +sapikachu.net +savemedia.com +savetibet.de +savetibet.fr +savetibet.nl +savetibet.org +savetibet.ru +savevid.com +saveyoutube.com +savings.com +say2.info +sbnation.com +sbobet.com +sbs.com.au +scala-sbt.org +scalatest.org +scasino.com +schema.org +scholarships.com +schooltunnel.net +sciencemag.org +scim.ag +scmp.com +scmpchinese.com +scorecardresearch.com +scribd.com +scriptspot.com +se-duc-tive.com +seamless.com +seapuff.com +searchtruth.com +seattlecoffeegear.com +secretchina.com +secretgarden.no +secretsline.biz +secure.freeyellow.com +secure.wikimedia.org +securitykiss.com +seesmic.com +seevpn.com +seezone.net +sejie.com +sendoid.com +sendspace.com +sendvid.com +sensortower.com +sephora.com +service.urchin.com +sesawe.net +sesawe.org +sethwklein.net +sevenload.com +sex-11.com +sex.com +sex3.com +sex8.cc +sexandsubmission.com +sexbot.com +sexdelivery.com +sexfind.com +sexhu.com +sexhuang.com +sexinsex.net +sextracker.com +sextube.com +sextvx.com +sexu.com +sexy.com +sf.net +sfileydy.com +sftuk.org +sh3lls.net +sha7.info +shadow.ma +shadowsocks.org +shahamat-english.com +shambhalasun.com +shangfang.org +shapeservices.com +shapeservices.net +share.ovi.com +share.skype.com +share.youthwant.com.tw +sharebee.com +sharecool.org +sharenxs.com +sharkdolphin.com +sharpdaily.com.hk +sharpdaily.hk +sharpdaily.tw +shat-tibet.com +shaunthesheep.com +sheikyermami.com +shellfire.de +shellmix.com +shenshou.org +shenyun.com +shenyunperformingarts.org +shenzhoufilm.com +sherdog.com +shifeike.blog125.fc2blog.net +shinychan.com +shipcamouflage.com +shitaotv.org +shixiao.org +shizhao.org +shkspr.mobi +shodanhq.com +shop2000.com.tw +shopping.com +shoprite.com +showbiz.omy.sg +showtime.jp +shutterstock.com +shwchurch3.com +si.wsj.net +sickfacebook.com +sidelinesnews.com +sidelinessportseatery.com +simboli-facebook.com +simbolostwitter.com +simplecd.org +simpleproductivityblog.com +sin1.g.adnxs.com +singaporepools.com.sg +singtao.com +singyoutube.com +sino-monthly.com +sinoants.com +sinocast.com +sinocism.com +sinomontreal.ca +sinonet.ca +sinopitt.info +sinoquebec.com +sipml5.org +sirina.tv +sis.xxx +sis001.com +sis001.us +site90.net +sitebro.tw +sitefile.org +sitekreator.com +siteks.uk.to +sitemaps.org +sitetag.us +skimtube.com +skybet.com +skyhighpremium.com +skype.com +skyvegas.com +slack-files.com +slack-msgs.com +slack.com +slacker.com +slashdot.org +slavasoft.com +slaytizle.com +slheng.com +slickvpn.com +slideshare.net +slinkset.com +slutload.com +slyuser.com +smarthosts.googlecode.com +smchbooks.com +smhric.org +snagajob.com +snapchat.com +snaptu.com +sndcdn.com +sneakme.net +snooper.co.uk +snowlionpub.com +snowpear.com +so-ga.net +so-news.com +sobees.com +soc.mil +socialwhale.com +sockslist.net +sod.co.jp +soft4fun.net +softether-download.com +softether.co.jp +softether.org +softwarebychuck.com +softwaredownload.gitbooks.io +sogclub.com +sogrady.me +soh.tw +sohcradio.com +sohfrance.org +sokamonline.com +solopeliculasgratis.com +solozorro.tk +somee.com +songjianjun.com +sonidodelaesperanza.org +sopcast.com +sopcast.org +sorting-algorithms.com +soubory.com +soumo.info +soundcloud.com +soundofhope.kr +soundofhope.org +soup.io +soupofmedia.com +sourceforge.net +southnews.com.tw +sowers.org.hk +space-scape.com +spankbang.com +spankwire.com +spapps.co +spb.com +speakerdeck.com +speckleapp.com +speedpluss.org +spencertipping.com +spike.com +spinejs.com +spoiledvirgins.com +spoilertv.com +sportingbet.com +sports.williamhill.com +sportsmansoutdoorsuperstore.com +spotflux.com +spotify.com +springboardplatform.com +sprinklr.com +sproutcore.com +spysurfing.com +squarespace.com +srcf.ucam.org +ssense.com +ssh91.com +ssl-images-amazon.com +sstatic.net +ssyoutube.com +stackfile.com +stackoverflow.com +standupfortibet.org +stanford.edu +starp2p.com +startpage.com +state168.com +static.apple.nextmedia.com +static.byhours.com +static.digg.com +staticflickr.com +status.twhirl.org +stc.com.sa +steampowered.com +steel-storm.com +stepmania.com +steves-digicams.com +sthoo.com +stickam.com +stickeraction.com +stileproject.com +stirileprotv.ro +stltoday.com +stonegames.net +stoneip.info +stopchildpornonfacebook.com +stoptibetcrisis.net +storagenewsletter.com +storify.com +storm.mg +stoweboyd.com +stranabg.com +streamie.org +streamingthe.net +streamtwitter.com +strongvpn.com +strongwindpress.com +student.tw +studentsforafreetibet.org +stuffimreading.com +stuffimreading.net +stumbleupon.com +stupidbeauty.com +stupidvideos.com +subacme.rerouted.org +subito.it +sublimetext.com +submitexpress.com +sufeng.org +sugarsync.com +summify.com +sumrando.com +sun1911.com +sunporno.com +suoluo.org +superdrug.com +superpages.com +supertweet.net +suprememastertv.com +surfeasy.com +surfeasy.com.au +surfert.nl +surrenderat20.net +susjed.com +suumo.jp +suyangg.com +svwind.com +swagbucks.com +sweux.com +swift-tools.net +sydneytoday.com +sylfoundation.org +symauth.com +symcb.com +symcd.com +syncback.com +sysadmin1138.net +sysresccd.org +sytes.net +szbbs.net +szetowah.org.hk +t-shirt.pl +t.co +t.huhaitai.com +t.kun.im +t.orzdream.com +t35.com +t66y.com +t88.ca +taa-usa.org +taaze.tw +tablesgenerator.com +tabtter.jp +tacem.org +taedp.org.tw +tafaward.com +tafm.org.tw +tagwalk.com +tagxedo.com +tahr.org.tw +taipei.gov.tw +taipeisociety.org +taiwan-sex.com +taiwanbible.com +taiwandaily.net +taiwanheart.ning.com +taiwankiss.com +taiwannation.50webs.com +taiwannation.com +taiwannation.com.tw +taiwannews.com.tw +taiwanonline.cc +taiwantp.net +taiwantt.org.tw +taiwanus.net +taiwanyes.com +taiwanyes.ning.com +taiyangbao.ca +talk853.com +talkboxapp.com +tamiaode.tk +tanc.org +tangben.com +taoism.net +taolun.info +taosl.net +tap11.com +tapbots.com +target.com +tarr.uspto.gov +taup.net +taup.org.tw +taweet.com +tbpic.info +tbsec.org +tbsn.org +tbsseattle.org +tccwonline.org +tcewf.org +tchrd.org +tcno.net +td.org +tdesktop.com +teamamericany.com +teamseesmic.com +teashark.com +tech2.in.com +techcrunch.com +techlifeweb.com +techparaiso.com +teck.in +teensinasia.com +tehran.ir +telecomspace.com +telegram.me +telegram.org +telegraph.co.uk +telelistas.net +tenacy.com +test.com +tetronics.com +tew.org +tfbnw.net +th.hao123.com +the-sun.on.cc +theampfactory.com +theappleblog.com +theatrum-belli.com +thebcomplex.com +theblaze.com +theblemish.com +thebobs.com +thebodyshop-usa.com +thecheeky.com +thechinabeat.org +thechinastory.org +thecoveteur.com +thedailywh.at +thedieline.com +thediplomat.com +thedw.us +theepochtimes.com +thefacebook.com +thefourtheye.in +thefrontier.hk +thegatesnotes.com +thegioitinhoc.vn +thegreatcourses.com +theguardian.co +theguardian.com +thehots.info +thehousenews.com +thehun.net +thehungrydudes.com +theinitium.com +theinternetwishlist.com +thelifeyoucansave.com +thelius.org +thenational.ae +thenewslens.com +thenorthface.com +thepetitionsite.com +thepiratebay.org +thepiratebay.se +theqii.info +thereallove.kr +therock.net.nz +thesartorialist.com +thesnippetapp.com +thespeeder.com +thestandnews.com +thetibetconnection.org +thetibetmuseum.org +thetibetpost.com +thetrotskymovie.com +thetruthaboutcars.com +thevivekspot.com +thewgo.org +thinkingtaiwan.com +thisav.com +thisiswhyyouarefat.com +thkphoto.com +thomasbernhard.org +threatchaos.com +throughnightsfire.com +thumbr.io +thumbzilla.com +thywords.com +tiananmenmother.org +tiananmenuniv.com +tiananmenuniv.net +tiandixing.org +tianhuayuan.com +tianlawoffice.com +tiantibooks.org +tianzhu.org +tiava.com +tibet-foundation.org +tibet-house-trust.co.uk +tibet-info.net +tibet-initiative.de +tibet-munich.de +tibet.a.se +tibet.at +tibet.ca +tibet.com +tibet.fr +tibet.net +tibet.nu +tibet.org +tibet.org.tw +tibetaid.org +tibetalk.com +tibetan-alliance.org +tibetanarts.org +tibetanculture.org +tibetanpaintings.com +tibetanphotoproject.com +tibetanwomen.org +tibetanyouthcongress.org +tibetcharity.dk +tibetcharity.in +tibetcity.com +tibetcollection.com +tibetcorps.org +tibetfocus.com +tibetfund.org +tibethouse.jp +tibethouse.org +tibethouse.us +tibetjustice.org +tibetmuseum.org +tibetnetwork.org +tibetoffice.ch +tibetoffice.com.au +tibetoffice.org +tibetonline.com +tibetonline.tv +tibetoralhistory.org +tibetrelieffund.co.uk +tibetsites.com +tibetsun.com +tibettimes.net +tibetwrites.org +tidyread.com +tiffanyarment.com +timdir.com +time.com +times.hinet.net +timsah.com +tintuc101.com +tiny.cc +tinychat.com +tinymce.com +tinypaste.com +tinypic.com +tinysubversions.com +tistory.com +tjholowaychuk.com +tkcs-collins.com +tkforum.tk +tl.gd +tldp.org +tmagazine.com +tmi.me +tnaflix.com +tnews.cc +tnp.org +togetter.com +tokfm.pl +tokyo-247.com +tokyo-hot.com +tokyo-porn-tube.com +tokyo-tube.com +tokyocn.com +tomayko.com +toms.com +tomsc.com +tono-oka.jp +tonyyan.net +toodoc.com +toom.kir.jp +toonel.net +top81.ws +topchinesenews.com +topic.youthwant.com.tw +topnews.in +topshare.us +topshareware.com +topstyle4.com +topsy.com +toptip.ca +tor.blingblingsquad.net +tor.updatestar.com +tora.to +torontosun.com +torproject.org +torproject.us +torrentcrazy.com +torrentkitty.com +torrentprivacy.com +torrentproject.se +torrenty.org +torrentz.eu +torvpn.com +tosh.comedycentral.com +toshiba.com +touch99.com +toukoucity.to +toutfr.com +toypark.in +toytractorshow.com +tparents.org +tpi.org.tw +tr.im +traffichaus.com +trans.wenweipo.com +transgressionism.org +transparency.org +travelinlocal.com +treemall.com.tw +trendhunter.com +trendsmap.com +trialofccp.org +trickfacebook.com +tricksfacebook.com +tripadvisor.in +tripod.com +trojmiasto.pl +trouw.nl +trovit.fr +trovit.it +trt.net.tr +trtc.com.tw +trucchifacebook.com +trulyergonomic.com +trustedbi.com +truth101.co.tv +truthcn.com +truveo.com +try.dartlang.org +tsctv.net +tsdr.uspto.gov +tsemtulku.com +tsquare.tv +tsu.co +tsu.org.tw +tsunagarumon.com +tsuru-bird.net +tt-rss.org +tt1069.com +tt48.tumblr.com +tttan.com +tu8964.com +tuanzt.com +tubaholic.com +tube.com +tube8.com +tube911.com +tubecao.com +tubegals.com +tubeislam.com +tubepornclassic.com +tubewolf.com +tui.orzdream.com +tuidang.net +tuidang.org +tuitwit.com +tumblr.awflasher.com +tumblr.com +tumblweed.org +tumutanzi.com +tunein.com +tunnelbear.com +tuo8.hk +tuo8.org +turansam.org +turbobit.net +turbohide.com +turbotwitter.com +turningtorso.com +turntable.fm +tushycash.com +tusjuegosparafacebook.com +tuxtraining.com +tuzaijidi.com +tv-intros.com +tv.com +tv.com.pk +tv.nu +tv.on.cc +tvanouvelles.ca +tvants.com +tvb.com +tvboxnow.com +tvider.com +tvunetworks.com +tw-npo.org +tw.gigacircle.com +tw.hao123.com +tw.jiepang.com +tw.streetvoice.com +tw.voa.mobi +tw01.org +twa.sh +twaitter.com +twapperkeeper.com +twaud.io +twavtv.com +twbbs.net.tw +twbbs.org +twbbs.tw +twblogger.com +tweepguide.com +tweeplike.me +tweepmag.com +tweepml.org +tweetbackup.com +tweetboard.com +tweetboner.biz +tweetdeck.com +tweete.net +tweetedtimes.com +tweetmeme.com +tweetmylast.fm +tweetphoto.com +tweetrans.com +tweetree.com +tweets.seraph.me +tweettunnel.com +tweetvalue.com +tweetwally.com +tweetymail.com +twenga.fr +twerkingbutt.com +twftp.org +twibase.com +twibble.de +twibbon.com +twibs.com +twicsy.com +twiends.com +twifan.com +twiffo.com +twiggit.org +twilightsex.com +twillo.com +twilog.org +twimbow.com +twimg.com +twimg.edgesuite.net +twindexx.com +twip.me +twipple.jp +twishort.com +twistar.cc +twister.net.co +twisterio.com +twisternow.com +twistory.net +twit2d.com +twitbrowser.net +twitcause.com +twitch.tv +twitgether.com +twitgoo.com +twitiq.com +twitlonger.com +twitmania.com +twitoaster.com +twitonmsn.com +twitpic.com +twitreferral.com +twitstat.com +twittanic.com +twittbot.net +twitter-icon.com +twitter.com +twitter.com.au +twitter.jp +twitter4j.org +twittercentral.com.br +twittercounter.com +twitterfall.com +twitterfeed.com +twittergadget.com +twitterkr.com +twittermail.com +twittertim.es +twitterwall.me +twitthat.com +twitturk.com +twitturly.com +twitvid.com +twitzap.com +twiyia.com +twotwitter.com +twreg.info +twstar.net +twt.fm +twt.tl +twtkr.com +twtr2src.ogaoga.org +twtrland.com +twttr.com +twurl.nl +twyac.org +twylah.com +tycool.com +tynsoe.org +typekit.net +typepad.com +typesafe.com +tzangms.com +ub0.cc +uberproxy.net +ubervu.com +ubnt.com +ubuntu.com +ucdc1998.org +ucoz.com +uderzo.it +udn.com +udn.com.tw +uforadio.com.tw +ufreevpn.com +ugo.com +uhaul.com +uhrp.org +uighur.nl +uighurbiz.net +uinyan.tumblr.com +ukchinese.com +ukliferadio.co.uk +ulike.net +ulozto.cz +ulozto.net +ultrareach.net +ultrasurf.us +ultrasurfing.com +ultravpn.fr +ultraxs.com +umich.edu +unblock-us.com +unblock.cn.com +unblocksit.es +unblockthatsite.net +unblockyoutube.co.uk +unblockyoutube.com +uncyclomedia.org +uncyclopedia.info +uncyclopedia.tw +underwoodammo.com +unholyknight.com +uni-due.de +uni.cc +unicode.org +unification.net +unification.org.tw +uninstallapp.org +uniteddaily.com.my +unix100.com +unknownspace.org +unodedos.com +unpo.org +uocn.org +upholdjustice.org +upload.wikimedia.org +upload4u.info +uploaded.net +uploaded.to +uploadstation.com +uproxy.org +upwill.org +ur7s.com +urbanoutfitters.com +urlborg.com +urlparser.com +us.to +usacn.com +usaip.eu +usaupload.net +users.skynet.be +usfk.mil +usinfo.state.gov +usma.edu +usmc.mil +usmgtcg.ning.com +ussearch.com +ustream.tv +ustwrap.info +usus.cc +uushare.com +uwants.com +uwants.net +uyghur-j.org +uyghuramerican.org +uyghurcanadiansociety.org +uyghurcongress.org +uyghurensemble.co.uk +uyghurpen.org +uyghurpress.com +uygur.fc2web.com +uygur.org +uymaarip.com +uyttt.com +v-state.org +v2ex.com +v70.us +v7976888.info +vaayoo.com +value-domain.com +van001.com +van698.com +vanilla-jp.com +vanpeople.com +vansky.com +vapurl.com +varnish-cache.org +vatn.org +vcf-online.org +vcfbuilder.org +vds.rightster.com +vectorstock.com +veempiire.com +vegasred.com +vegorpedersen.com +velkaepocha.sk +venbbs.com +venchina.com +ventureswell.com +veoh.com +verizon.net +verticalresponse.com +verybs.com +vesti.ru +vevo.com +vft.com.tw +viamichelin.com +viber.com +victorinox.com +video.aol.ca +video.aol.co.uk +video.aol.com +video.ap.org +video.fdbox.com +video.foxbusiness.com +video.tiscali.it +video2brain.com +videobam.com +videodetective.com +videomega.tv +videomo.com +videopediaworld.com +videosdeyoutube.com +vidoemo.com +vidoevo.com +viemo.com +views.fm +vikeng.info +viki.com +villagevoice.com +vimeo.com +vimeocdn.com +vimgolf.com +vimperator.org +vincnd.com +vine.co +vineapp.com +vinniev.com +visibletweets.com +vivatube.com +vjmedia.com.hk +vllcs.org +vlog.xuite.net +vmixcore.com +vn.hao123.com +voa.gov +voacantonese.com +voachinese.com +voachineseblog.com +voafanti.com +voagd.com +voanews.com +voatibetan.com +vocn.tv +voicetube.tw +vongutenberg.com +vot.org +vouchercodes.co.uk +vovo2000.com +vovokan.com +vox-cdn.com +voy.com +vpnbook.com +vpncup.com +vpnfire.com +vpngate.jp +vpngate.net +vpnpop.com +vpnpronet.com +vpnreviewz.com +vporn.com +vtunnel.com +vuku.ru +vworldc.com +w.idaiwan.com +w.org +w3schools.com +waffle1999.com +wahas.com +waigaobu.com +waikeung.org +waiwaier.com +wallornot.org +wallpapercasa.com +wan-press.org +wanderinghorse.net +wangafu.net +wangjinbo.org +wanglixiong.com +wango.org +wangruoshui.net +wangruowang.org +want-daily.com +wantchinatimes.com +wantyoutube.com +wapedia.mobi +waselpro.com +washeng.net +watchinese.com +watchmygf.net +wattpad.com +wav.tv +wdf5.com +wearehairy.com +wearn.com +web2project.net +webbang.net +webcams.com +webevader.org +webfee.tk +webjb.org +weblagu.com +webmproject.org +webnode.com +webrtc.org +webrush.net +webs-tv.net +webs.com +webshots.com +websitepulse.com +websnapr.com +webwarper.net +webworkerdaily.com +webzen.com +weeewooo.net +weekmag.info +wefacebook.com +wefightcensorship.org +wefong.com +wehaslinks.com +weiboleak.com +weigegebyc.dreamhosters.com +weijingsheng.org +weiming.info +weiquanwang.org +weisuo.ws +wellplacedpixels.com +welovecock.com +wemigrate.org +wen.ru +wengewang.com +wengewang.org +wenhui.ch +wenku.com +wenxuecity.com +wenyunchao.com +wepn.info +westca.com +westernshugdensociety.org +westernwolves.com +westhost.com +westkit.net +westpoint.edu +westword.com +wet123.com +wetplace.com +wetpussygames.com +wetransfer.com +wexiaobo.org +wezhiyong.org +wezone.net +wforum.com +whatblocked.com +whatbrowser.org +whendidyoujointwitter.com +whereiswerner.com +wheretowatch.com +whippedass.com +whitebear.freebearblog.org +who.is +whoownsfacebook.com +whotalking.com +whydidyoubuymethat.com +whylover.com +whyx.org +wifemovies.net +wiki.cnitter.com +wiki.gamerp.jp +wiki.jqueryui.com +wiki.moegirl.org +wiki.oauth.net +wiki.phonegap.com +wikibooks.org +wikidata.org +wikidot.com +wikileaks.ch +wikileaks.de +wikileaks.eu +wikileaks.lu +wikileaks.org +wikileaks.pl +wikilivres.info +wikimapia.org +wikimedia.org +wikimedia.org.mo +wikimediafoundation.org +wikinews.org +wikipedia.com +wikipedia.org +wikiquote.org +wikisource.org +wikiversity.org +wikivoyage.org +wikiwiki.jp +wiksa.com +wiktionary.org +wildammo.com +wiley.com +williamhillpoker.com +willw.net +windowsmedia.com +windowsphoneme.com +wingamestore.com +winnipegsun.com +winwhispers.info +wiredbytes.com +wiredpen.com +wireshark.org +wisdompubs.org +wisevid.com +wistia.com +wistia.net +withgoogle.com +witnessleeteaching.com +witopia.net +wiwo.de +wixoo.com +wlx.sowiki.net +wmmail.ru +wn.com +wnacg.com +wo.tc +woeser.com +woesermiddle-way.net +wolfax.com +womanwithin.com +womensrightsofchina.org +wonderlandads.com +woopie.jp +woopie.tv +wordboner.com +wordpress.com +wordsandturds.com +workatruna.com +workerdemo.org.hk +workersthebig.net +worldcat.org +worldjournal.com +worldmarket.com +worldnews01.com +worstthingieverate.com +wow-life.net +wowlegacy.ml +woxinghuiguo.com +wozy.in +wp.com +wpmudev.org +wpoforum.com +wqlhw.com +wqyd.org +wrangl.com +wrchina.org +wretch.cc +writelonger.com +writer.zoho.com +wsgzao.github.io +wsj.com +wsj.net +wsjemail.com +wtfpeople.com +wuala.com +wuerkaixi.com +wufi.org.tw +wufoo.com +wuguoguang.com +wujie.net +wujieliulan.com +wukangrui.net +wwitv.com +www.agoogleaday.com +www.alliance.org.hk +www.blogger.com +www.chromeexperiments.com +www.chromercise.com +www.dartlang.org +www.data-vocabulary.org +www.emailintervention.com +www.feedburner.com +www.googlechinawebmaster.com +www.googleinsidesearch.com +www.googlemashups.com +www.googlepreview.com +www.googletagservices.com +www.googlezeitgeist.com +www.gosetsuden.jp +www.minghui.org +www.smhric.org +www.teachparentstech.org +www.textcube.com +www.thegobridgeoglepuzzle.com +www.thegooglepuzzle.com +www.waveprotocol.org +www.webm-ccl.org +www.webmproject.org +www.youtube-nocookie.com +www2.ohchr.org +www2.rocketbbs.com +wzyboy.im +x-art.com +x-berry.com +x-wall.org +x.xcity.jp +x1949x.com +x365x.com +xa.yimg.com +xanga.com +xbabe.com +xbookcn.com +xcafe.in +xcritic.com +xfm.pp.ru +xgmyd.com +xhamster.com +xhcdn.com +xianqiao.net +xiaochuncnjp.com +xiaohexie.com +xiaolan.me +xiaoma.org +xiezhua.com +xiezi.us +xihua.es +xing.com +xinhuanet.org +xinmiao.com.hk +xinqimeng.over-blog.com +xinsheng.net +xinshijue.com +xinyubbs.net +xiongpian.com +xite.ws +xizang-zhiye.org +xjp.cc +xlfmwz.info +xmbs.jp +xml-training-guide.com +xmovies.com +xmusic.fm +xnxx.com +xpdo.net +xpud.org +xrentdvd.com +xskywalker.com +xtube.com +xuchao.net +xuchao.org +xuzhiyong.net +xuzhuoer.com +xvedios.com +xvideos.com +xvideos.es +xxbbx.com +xxeronetxx.info +xxx.com +xxx.com.au +xxxx.com.au +xxxymovies.com +xys.dxiong.com +xys.org +xysblogs.org +xyy69.com +xyy69.info +yahoo.com +yahoo.com.hk +yahoo.com.tw +yakbutterblues.com +yam.com +yangjianli.com +yasni.co.uk +yasukuni.or.jp +ydy.com +yeelou.com +yeeyan.org +yeeyi.com +yegle.net +yepi.com +yes123.com.tw +yesasia.com +yesasia.com.hk +yfrog.com +yhcw.net +yi.org +yibada.com +yibaochina.com +yidio.com +yilubbs.com +yipub.com +yobt.com +yobt.tv +yogichen.org +yong.hu +yorkbbs.ca +youjizz.com +youjizzlive.com +youmaker.com +youngfatties.com +youngliving.com +youpai.org +youporn.com +youporngay.com +your-freedom.net +yourepeat.com +yourlisten.com +yourlust.com +yousendit.com +youthbao.com +youthnetradio.org +youtu.be +youtube-mp3.com +youtube-nocookie.com +youtube.com +youtube.com.br +youtube.com.my +youtubecn.com +youversion.com +youxu.info +ysku.in +yslang.com +ytht.net +ytimg.com +yuanming.net +yuming.flnet.org +yunchao.net +yuvutu.com +yvesgeleyn.com +yx51.net +yyets.com +yyii.org +yymaya.com +yzzk.com +zacebook.com +zagat.com +zain.com +zalando.es +zannel.com +zaobao.com +zaobao.com.sg +zaozon.com +zap.co.il +zarias.com +zattoo.com +zaubacorp.com +zaurus.org.uk +zdassets.com +zdnet.com.tw +zdnet.fr +zekamashi.net +zend.com +zend2.com +zengjinyan.org +zensur.freerk.com +zeutch.com +zfreet.com +zgzcjj.net +zh-tw.justin.tv +zh.netlog.com +zh.pokerstrategy.com +zh.uncyclopedia.wikia.com +zhanbin.net +zhangboli.net +zhangtianliang.com +zhao.jinhai.de +zhenghui.org +zhengjian.org +zhengwunet.org +zhenlibu.info +zhenxiang.biz +zhibo5.com +zhinengluyou.com +zhongguo.ca +zhongguorenquan.org +zhongguotese.net +zhongmeng.org +zhreader.com +zhufeng.me +zhuichaguoji.org +ziddu.com +zideo.nl +zillionk.com +zinio.com +ziplib.com +ziporn.com +zkaip.com +zlib.net +zomobo.net +zonaeuropa.com +zootool.com +zoozle.net +zozotown.com +zshare.net +zsrhao.com +zuo.la +zuobiao.me +zuola.com +zvereff.com +zyzc9.com +zzcartoon.com \ No newline at end of file diff --git a/config.go b/config.go new file mode 100755 index 0000000..289b1b8 --- /dev/null +++ b/config.go @@ -0,0 +1,115 @@ +package main + +import ( + "flag" + "fmt" + "log" + "os" + "strings" + + "github.com/spf13/pflag" + "github.com/spf13/viper" +) + +var ( + cfg = viper.New() +) + +func initConfig() (err error) { + //define command line args + + pflag.CommandLine.AddGoFlagSet(flag.CommandLine) + configFile := pflag.StringP("config", "c", "", "config file path") + + pflag.BoolP("parent-tls", "X", false, "parent proxy is tls") + pflag.BoolP("local-tls", "x", false, "local proxy is tls") + version := pflag.BoolP("version", "v", false, "show version") + pflag.BoolP("tcp", "C", false, "proxy on tcp") + pflag.Bool("always", false, "always use parent proxy") + + pflag.Int("check-proxy-interval", 3, "check if proxy is okay every interval seconds") + pflag.IntP("port", "p", 33080, "local port to listen") + pflag.IntP("check-timeout", "t", 3000, "chekc domain blocked , http request timeout milliseconds when connect to host") + pflag.IntP("tcp-timeout", "T", 2000, "tcp timeout milliseconds when connect to real server or parent proxy") + pflag.IntP("check-interval", "I", 10, "check domain if blocked every interval seconds") + pflag.IntP("pool-size", "s", 50, "conn pool size , which connect to parent proxy, zero: means turn off pool") + + pflag.StringP("parent", "P", "", "parent proxy address") + pflag.StringP("ip", "i", "0.0.0.0", "local ip to bind") + pflag.StringP("cert", "f", "proxy.crt", "cert file for tls") + pflag.StringP("key", "k", "proxy.key", "key file for tls") + pflag.StringP("blocked", "b", "blocked", "blocked domain file , one domain each line") + pflag.StringP("direct", "d", "direct", "direct domain file , one domain each line") + pflag.StringP("auth-file", "F", "", "http basic auth file,\"username:password\" each line in file") + pflag.StringSliceP("auth", "a", []string{}, "http basic auth username and password,such as: \"user1:pass1,user2:pass2\"") + + pflag.Parse() + + cfg.BindPFlag("parent-tls", pflag.Lookup("parent-tls")) + cfg.BindPFlag("local-tls", pflag.Lookup("local-tls")) + cfg.BindPFlag("tcp", pflag.Lookup("tcp")) + cfg.BindPFlag("always", pflag.Lookup("always")) + cfg.BindPFlag("check-proxy-interval", pflag.Lookup("check-proxy-interval")) + cfg.BindPFlag("port", pflag.Lookup("port")) + cfg.BindPFlag("check-timeout", pflag.Lookup("check-timeout")) + cfg.BindPFlag("tcp-timeout", pflag.Lookup("tcp-timeout")) + cfg.BindPFlag("check-interval", pflag.Lookup("check-interval")) + cfg.BindPFlag("pool-size", pflag.Lookup("pool-size")) + cfg.BindPFlag("parent", pflag.Lookup("parent")) + cfg.BindPFlag("ip", pflag.Lookup("ip")) + cfg.BindPFlag("cert", pflag.Lookup("cert")) + cfg.BindPFlag("key", pflag.Lookup("key")) + cfg.BindPFlag("blocked", pflag.Lookup("blocked")) + cfg.BindPFlag("direct", pflag.Lookup("direct")) + cfg.BindPFlag("auth", pflag.Lookup("auth")) + cfg.BindPFlag("auth-file", pflag.Lookup("auth-file")) + + //version + if *version { + fmt.Printf("proxy v%s\n", APP_VERSION) + os.Exit(0) + } + + //keygen + if len(pflag.Args()) > 0 { + if pflag.Arg(0) == "keygen" { + keygen() + os.Exit(0) + } + } + + poster() + + if *configFile != "" { + cfg.SetConfigFile(*configFile) + } else { + cfg.SetConfigName("proxy") + cfg.AddConfigPath("/etc/proxy/") + cfg.AddConfigPath("$HOME/.proxy") + cfg.AddConfigPath(".proxy") + cfg.AddConfigPath(".") + } + + err = cfg.ReadInConfig() + file := cfg.ConfigFileUsed() + if err != nil && !strings.Contains(err.Error(), "Not") { + log.Fatalf("parse config fail, ERR:%s", err) + } else if file != "" { + log.Printf("use config file : %s", file) + } + err = nil + return +} + +func poster() { + fmt.Printf(` + ######## ######## ####### ## ## ## ## + ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## #### + ######## ######## ## ## ### ## + ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## + ## ## ## ####### ## ## ## + + v%s`+" by snail , blog : http://www.host900.com/\n\n", APP_VERSION) +} diff --git a/direct b/direct new file mode 100644 index 0000000..2f1e8da --- /dev/null +++ b/direct @@ -0,0 +1,456 @@ +07073.com +10010.com +100ye.com +114la.com +115.com +120ask.com +126.com +126.net +1616.net +163.com +17173.com +1778.com +178.com +17u.com +19lou.com +1o26.com +1ting.com +21cn.com +2345.com +265.com +265g.com +28.com +28tui.com +2hua.com +2mdn.net +315che.com +3366.com +360buy.com +360buyimg.com +360doc.com +36kr.com +39.net +3dmgame.com +4399.com +4738.com +500wan.com +51.com +51.la +5173.com +51auto.com +51buy.com +51cto.com +51fanli.com +51job.com +52kmh.com +52pk.net +52tlbb.com +53kf.com +55bbs.com +55tuan.com +56.com +58.com +591hx.com +5d6d.net +61.com +70e.com +777wyx.com +778669.com +7c.com +7k7k.com +88db.com +91.com +99bill.com +a135.net +abang.com +abchina.com +ad1111.com +admin5.com +adnxs.com +adobe.com +adroll.com +ads8.com +adsame.com +adsonar.com +adtechus.com +aibang.com +aifang.com +aili.com +aipai.com +aizhan.com +ali213.net +alibaba.com +alicdn.com +aliexpress.com +alimama.com +alipay.com +alipayobjects.com +alisoft.com +alivv.com +aliyun.com +allyes.com +amazon.com +anjuke.com +anzhi.com +aol.com +apple.com +arpg2.com +atdmt.com +b2b168.com +babytree.com +baidu.com +baihe.com +baixing.com +bankcomm.com +baomihua.com +bdimg.com +bdstatic.com +bendibao.com +betrad.com +bilibili.tv +bing.com +bitauto.com +blog.163.com +blogchina.com +blueidea.com +bluekai.com +booksky.org +caixin.com +ccb.com +ccidnet.com +cctv*.com +china.com +chinabyte.com +chinahr.com +chinanews.com +chinaw3.com +chinaz.com +chuangelm.com +ci123.com +cmbchina.com +cnbeta.com +cnblogs.com +cncn.com +cnhubei.com +cnki.net +cnmo.com +cnxad.com +cnzz.com +cocoren.com +compete.com +comsenz.com +coo8.com +cqnews.net +crsky.com +csdn.net +ct10000.com +ctrip.com +dangdang.com +daqi.com +dayoo.com +dbank.com +ddmap.com +dedecms.com +dh818.com +diandian.com +dianping.com +discuz.net +doc88.com +docin.com +donews.com +dospy.com +douban.com +douban.fm +doubleclick.com +doubleclick.net +duba.net +duote.com +duowan.com +dzwww.com +eastday.com +eastmoney.com +ebay.com +elong.com +ename.net +etao.com +exam8.com +eye.rs +fantong.com +fastcdn.com +fblife.com +fengniao.com +fenzhi.com +flickr.com +fobshanghai.com +ftuan.com +funshion.com +fx120.net +game3737.com +gamersky.com +gamestlbb.com +gamesville.com +ganji.com +gfan.com +gongchang.com +google-analytics.com +gougou.com +gtimg.com +hao123.com +haodf.com +harrenmedianetwork.com +hc360.com +hefei.cc +hf365.com +hiapk.com +hichina.com +homeinns.com +hotsales.net +house365.com +huaban.com +huanqiu.com +hudong.com +hupu.com +iask.com +iciba.com +icson.com +ifeng.com +iloveyouxi.com +im286.com +imanhua.com +img.cctvpic.com +imrworldwide.com +invitemedia.com +ip138.com +ipinyou.com +iqilu.com +iqiyi.com +irs01.com +irs01.net +it168.com +iteye.com +iyaya.com +jb51.net +jiathis.com +jiayuan.com +jing.fm +jinti.com +jqw.com +jumei.com +jxedt.com +jysq.net +kaixin001.com +kandian.com +kdnet.net +kimiss.com +ku6.com +ku6cdn.com +ku6img.com +kuaidi100.com +kugou.com +l99.com +lady8844.com +lafaso.com +lashou.com +legolas-media.com +lehecai.com +leho.com +letv.com +liebiao.com +lietou.com +linezing.com +linkedin.com +live.com +longhoo.net +lusongsong.com +lxdns.com +lycos.com +lygo.com +m18.com +m1905.com +made-in-china.com +makepolo.com +mangocity.com +manzuo.com +mapbar.com +mathtag.com +mediaplex.com +mediav.com +meilele.com +meilishuo.com +meishichina.com +meituan.com +meizu.com +miaozhen.com +microsoft.com +miercn.com +mlt01.com +mmcdn.cn +mmstat.com +mnwan.com +mogujie.com +mookie1.com +moonbasa.com +mop.com +mosso.com +mplife.com +msn.com +mtime.com +mumayi.com +mydrivers.com +net114.com +netease.com +newsmth.net +nipic.com +nowec.com +nuomi.com +oadz.com +oeeee.com +onetad.com +onlinedown.net +onlylady.com +oschina.net +otwan.com +paipai.com +paypal.com +pchome.net +pcpop.com +pengyou.com +php100.com +phpwind.net +pingan.com +pixlr.com +pp.cc +ppstream.com +pptv.com +ptlogin2.qq.com +pubmatic.com +q150.com +qianlong.com +qidian.com +qingdaonews.com +qire123.com +qiushibaike.com +qiyou.com +qjy168.com +qq.com +qq937.com +qstatic.com +quantserve.com +qunar.com +rakuten.co.jp +readnovel.com +renren.com +rtbidder.net +scanscout.com +scorecardresearch.com +sdo.com +seowhy.com +serving-sys.com +sf-express.com +shangdu.com +si.kz +sina.com +sinahk.net +sinajs.com +smzdm.com +snyu.com +sodu.org +sogou.com +sohu.com +soku.com +sootoo.com +soso.com +soufun.com +sourceforge.net +staticsdo.com +stockstar.com +sttlbb.com +suning.com +szhome.com +sznews.com +tangdou.com +tanx.com +tao123.com +taobao.com +taobaocdn.com +tbcdn.cn +tdimg.com +tenpay.com +tgbus.com +theplanet.com +thethirdmedia.com +tiancity.com +tianji.com +tiao8.info +tiexue.net +titan24.com +tmall.com +tom.com +toocle.com +tremormedia.com +tuan800.com +tudou.com +tudouui.com +tui18.com +tuniu.com +twcczhu.com +u17.com +ucjoy.com +ulink.cc +uniontoufang.com +up2c.com +uuu9.com +uuzu.com +vancl.com +verycd.com +vipshop.com +vizu.com +vjia.com +weibo.com +weiphone.com +west263.com +whlongda.com +wrating.com +wumii.com +xiami.com +xiaomi.com +xiazaiba.com +xici.net +xinhuanet.com +xinnet.com +xitek.com +xiu.com +xunlei.com +xyxy.net +yahoo.co.jp +yahoo.com +yaolan.com +yesky.com +yieldmanager.com +yihaodian.com +yingjiesheng.com +yinyuetai.com +yiqifa.com +ykimg.com +ynet.com +yoka.com +yolk7.com +youboy.com +youdao.com +yougou.com +youku.com +youshang.com +yupoo.com +yxlady.com +yyets.com +zhaodao123.com +zhaopin.com +zhenai.com +zhibo8.cc +zhihu.com +zhubajie.com +zongheng.com +zoosnet.net +zqgame.com +ztgame.com +zx915.com \ No newline at end of file diff --git a/functions.go b/functions.go new file mode 100755 index 0000000..c1f2afd --- /dev/null +++ b/functions.go @@ -0,0 +1,346 @@ +package main + +import ( + "crypto/tls" + "crypto/x509" + "errors" + "fmt" + "io" + "log" + "net" + "net/http" + "os" + "runtime/debug" + "strconv" + "strings" + "time" +) + +func IoBind(dst io.ReadWriter, src io.ReadWriter, fn func(err error), cfn func(count int, isPositive bool), bytesPreSec float64) { + go func() { + defer func() { + if e := recover(); e != nil { + log.Printf("IoBind crashed , err : %s , \ntrace:%s", e, string(debug.Stack())) + } + }() + errchn := make(chan error, 2) + go func() { + defer func() { + if e := recover(); e != nil { + log.Printf("IoBind crashed , err : %s , \ntrace:%s", e, string(debug.Stack())) + } + }() + var err error + if bytesPreSec > 0 { + newreader := NewReader(src) + newreader.SetRateLimit(bytesPreSec) + _, err = ioCopy(dst, newreader, func(c int) { + cfn(c, false) + }) + + } else { + _, err = ioCopy(dst, src, func(c int) { + cfn(c, false) + }) + } + errchn <- err + }() + go func() { + defer func() { + if e := recover(); e != nil { + log.Printf("IoBind crashed , err : %s , \ntrace:%s", e, string(debug.Stack())) + } + }() + var err error + if bytesPreSec > 0 { + newReader := NewReader(dst) + newReader.SetRateLimit(bytesPreSec) + _, err = ioCopy(src, newReader, func(c int) { + cfn(c, true) + }) + } else { + _, err = ioCopy(src, dst, func(c int) { + cfn(c, true) + }) + } + errchn <- err + }() + fn(<-errchn) + }() +} +func ioCopy(dst io.Writer, src io.Reader, fn ...func(count int)) (written int64, err error) { + buf := make([]byte, 32*1024) + for { + nr, er := src.Read(buf) + if nr > 0 { + nw, ew := dst.Write(buf[0:nr]) + if nw > 0 { + written += int64(nw) + if len(fn) == 1 { + fn[0](nw) + } + } + if ew != nil { + err = ew + break + } + if nr != nw { + err = io.ErrShortWrite + break + } + } + if er != nil { + err = er + break + } + } + return written, err +} +func TlsConnectHost(host string, timeout int, certBytes, keyBytes []byte) (conn tls.Conn, err error) { + h := strings.Split(host, ":") + port, _ := strconv.Atoi(h[1]) + return TlsConnect(h[0], port, timeout, certBytes, keyBytes) +} + +func TlsConnect(host string, port, timeout int, certBytes, keyBytes []byte) (conn tls.Conn, err error) { + conf, err := getRequestTlsConfig(certBytes, keyBytes) + if err != nil { + return + } + _conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", host, port), time.Duration(timeout)*time.Millisecond) + if err != nil { + return + } + return *tls.Client(_conn, conf), err +} +func getRequestTlsConfig(certBytes, keyBytes []byte) (conf *tls.Config, err error) { + var cert tls.Certificate + cert, err = tls.X509KeyPair(certBytes, keyBytes) + if err != nil { + return + } + serverCertPool := x509.NewCertPool() + ok := serverCertPool.AppendCertsFromPEM(certBytes) + if !ok { + err = errors.New("failed to parse root certificate") + } + conf = &tls.Config{ + RootCAs: serverCertPool, + Certificates: []tls.Certificate{cert}, + ServerName: "proxy", + InsecureSkipVerify: false, + } + return +} + +func ConnectHost(hostAndPort string, timeout int) (conn net.Conn, err error) { + conn, err = net.DialTimeout("tcp", hostAndPort, time.Duration(timeout)*time.Millisecond) + return +} +func ListenTls(ip string, port int, certBytes, keyBytes []byte) (ln *net.Listener, err error) { + var cert tls.Certificate + cert, err = tls.X509KeyPair(certBytes, keyBytes) + if err != nil { + return + } + clientCertPool := x509.NewCertPool() + ok := clientCertPool.AppendCertsFromPEM(certBytes) + if !ok { + err = errors.New("failed to parse root certificate") + } + config := &tls.Config{ + ClientCAs: clientCertPool, + ServerName: "proxy", + Certificates: []tls.Certificate{cert}, + ClientAuth: tls.RequireAndVerifyClientCert, + } + _ln, err := tls.Listen("tcp", fmt.Sprintf("%s:%d", ip, port), config) + if err == nil { + ln = &_ln + } + return +} +func PathExists(_path string) bool { + _, err := os.Stat(_path) + if err != nil && os.IsNotExist(err) { + return false + } + return true +} +func HTTPGet(URL string, timeout int) (err error) { + tr := &http.Transport{} + var resp *http.Response + var client *http.Client + defer func() { + if resp != nil && resp.Body != nil { + resp.Body.Close() + } + tr.CloseIdleConnections() + }() + client = &http.Client{Timeout: time.Millisecond * time.Duration(timeout), Transport: tr} + resp, err = client.Get(URL) + if err != nil { + return + } + return +} + +func initOutPool(isTLS bool, certBytes, keyBytes []byte, address string, timeout int, InitialCap int, MaxCap int) { + outPool, err = NewConnPool(poolConfig{ + IsActive: func(conn interface{}) bool { return true }, + Release: func(conn interface{}) { + if conn != nil { + conn.(net.Conn).SetDeadline(time.Now().Add(time.Millisecond)) + conn.(net.Conn).Close() + // log.Println("conn released") + } + }, + InitialCap: InitialCap, + MaxCap: MaxCap, + Factory: func() (conn interface{}, err error) { + conn, err = getConn(isTLS, certBytes, keyBytes, address, timeout) + return + }, + }) + if err != nil { + log.Fatalf("init conn pool fail ,%s", err) + } else { + log.Printf("init conn pool success") + initPoolDeamon(isTLS, certBytes, keyBytes, address, timeout) + } +} +func getConn(isTLS bool, certBytes, keyBytes []byte, address string, timeout int) (conn interface{}, err error) { + if isTLS { + var _conn tls.Conn + _conn, err = TlsConnectHost(address, timeout, certBytes, keyBytes) + if err == nil { + conn = net.Conn(&_conn) + } + } else { + conn, err = ConnectHost(address, timeout) + } + return +} +func initPoolDeamon(isTLS bool, certBytes, keyBytes []byte, address string, timeout int) { + go func() { + dur := cfg.GetInt("check-proxy-interval") + if dur <= 0 { + return + } + log.Printf("pool deamon started") + for { + time.Sleep(time.Second * time.Duration(dur)) + conn, err := getConn(isTLS, certBytes, keyBytes, address, timeout) + if err != nil { + log.Printf("pool deamon err %s , release pool", err) + outPool.ReleaseAll() + } else { + conn.(net.Conn).SetDeadline(time.Now().Add(time.Millisecond)) + conn.(net.Conn).Close() + } + } + }() +} +func getURL(header []byte, host string) (URL string, err error) { + if !strings.HasPrefix(host, "/") { + return host, nil + } + _host, err := getHeader("host", header) + if err != nil { + return + } + URL = fmt.Sprintf("http://%s%s", _host, host) + return +} +func getHeader(key string, headData []byte) (val string, err error) { + key = strings.ToUpper(key) + lines := strings.Split(string(headData), "\r\n") + for _, line := range lines { + line := strings.SplitN(strings.Trim(line, "\r\n "), ":", 2) + if len(line) == 2 { + k := strings.ToUpper(strings.Trim(line[0], " ")) + v := strings.Trim(line[1], " ") + if key == k { + val = v + return + } + } + } + err = fmt.Errorf("can not find HOST header") + return +} +func hostIsNoPort(host string) bool { + //host: [dd:dafds:fsd:dasd:2.2.23.3] or 2.2.23.3 or [dd:dafds:fsd:dasd:2.2.23.3]:2323 or 2.2.23.3:1234 + if strings.HasPrefix(host, "[") { + return strings.HasSuffix(host, "]") + } + return strings.Index(host, ":") == -1 +} +func fixHost(host string) string { + if !strings.HasPrefix(host, "[") && len(strings.Split(host, ":")) > 2 { + if strings.HasSuffix(host, ":80") { + return fmt.Sprintf("[%s]:80", host[:strings.LastIndex(host, ":")]) + } + if strings.HasSuffix(host, ":443") { + return fmt.Sprintf("[%s]:443", host[:strings.LastIndex(host, ":")]) + } + } + return host +} + +type sockaddr struct { + family uint16 + data [14]byte +} + +// const SO_ORIGINAL_DST = 80 + +// realServerAddress returns an intercepted connection's original destination. +// func realServerAddress(conn *net.Conn) (string, error) { +// tcpConn, ok := (*conn).(*net.TCPConn) +// if !ok { +// return "", errors.New("not a TCPConn") +// } + +// file, err := tcpConn.File() +// if err != nil { +// return "", err +// } + +// // To avoid potential problems from making the socket non-blocking. +// tcpConn.Close() +// *conn, err = net.FileConn(file) +// if err != nil { +// return "", err +// } + +// defer file.Close() +// fd := file.Fd() + +// var addr sockaddr +// size := uint32(unsafe.Sizeof(addr)) +// err = getsockopt(int(fd), syscall.SOL_IP, SO_ORIGINAL_DST, uintptr(unsafe.Pointer(&addr)), &size) +// if err != nil { +// return "", err +// } + +// var ip net.IP +// switch addr.family { +// case syscall.AF_INET: +// ip = addr.data[2:6] +// default: +// return "", errors.New("unrecognized address family") +// } + +// port := int(addr.data[0])<<8 + int(addr.data[1]) + +// return net.JoinHostPort(ip.String(), strconv.Itoa(port)), nil +// } + +// func getsockopt(s int, level int, name int, val uintptr, vallen *uint32) (err error) { +// _, _, e1 := syscall.Syscall6(syscall.SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) +// if e1 != 0 { +// err = e1 +// } +// return +// } diff --git a/io-limiter.go b/io-limiter.go new file mode 100644 index 0000000..37c8417 --- /dev/null +++ b/io-limiter.go @@ -0,0 +1,97 @@ +package main + +import ( + "context" + "io" + "time" + + "golang.org/x/time/rate" +) + +const burstLimit = 1000 * 1000 * 1000 + +type Reader struct { + r io.Reader + limiter *rate.Limiter + ctx context.Context +} + +type Writer struct { + w io.Writer + limiter *rate.Limiter + ctx context.Context +} + +// NewReader returns a reader that implements io.Reader with rate limiting. +func NewReader(r io.Reader) *Reader { + return &Reader{ + r: r, + ctx: context.Background(), + } +} + +// NewReaderWithContext returns a reader that implements io.Reader with rate limiting. +func NewReaderWithContext(r io.Reader, ctx context.Context) *Reader { + return &Reader{ + r: r, + ctx: ctx, + } +} + +// NewWriter returns a writer that implements io.Writer with rate limiting. +func NewWriter(w io.Writer) *Writer { + return &Writer{ + w: w, + ctx: context.Background(), + } +} + +// NewWriterWithContext returns a writer that implements io.Writer with rate limiting. +func NewWriterWithContext(w io.Writer, ctx context.Context) *Writer { + return &Writer{ + w: w, + ctx: ctx, + } +} + +// SetRateLimit sets rate limit (bytes/sec) to the reader. +func (s *Reader) SetRateLimit(bytesPerSec float64) { + s.limiter = rate.NewLimiter(rate.Limit(bytesPerSec), burstLimit) + s.limiter.AllowN(time.Now(), burstLimit) // spend initial burst +} + +// Read reads bytes into p. +func (s *Reader) Read(p []byte) (int, error) { + if s.limiter == nil { + return s.r.Read(p) + } + n, err := s.r.Read(p) + if err != nil { + return n, err + } + if err := s.limiter.WaitN(s.ctx, n); err != nil { + return n, err + } + return n, nil +} + +// SetRateLimit sets rate limit (bytes/sec) to the writer. +func (s *Writer) SetRateLimit(bytesPerSec float64) { + s.limiter = rate.NewLimiter(rate.Limit(bytesPerSec), burstLimit) + s.limiter.AllowN(time.Now(), burstLimit) // spend initial burst +} + +// Write writes bytes from p. +func (s *Writer) Write(p []byte) (int, error) { + if s.limiter == nil { + return s.w.Write(p) + } + n, err := s.w.Write(p) + if err != nil { + return n, err + } + if err := s.limiter.WaitN(s.ctx, n); err != nil { + return n, err + } + return n, err +} diff --git a/keygen.sh b/keygen.sh new file mode 100755 index 0000000..69a4f80 --- /dev/null +++ b/keygen.sh @@ -0,0 +1,3 @@ +#!/bin/bash +openssl genrsa -out proxy.key 2048 +openssl req -new -key proxy.key -x509 -days 3650 -out proxy.crt -subj /C=CN/ST=BJ/O="Localhost Ltd"/CN=proxy \ No newline at end of file diff --git a/main.go b/main.go new file mode 100644 index 0000000..1d05b3a --- /dev/null +++ b/main.go @@ -0,0 +1,382 @@ +package main + +import ( + "bytes" + "encoding/base64" + "fmt" + "io" + "io/ioutil" + "log" + "net" + "net/url" + "os" + "os/exec" + "os/signal" + "runtime/debug" + "strings" + "syscall" + "time" +) + +const APP_VERSION = "2.2" + +var ( + checker Checker + proxyIsTls bool + localIsTls bool + proxyAddr string + isTCP bool + connTimeout int + certBytes []byte + keyBytes []byte + err error + outPool ConnPool + basicAuth BasicAuth + httpAuthorization bool +) + +func init() { + err = initConfig() + if err != nil { + log.Printf("err : %s", err) + return + } +} +func main() { + //catch panic error + defer func() { + e := recover() + if e != nil { + log.Printf("err : %s,\ntrace:%s", e, string(debug.Stack())) + } + }() + //define command line args + proxyIsTls = cfg.GetBool("parent-tls") + localIsTls = cfg.GetBool("local-tls") + proxyAddr = cfg.GetString("parent") + bindIP := cfg.GetString("ip") + bindPort := cfg.GetInt("port") + timeout := cfg.GetInt("check-timeout") + connTimeout = cfg.GetInt("tcp-timeout") + interval := cfg.GetInt("check-interval") + certFile := cfg.GetString("cert") + keyFile := cfg.GetString("key") + blockedFile := cfg.GetString("blocked") + directFile := cfg.GetString("direct") + + isTCP = cfg.GetBool("tcp") + poolInitSize := cfg.GetInt("pool-size") + + //check args required + if proxyIsTls && proxyAddr == "" { + log.Fatalf("parent proxy address required") + } + + //check tls cert&key file + if certFile == "" { + certFile = "proxy.crt" + } + if keyFile == "" { + keyFile = "proxy.key" + } + if proxyIsTls || localIsTls { + certBytes, err = ioutil.ReadFile(certFile) + if err != nil { + log.Printf("err : %s", err) + return + } + keyBytes, err = ioutil.ReadFile(keyFile) + if err != nil { + log.Printf("err : %s", err) + return + } + } + //init tls info string + var proxyIsTlsStr string + var localIsTlsStr string + protocolStr := "tcp" + if !isTCP { + protocolStr = "http(s)" + } + if proxyIsTls { + proxyIsTlsStr = "tls " + } + if localIsTls { + localIsTlsStr = "tls " + } + //init checker and pool if needed + if proxyAddr != "" { + if !isTCP && !cfg.GetBool("always") { + checker = NewChecker(timeout, int64(interval), blockedFile, directFile) + } + log.Printf("use %sparent %s proxy : %s", proxyIsTlsStr, protocolStr, proxyAddr) + initOutPool(proxyIsTls, certBytes, keyBytes, proxyAddr, connTimeout, poolInitSize, poolInitSize*2) + } else if isTCP { + log.Printf("tcp proxy need parent") + return + } + //init basic auth only in http mode + if !isTCP { + basicAuth = NewBasicAuth() + if cfg.GetString("auth-file") != "" { + httpAuthorization = true + n, err := basicAuth.AddFromFile(cfg.GetString("auth-file")) + if err != nil { + log.Fatalf("auth-file:%s", err) + } + log.Printf("auth data added from file %d , total:%d", n, basicAuth.Total()) + } + if len(cfg.GetStringSlice("auth")) > 0 { + httpAuthorization = true + n := basicAuth.Add(cfg.GetStringSlice("auth")) + log.Printf("auth data added %d, total:%d", n, basicAuth.Total()) + } + } + + //listen + sc := NewServerChannel(bindIP, bindPort) + var err error + if localIsTls { + err = sc.ListenTls(certBytes, keyBytes, connHandler) + } else { + err = sc.ListenTCP(connHandler) + } + //listen fail + if err != nil { + log.Fatalf("ERR:%s", err) + } else { + log.Printf("%s %sproxy on %s", protocolStr, localIsTlsStr, (*sc.Listener).Addr()) + } + //block main() + signalChan := make(chan os.Signal, 1) + cleanupDone := make(chan bool) + signal.Notify(signalChan, + os.Interrupt, + syscall.SIGHUP, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT) + go func() { + for _ = range signalChan { + if outPool != nil { + fmt.Println("\nReceived an interrupt, stopping services...") + outPool.ReleaseAll() + //time.Sleep(time.Second * 10) + // fmt.Println("done") + } + cleanupDone <- true + } + }() + <-cleanupDone +} +func connHandler(inConn net.Conn) { + defer func() { + err := recover() + if err != nil { + log.Printf("connHandler crashed,err:%s\nstack:%s", err, string(debug.Stack())) + closeConn(&inConn) + } + }() + if isTCP { + tcpHandler(&inConn) + } else { + httpHandler(&inConn) + } +} + +func tcpHandler(inConn *net.Conn) { + var outConn net.Conn + var _outConn interface{} + _outConn, err = outPool.Get() + if err != nil { + log.Printf("connect to %s , err:%s", proxyAddr, err) + closeConn(inConn) + return + } + outConn = _outConn.(net.Conn) + inAddr := (*inConn).RemoteAddr().String() + outAddr := outConn.RemoteAddr().String() + IoBind((*inConn), outConn, func(err error) { + log.Printf("conn %s - %s released", inAddr, outAddr) + closeConn(inConn) + closeConn(&outConn) + }, func(n int, d bool) {}, 0) + log.Printf("conn %s - %s connected", inAddr, outAddr) +} +func httpHandler(inConn *net.Conn) { + var b [4096]byte + var n int + n, err = (*inConn).Read(b[:]) + if err != nil { + if err != io.EOF { + log.Printf("read err:%s", err) + } + closeConn(inConn) + return + } + var method, host, address string + index := bytes.IndexByte(b[:], '\n') + if index == -1 { + log.Printf("data err:%s", string(b[:n])[:50]) + closeConn(inConn) + return + } + + fmt.Sscanf(string(b[:index]), "%s%s", &method, &host) + if method == "" || host == "" { + log.Printf("data err:%s", string(b[:n])[:50]) + closeConn(inConn) + return + } + isHTTPS := method == "CONNECT" + + //http basic auth,only http + if !isHTTPS { + if httpAuthorization { + //log.Printf("request :%s", string(b[:n])) + authorization, err := getHeader("Authorization", b[:n]) + if err != nil { + fmt.Fprint(*inConn, "HTTP/1.1 401 Unauthorized\r\nWWW-Authenticate: Basic realm=\"\"\r\n\r\nUnauthorized") + closeConn(inConn) + return + } + //log.Printf("Authorization:%s", authorization) + basic := strings.Fields(authorization) + if len(basic) != 2 { + log.Printf("authorization data error,ERR:%s", authorization) + closeConn(inConn) + return + } + user, err := base64.StdEncoding.DecodeString(basic[1]) + if err != nil { + log.Printf("authorization data parse error,ERR:%s", err) + closeConn(inConn) + return + } + authOk := basicAuth.Check(string(user)) + //log.Printf("auth %s,%v", string(user), authOk) + if !authOk { + fmt.Fprint(*inConn, "HTTP/1.1 401 Unauthorized\r\n\r\nUnauthorized") + closeConn(inConn) + return + } + } + } + + var bytes []byte + if isHTTPS { //https访问 + // [dd:dafds:fsd:dasd:2.2.23.3] or 2.2.23.3 or [dd:dafds:fsd:dasd:2.2.23.3]:2323 or 2.2.23.3:1234 + address = fixHost(host) + if hostIsNoPort(host) { //host不带端口, 默认443 + address = address + ":443" + } + } else { //http访问 + hostPortURL, err := url.Parse(host) + if err != nil { + log.Printf("url.Parse %s ERR:%s", host, err) + closeConn(inConn) + return + } + _host := fixHost(hostPortURL.Host) + address = _host + if hostIsNoPort(_host) { //host不带端口, 默认80 + address = _host + ":80" + } + if _host != hostPortURL.Host { + bytes = []byte(strings.Replace(string(b[:n]), hostPortURL.Host, _host, 1)) + host = strings.Replace(host, hostPortURL.Host, _host, 1) + } + } + //get url , reslut host is the full url + host, err = getURL(b[:n], host) + // log.Printf("body:%s", string(b[:n])) + // log.Printf("%s:%s", method, host) + if err != nil { + log.Printf("header data err:%s", err) + closeConn(inConn) + return + } + + useProxy := false + if proxyAddr != "" { + if cfg.GetBool("always") { + useProxy = true + } else { + if isHTTPS { + checker.Add(address, true, method, "", nil) + } else { + if bytes != nil { + checker.Add(address, false, method, host, bytes) + } else { + checker.Add(address, false, method, host, b[:n]) + } + } + useProxy, _, _ = checker.IsBlocked(address) + } + // var failN, successN uint + // useProxy, failN, successN = checker.IsBlocked(address) + //log.Printf("use proxy ? %s : %v ,fail:%d, success:%d", address, useProxy, failN, successN) + //log.Printf("use proxy ? %s : %v", address, useProxy) + } + + var outConn net.Conn + var _outConn interface{} + if useProxy { + _outConn, err = outPool.Get() + if err == nil { + outConn = _outConn.(net.Conn) + } + } else { + outConn, err = ConnectHost(address, connTimeout) + } + if err != nil { + log.Printf("connect to %s , err:%s", address, err) + closeConn(inConn) + return + } + inAddr := (*inConn).RemoteAddr().String() + outAddr := outConn.RemoteAddr().String() + + if isHTTPS { + if useProxy { + outConn.Write(b[:n]) + } else { + fmt.Fprint(*inConn, "HTTP/1.1 200 Connection established\r\n\r\n") + } + } else { + if bytes != nil { + outConn.Write(bytes) + } else { + outConn.Write(b[:n]) + } + } + IoBind(*inConn, outConn, func(err error) { + log.Printf("conn %s - %s [%s] released", inAddr, outAddr, address) + closeConn(inConn) + closeConn(&outConn) + }, func(n int, d bool) {}, 0) + log.Printf("conn %s - %s [%s] connected", inAddr, outAddr, address) +} +func closeConn(conn *net.Conn) { + if *conn != nil { + (*conn).SetDeadline(time.Now().Add(time.Millisecond)) + (*conn).Close() + } +} +func keygen() (err error) { + cmd := exec.Command("sh", "-c", "openssl genrsa -out proxy.key 2048") + out, err := cmd.CombinedOutput() + if err != nil { + log.Printf("err:%s", err) + return + } + fmt.Println(string(out)) + cmd = exec.Command("sh", "-c", `openssl req -new -key proxy.key -x509 -days 3650 -out proxy.crt -subj /C=CN/ST=BJ/O="Localhost Ltd"/CN=proxy`) + out, err = cmd.CombinedOutput() + if err != nil { + log.Printf("err:%s", err) + return + } + fmt.Println(string(out)) + return +} diff --git a/map.go b/map.go new file mode 100644 index 0000000..70277e5 --- /dev/null +++ b/map.go @@ -0,0 +1,315 @@ +package main + +import ( + "encoding/json" + "sync" +) + +var SHARD_COUNT = 32 + +// A "thread" safe map of type string:Anything. +// To avoid lock bottlenecks this map is dived to several (SHARD_COUNT) map shards. +type ConcurrentMap []*ConcurrentMapShared + +// A "thread" safe string to anything map. +type ConcurrentMapShared struct { + items map[string]interface{} + sync.RWMutex // Read Write mutex, guards access to internal map. +} + +// Creates a new concurrent map. +func NewConcurrentMap() ConcurrentMap { + m := make(ConcurrentMap, SHARD_COUNT) + for i := 0; i < SHARD_COUNT; i++ { + m[i] = &ConcurrentMapShared{items: make(map[string]interface{})} + } + return m +} + +// Returns shard under given key +func (m ConcurrentMap) GetShard(key string) *ConcurrentMapShared { + return m[uint(fnv32(key))%uint(SHARD_COUNT)] +} + +func (m ConcurrentMap) MSet(data map[string]interface{}) { + for key, value := range data { + shard := m.GetShard(key) + shard.Lock() + shard.items[key] = value + shard.Unlock() + } +} + +// Sets the given value under the specified key. +func (m ConcurrentMap) Set(key string, value interface{}) { + // Get map shard. + shard := m.GetShard(key) + shard.Lock() + shard.items[key] = value + shard.Unlock() +} + +// Callback to return new element to be inserted into the map +// It is called while lock is held, therefore it MUST NOT +// try to access other keys in same map, as it can lead to deadlock since +// Go sync.RWLock is not reentrant +type UpsertCb func(exist bool, valueInMap interface{}, newValue interface{}) interface{} + +// Insert or Update - updates existing element or inserts a new one using UpsertCb +func (m ConcurrentMap) Upsert(key string, value interface{}, cb UpsertCb) (res interface{}) { + shard := m.GetShard(key) + shard.Lock() + v, ok := shard.items[key] + res = cb(ok, v, value) + shard.items[key] = res + shard.Unlock() + return res +} + +// Sets the given value under the specified key if no value was associated with it. +func (m ConcurrentMap) SetIfAbsent(key string, value interface{}) bool { + // Get map shard. + shard := m.GetShard(key) + shard.Lock() + _, ok := shard.items[key] + if !ok { + shard.items[key] = value + } + shard.Unlock() + return !ok +} + +// Retrieves an element from map under given key. +func (m ConcurrentMap) Get(key string) (interface{}, bool) { + // Get shard + shard := m.GetShard(key) + shard.RLock() + // Get item from shard. + val, ok := shard.items[key] + shard.RUnlock() + return val, ok +} + +// Returns the number of elements within the map. +func (m ConcurrentMap) Count() int { + count := 0 + for i := 0; i < SHARD_COUNT; i++ { + shard := m[i] + shard.RLock() + count += len(shard.items) + shard.RUnlock() + } + return count +} + +// Looks up an item under specified key +func (m ConcurrentMap) Has(key string) bool { + // Get shard + shard := m.GetShard(key) + shard.RLock() + // See if element is within shard. + _, ok := shard.items[key] + shard.RUnlock() + return ok +} + +// Removes an element from the map. +func (m ConcurrentMap) Remove(key string) { + // Try to get shard. + shard := m.GetShard(key) + shard.Lock() + delete(shard.items, key) + shard.Unlock() +} + +// Removes an element from the map and returns it +func (m ConcurrentMap) Pop(key string) (v interface{}, exists bool) { + // Try to get shard. + shard := m.GetShard(key) + shard.Lock() + v, exists = shard.items[key] + delete(shard.items, key) + shard.Unlock() + return v, exists +} + +// Checks if map is empty. +func (m ConcurrentMap) IsEmpty() bool { + return m.Count() == 0 +} + +// Used by the Iter & IterBuffered functions to wrap two variables together over a channel, +type Tuple struct { + Key string + Val interface{} +} + +// Returns an iterator which could be used in a for range loop. +// +// Deprecated: using IterBuffered() will get a better performence +func (m ConcurrentMap) Iter() <-chan Tuple { + chans := snapshot(m) + ch := make(chan Tuple) + go fanIn(chans, ch) + return ch +} + +// Returns a buffered iterator which could be used in a for range loop. +func (m ConcurrentMap) IterBuffered() <-chan Tuple { + chans := snapshot(m) + total := 0 + for _, c := range chans { + total += cap(c) + } + ch := make(chan Tuple, total) + go fanIn(chans, ch) + return ch +} + +// Returns a array of channels that contains elements in each shard, +// which likely takes a snapshot of `m`. +// It returns once the size of each buffered channel is determined, +// before all the channels are populated using goroutines. +func snapshot(m ConcurrentMap) (chans []chan Tuple) { + chans = make([]chan Tuple, SHARD_COUNT) + wg := sync.WaitGroup{} + wg.Add(SHARD_COUNT) + // Foreach shard. + for index, shard := range m { + go func(index int, shard *ConcurrentMapShared) { + // Foreach key, value pair. + shard.RLock() + chans[index] = make(chan Tuple, len(shard.items)) + wg.Done() + for key, val := range shard.items { + chans[index] <- Tuple{key, val} + } + shard.RUnlock() + close(chans[index]) + }(index, shard) + } + wg.Wait() + return chans +} + +// fanIn reads elements from channels `chans` into channel `out` +func fanIn(chans []chan Tuple, out chan Tuple) { + wg := sync.WaitGroup{} + wg.Add(len(chans)) + for _, ch := range chans { + go func(ch chan Tuple) { + for t := range ch { + out <- t + } + wg.Done() + }(ch) + } + wg.Wait() + close(out) +} + +// Returns all items as map[string]interface{} +func (m ConcurrentMap) Items() map[string]interface{} { + tmp := make(map[string]interface{}) + + // Insert items to temporary map. + for item := range m.IterBuffered() { + tmp[item.Key] = item.Val + } + + return tmp +} + +// Iterator callback,called for every key,value found in +// maps. RLock is held for all calls for a given shard +// therefore callback sess consistent view of a shard, +// but not across the shards +type IterCb func(key string, v interface{}) + +// Callback based iterator, cheapest way to read +// all elements in a map. +func (m ConcurrentMap) IterCb(fn IterCb) { + for idx := range m { + shard := (m)[idx] + shard.RLock() + for key, value := range shard.items { + fn(key, value) + } + shard.RUnlock() + } +} + +// Return all keys as []string +func (m ConcurrentMap) Keys() []string { + count := m.Count() + ch := make(chan string, count) + go func() { + // Foreach shard. + wg := sync.WaitGroup{} + wg.Add(SHARD_COUNT) + for _, shard := range m { + go func(shard *ConcurrentMapShared) { + // Foreach key, value pair. + shard.RLock() + for key := range shard.items { + ch <- key + } + shard.RUnlock() + wg.Done() + }(shard) + } + wg.Wait() + close(ch) + }() + + // Generate keys + keys := make([]string, 0, count) + for k := range ch { + keys = append(keys, k) + } + return keys +} + +//Reviles ConcurrentMap "private" variables to json marshal. +func (m ConcurrentMap) MarshalJSON() ([]byte, error) { + // Create a temporary map, which will hold all item spread across shards. + tmp := make(map[string]interface{}) + + // Insert items to temporary map. + for item := range m.IterBuffered() { + tmp[item.Key] = item.Val + } + return json.Marshal(tmp) +} + +func fnv32(key string) uint32 { + hash := uint32(2166136261) + const prime32 = uint32(16777619) + for i := 0; i < len(key); i++ { + hash *= prime32 + hash ^= uint32(key[i]) + } + return hash +} + +// Concurrent map uses Interface{} as its value, therefor JSON Unmarshal +// will probably won't know which to type to unmarshal into, in such case +// we'll end up with a value of type map[string]interface{}, In most cases this isn't +// out value type, this is why we've decided to remove this functionality. + +// func (m *ConcurrentMap) UnmarshalJSON(b []byte) (err error) { +// // Reverse process of Marshal. + +// tmp := make(map[string]interface{}) + +// // Unmarshal into a single map. +// if err := json.Unmarshal(b, &tmp); err != nil { +// return nil +// } + +// // foreach key,value pair in temporary map insert into our concurrent map. +// for key, val := range tmp { +// m.Set(key, val) +// } +// return nil +// } diff --git a/pool.go b/pool.go new file mode 100755 index 0000000..21394b9 --- /dev/null +++ b/pool.go @@ -0,0 +1,145 @@ +package main + +import ( + "log" + "sync" + "time" +) + +//ConnPool to use +type ConnPool interface { + Get() (conn interface{}, err error) + Put(conn interface{}) + ReleaseAll() + Len() (length int) +} +type poolConfig struct { + Factory func() (interface{}, error) + IsActive func(interface{}) bool + Release func(interface{}) + InitialCap int + MaxCap int +} + +func NewConnPool(poolConfig poolConfig) (pool ConnPool, err error) { + p := netPool{ + config: poolConfig, + conns: make(chan interface{}, poolConfig.MaxCap), + lock: &sync.Mutex{}, + } + //log.Printf("pool MaxCap:%d", poolConfig.MaxCap) + if poolConfig.MaxCap > 0 { + err = p.initAutoFill(false) + if err == nil { + p.initAutoFill(true) + } + } + return &p, nil +} + +type netPool struct { + conns chan interface{} + lock *sync.Mutex + config poolConfig +} + +func (p *netPool) initAutoFill(async bool) (err error) { + var worker = func() (err error) { + for { + //log.Printf("pool fill: %v , len: %d", p.Len() <= p.config.InitialCap/2, p.Len()) + if p.Len() <= p.config.InitialCap/2 { + p.lock.Lock() + errN := 0 + for i := 0; i < p.config.InitialCap; i++ { + c, err := p.config.Factory() + if err != nil { + errN++ + if async { + continue + } else { + p.lock.Unlock() + return err + } + } + select { + case p.conns <- c: + default: + p.config.Release(c) + break + } + if p.Len() >= p.config.InitialCap { + break + } + } + if errN > 0 { + log.Printf("fill conn pool fail , ERRN:%d", errN) + } + p.lock.Unlock() + } + if !async { + return + } + time.Sleep(time.Second * 2) + } + } + if async { + go worker() + } else { + err = worker() + } + return + +} + +func (p *netPool) Get() (conn interface{}, err error) { + // defer func() { + // log.Printf("pool len : %d", p.Len()) + // }() + p.lock.Lock() + defer p.lock.Unlock() + // for { + select { + case conn = <-p.conns: + if p.config.IsActive(conn) { + return + } + p.config.Release(conn) + default: + conn, err = p.config.Factory() + if err != nil { + return nil, err + } + return conn, nil + } + // } + return +} + +func (p *netPool) Put(conn interface{}) { + if conn == nil { + return + } + p.lock.Lock() + defer p.lock.Unlock() + if !p.config.IsActive(conn) { + p.config.Release(conn) + } + select { + case p.conns <- conn: + default: + p.config.Release(conn) + } +} +func (p *netPool) ReleaseAll() { + p.lock.Lock() + defer p.lock.Unlock() + close(p.conns) + for c := range p.conns { + p.config.Release(c) + } + p.conns = make(chan interface{}, p.config.InitialCap) + +} +func (p *netPool) Len() (length int) { + return len(p.conns) +} diff --git a/proxy.toml b/proxy.toml new file mode 100644 index 0000000..c605b3a --- /dev/null +++ b/proxy.toml @@ -0,0 +1,72 @@ + +##################################### +##############parent################# +##################################### +#parent proxy address,such as: 223.78.2.33:8090 +parent="" + +#parent proxy is tls +parent-tls=false + +#tcp timeout milliseconds when connect to real server or parent proxy +tcp-timeout=2000 + +#conn pool size , which connect to parent proxy +pool-size=50 + +#always use parent proxy +always=false + +##################################### +##############local################## +##################################### + +#local ip to bind +ip="0.0.0.0" + +#local port to listen +port=33080 + +#local proxy is tls +local-tls=false + +##################################### +################tls################## +##################################### + +#cert file for tls +cert="proxy.crt" + +#key file for tls +key="proxy.key" + +##################################### +################protocol############# +##################################### + +#proxy on tcp +tcp=false + +##################################### +################check################ +##################################### + +#chekc domain blocked , http request timeout milliseconds when connect to host +check-timeout=3000 + +#check domain if blocked every interval seconds +check-interval=10 + +#check if proxy is okay every interval seconds +#this is very helpful to proxy fix pool status , zero means:no check +check-proxy-interval=3 + +#blocked domain file , one domain each line +#google.com means (*.)*.google.com +blocked="blocked" + +#direct domain file , one domain each line +#qq.com means (*.)*.qq.com +direct="direct" + + \ No newline at end of file diff --git a/proxyd b/proxyd new file mode 100755 index 0000000..5f49778 --- /dev/null +++ b/proxyd @@ -0,0 +1,36 @@ +#!/bin/bash +PID="/var/run/proxy.pid" +NAME="proxy" +case "$1" in +start) + if [ -e ${PID} ]; then + echo ${NAME} is running, pid=`cat ${PID}`, please stop first + exit 1 + else + monexec run -w /etc/proxy -- proxy >/dev/null 2>&1 & + echo $!>${PID} + fi + ;; +stop) + if [ -e ${PID} ]; then + kill `cat ${PID}` + rm ${PID} + fi + ;; +restart) + $0 stop + $0 start + ;; +status) + if [ -e ${PID} ]; then + echo ${NAME} is running, pid=`cat ${PID}` + else + echo ${NAME} is NOT running + exit 1 + fi + ;; +*) + echo "Usage: $0 {start|stop|status|restart}" +esac + +exit 0 \ No newline at end of file diff --git a/release.sh b/release.sh new file mode 100755 index 0000000..215772b --- /dev/null +++ b/release.sh @@ -0,0 +1,57 @@ +#!/bin/bash +VER="2.2" +RELEASE="release-${VER}" +rm -rf ${RELEASE} +mkdir ${RELEASE} +set CGO_ENABLED=0 +#linux +GOOS=linux GOARCH=386 go build && tar zcfv "${RELEASE}/proxy-linux-386.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=linux GOARCH=amd64 go build && tar zcfv "${RELEASE}/proxy-linux-amd64.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=linux GOARCH=arm GOARM=7 go build && tar zcfv "${RELEASE}/proxy-linux-arm.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=linux GOARCH=arm64 GOARM=7 go build && tar zcfv "${RELEASE}/proxy-linux-arm64.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=linux GOARCH=mips go build && tar zcfv "${RELEASE}/proxy-linux-mips.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=linux GOARCH=mips64 go build && tar zcfv "${RELEASE}/proxy-linux-mips64.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=linux GOARCH=mips64le go build && tar zcfv "${RELEASE}/proxy-linux-mips64le.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=linux GOARCH=mipsle go build && tar zcfv "${RELEASE}/proxy-linux-mipsle.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=linux GOARCH=ppc64 go build && tar zcfv "${RELEASE}/proxy-linux-ppc64.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=linux GOARCH=ppc64le go build && tar zcfv "${RELEASE}/proxy-linux-ppc64le.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=linux GOARCH=s390x go build && tar zcfv "${RELEASE}/proxy-linux-s390x.tar.gz" proxy proxy.toml proxyd direct blocked +#android +GOOS=android GOARCH=386 go build && tar zcfv "${RELEASE}/proxy-android-386.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=android GOARCH=amd64 go build && tar zcfv "${RELEASE}/proxy-android-amd64.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=android GOARCH=arm go build && tar zcfv "${RELEASE}/proxy-android-arm.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=android GOARCH=arm64 go build && tar zcfv "${RELEASE}/proxy-android-arm64.tar.gz" proxy proxy.toml proxyd direct blocked +#darwin +GOOS=darwin GOARCH=386 go build go build && tar zcfv "${RELEASE}/proxy-darwin-386.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=darwin GOARCH=amd64 go build && tar zcfv "${RELEASE}/proxy-darwin-amd64.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=darwin GOARCH=arm go build && tar zcfv "${RELEASE}/proxy-darwin-arm.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=darwin GOARCH=arm64 go build && tar zcfv "${RELEASE}/proxy-darwin-arm64.tar.gz" proxy proxy.toml proxyd direct blocked +#dragonfly +GOOS=dragonfly GOARCH=amd64 go build && tar zcfv "${RELEASE}/proxy-dragonfly-amd64.tar.gz" proxy proxy.toml proxyd direct blocked +#freebsd +GOOS=freebsd GOARCH=386 go build && tar zcfv "${RELEASE}/proxy-freebsd-386.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=freebsd GOARCH=amd64 go build && tar zcfv "${RELEASE}/proxy-freebsd-amd64.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=freebsd GOARCH=arm go build && tar zcfv "${RELEASE}/proxy-freebsd-arm.tar.gz" proxy proxy.toml proxyd direct blocked +#nacl +GOOS=nacl GOARCH=386 go build && tar zcfv "${RELEASE}/proxy-nacl-386.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=nacl GOARCH=amd64p32 go build && tar zcfv "${RELEASE}/proxy-nacl-amd64p32.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=nacl GOARCH=arm go build && tar zcfv "${RELEASE}/proxy-nacl-arm.tar.gz" proxy proxy.toml proxyd direct blocked +#netbsd +GOOS=netbsd GOARCH=386 go build && tar zcfv "${RELEASE}/proxy-netbsd-386.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=netbsd GOARCH=amd64 go build && tar zcfv "${RELEASE}/proxy-netbsd-amd64.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=netbsd GOARCH=arm go build && tar zcfv "${RELEASE}/proxy-netbsd-arm.tar.gz" proxy proxy.toml proxyd direct blocked +#openbsd +GOOS=openbsd GOARCH=386 go build && tar zcfv "${RELEASE}/proxy-openbsd-386.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=openbsd GOARCH=amd64 go build && tar zcfv "${RELEASE}/proxy-openbsd-amd64.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=openbsd GOARCH=arm go build && tar zcfv "${RELEASE}/proxy-openbsd-arm.tar.gz" proxy proxy.toml proxyd direct blocked +#plan9 +GOOS=plan9 GOARCH=386 go build && tar zcfv "${RELEASE}/proxy-plan9-386.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=plan9 GOARCH=amd64 go build && tar zcfv "${RELEASE}/proxy-plan9-amd64.tar.gz" proxy proxy.toml proxyd direct blocked +GOOS=plan9 GOARCH=arm go build && tar zcfv "${RELEASE}/proxy-plan9-arm.tar.gz" proxy proxy.toml proxyd direct blocked +#solaris +GOOS=solaris GOARCH=amd64 go build && tar zcfv "${RELEASE}/proxy-solaris-amd64.tar.gz" proxy proxy.toml proxyd direct blocked +#windows +GOOS=windows GOARCH=386 go build && tar zcfv "${RELEASE}/proxy-windows-386.tar.gz" proxy.exe proxy.toml direct blocked +GOOS=windows GOARCH=amd64 go build && tar zcfv "${RELEASE}/proxy-windows-amd64.tar.gz" proxy.exe proxy.toml direct blocked + +rm proxy proxy.exe \ No newline at end of file diff --git a/serve-channel.go b/serve-channel.go new file mode 100644 index 0000000..dd85f71 --- /dev/null +++ b/serve-channel.go @@ -0,0 +1,125 @@ +package main + +import ( + "fmt" + "log" + "net" + "runtime/debug" +) + +type ServerChannel struct { + ip string + port int + Listener *net.Listener + UDPListener *net.UDPConn + errAcceptHandler func(err error) +} + +func NewServerChannel(ip string, port int) ServerChannel { + return ServerChannel{ + ip: ip, + port: port, + errAcceptHandler: func(err error) { + fmt.Printf("accept error , ERR:%s", err) + }, + } +} +func (sc *ServerChannel) SetErrAcceptHandler(fn func(err error)) { + sc.errAcceptHandler = fn +} +func (sc *ServerChannel) ListenTls(certBytes, keyBytes []byte, fn func(conn net.Conn)) (err error) { + sc.Listener, err = ListenTls(sc.ip, sc.port, certBytes, keyBytes) + if err == nil { + go func() { + defer func() { + if e := recover(); e != nil { + log.Printf("ListenTls crashed , err : %s , \ntrace:%s", e, string(debug.Stack())) + } + }() + for { + var conn net.Conn + conn, err = (*sc.Listener).Accept() + if err == nil { + go func() { + defer func() { + if e := recover(); e != nil { + log.Printf("connection handler crashed , err : %s , \ntrace:%s", e, string(debug.Stack())) + } + }() + fn(conn) + }() + } else { + sc.errAcceptHandler(err) + (*sc.Listener).Close() + break + } + } + }() + } + return +} + +func (sc *ServerChannel) ListenTCP(fn func(conn net.Conn)) (err error) { + l, err := net.Listen("tcp", fmt.Sprintf("%s:%d", sc.ip, sc.port)) + if err == nil { + sc.Listener = &l + go func() { + defer func() { + if e := recover(); e != nil { + log.Printf("ListenTCP crashed , err : %s , \ntrace:%s", e, string(debug.Stack())) + } + }() + for { + var conn net.Conn + conn, err = (*sc.Listener).Accept() + if err == nil { + go func() { + defer func() { + if e := recover(); e != nil { + log.Printf("connection handler crashed , err : %s , \ntrace:%s", e, string(debug.Stack())) + } + }() + fn(conn) + }() + } else { + sc.errAcceptHandler(err) + break + } + } + }() + } + return +} +func (sc *ServerChannel) ListenUDP(fn func(packet []byte, localAddr, srcAddr *net.UDPAddr)) (err error) { + addr := &net.UDPAddr{IP: net.ParseIP(sc.ip), Port: sc.port} + l, err := net.ListenUDP("udp", addr) + if err == nil { + sc.UDPListener = l + go func() { + defer func() { + if e := recover(); e != nil { + log.Printf("ListenUDP crashed , err : %s , \ntrace:%s", e, string(debug.Stack())) + } + }() + for { + var buf = make([]byte, 2048) + n, srcAddr, err := (*sc.UDPListener).ReadFromUDP(buf) + if err == nil { + packet := buf[0:n] + go func() { + defer func() { + if e := recover(); e != nil { + log.Printf("udp data handler crashed , err : %s , \ntrace:%s", e, string(debug.Stack())) + } + }() + fn(packet, addr, srcAddr) + }() + } else { + sc.errAcceptHandler(err) + break + } + } + }() + } + return +} diff --git a/structs.go b/structs.go new file mode 100644 index 0000000..81e1c51 --- /dev/null +++ b/structs.go @@ -0,0 +1,219 @@ +package main + +import ( + "io/ioutil" + "log" + "net" + "net/url" + "strings" + "time" +) + +type Checker struct { + data ConcurrentMap + blockedMap ConcurrentMap + directMap ConcurrentMap + interval int64 + timeout int +} +type CheckerItem struct { + IsHTTPS bool + Method string + URL string + Domain string + Host string + Data []byte + SuccessCount uint + FailCount uint +} + +//NewChecker args: +//timeout : tcp timeout milliseconds ,connect to host +//interval: recheck domain interval seconds +func NewChecker(timeout int, interval int64, blockedFile, directFile string) Checker { + ch := Checker{ + data: NewConcurrentMap(), + interval: interval, + timeout: timeout, + } + ch.blockedMap = ch.loadMap(blockedFile) + ch.directMap = ch.loadMap(directFile) + if !ch.blockedMap.IsEmpty() { + log.Printf("blocked file loaded , domains : %d", ch.blockedMap.Count()) + } + if !ch.directMap.IsEmpty() { + log.Printf("direct file loaded , domains : %d", ch.directMap.Count()) + } + ch.start() + return ch +} + +func (c *Checker) loadMap(f string) (dataMap ConcurrentMap) { + dataMap = NewConcurrentMap() + if PathExists(f) { + _contents, err := ioutil.ReadFile(f) + if err != nil { + log.Printf("load file err:%s", err) + return + } + for _, line := range strings.Split(string(_contents), "\n") { + line = strings.Trim(line, "\r \t") + if line != "" { + dataMap.Set(line, true) + } + } + } + return +} +func (c *Checker) start() { + go func() { + for { + for _, v := range c.data.Items() { + go func(item CheckerItem) { + if c.isNeedCheck(item) { + //log.Printf("check %s", item.Domain) + var conn net.Conn + var err error + if item.IsHTTPS { + conn, err = ConnectHost(item.Host, c.timeout) + if err == nil { + conn.SetDeadline(time.Now().Add(time.Millisecond)) + conn.Close() + } + } else { + err = HTTPGet(item.URL, c.timeout) + } + if err != nil { + item.FailCount = item.FailCount + 1 + } else { + item.SuccessCount = item.SuccessCount + 1 + } + c.data.Set(item.Host, item) + } + }(v.(CheckerItem)) + } + time.Sleep(time.Second * time.Duration(c.interval)) + } + }() +} +func (c *Checker) isNeedCheck(item CheckerItem) bool { + var minCount uint = 5 + if (item.SuccessCount >= minCount && item.SuccessCount > item.FailCount) || + (item.FailCount >= minCount && item.SuccessCount > item.FailCount) || + c.domainIsInMap(item.Host, false) || + c.domainIsInMap(item.Host, true) { + return false + } + return true +} +func (c *Checker) IsBlocked(address string) (blocked bool, failN, successN uint) { + if c.domainIsInMap(address, true) { + return true, 0, 0 + } + if c.domainIsInMap(address, false) { + return false, 0, 0 + } + + _item, ok := c.data.Get(address) + if !ok { + return true, 0, 0 + } + item := _item.(CheckerItem) + + return item.FailCount >= item.SuccessCount, item.FailCount, item.SuccessCount +} +func (c *Checker) domainIsInMap(address string, blockedMap bool) bool { + u, err := url.Parse("http://" + address) + if err != nil { + log.Printf("blocked check , url parse err:%s", err) + return true + } + domainSlice := strings.Split(u.Hostname(), ".") + if len(domainSlice) > 1 { + subSlice := domainSlice[:len(domainSlice)-1] + topDomain := strings.Join(domainSlice[len(domainSlice)-1:], ".") + checkDomain := topDomain + for i := len(subSlice) - 1; i >= 0; i-- { + checkDomain = subSlice[i] + "." + checkDomain + if !blockedMap && c.directMap.Has(checkDomain) { + return true + } + if blockedMap && c.blockedMap.Has(checkDomain) { + return true + } + } + } + return false +} +func (c *Checker) Add(address string, isHTTPS bool, method, URL string, data []byte) { + if c.domainIsInMap(address, false) || c.domainIsInMap(address, true) { + return + } + if !isHTTPS && strings.ToLower(method) != "get" { + return + } + var item CheckerItem + u := strings.Split(address, ":") + item = CheckerItem{ + URL: URL, + Domain: u[0], + Host: address, + Data: data, + IsHTTPS: isHTTPS, + Method: method, + } + c.data.SetIfAbsent(item.Host, item) +} + +type BasicAuth struct { + data ConcurrentMap +} + +func NewBasicAuth() BasicAuth { + return BasicAuth{ + data: NewConcurrentMap(), + } +} +func (ba *BasicAuth) AddFromFile(file string) (n int, err error) { + _content, err := ioutil.ReadFile(file) + if err != nil { + return + } + userpassArr := strings.Split(strings.Replace(string(_content), "\r", "", -1), "\n") + for _, userpass := range userpassArr { + if strings.HasPrefix("#", userpass) { + continue + } + u := strings.Split(strings.Trim(userpass, " "), ":") + if len(u) == 2 { + ba.data.Set(u[0], u[1]) + n++ + } + } + return +} + +func (ba *BasicAuth) Add(userpassArr []string) (n int) { + for _, userpass := range userpassArr { + u := strings.Split(userpass, ":") + if len(u) == 2 { + ba.data.Set(u[0], u[1]) + n++ + } + } + return +} + +func (ba *BasicAuth) Check(userpass string) (ok bool) { + u := strings.Split(strings.Trim(userpass, " "), ":") + if len(u) == 2 { + if p, _ok := ba.data.Get(u[0]); _ok { + return p.(string) == u[1] + } + } + return +} +func (ba *BasicAuth) Total() (n int) { + n = ba.data.Count() + return +}