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 +}