Browsed by
分类:FreeBSD

FreeBSD正确使用shadowsocks方式[dns upd 转发功能]

FreeBSD正确使用shadowsocks方式[dns upd 转发功能]

客户端

 安装

cd /usr/ports/net/shadowsocks-libev/
make install clean

配置

ee /usr/local/etc/shadowsocks-libev/config.json
{
    "server":"服务器ip", #刚才配置的公网ip
    "server_port":8888, #服务器的连接端口
    "local_port":6666, #客户端端口,给浏览器等工具用,socks5模式, 在客户端模式下,此参数生效,此案无效
    "password":"password",
    "timeout":60,
    "method":"aes-256-cfb"
}

修正(dns udp转发问题)

ee /usr/local/etc/rc.d/shadowsocks_libev
command_args="-f $pidfile -c $shadowsocks_libev_config "

修改为

command_args="-f $pidfile -c $shadowsocks_libev_config -l 53 -L 8.8.8.8:53 -u"

修正(客户端执行文件,最坑爹的port)

ee /usr/local/etc/rc.d/shadowsocks_libev
command="/usr/local/bin/ss-server"
pidfile="/var/run/shadowsocks-libev.pid"

修改为

command="/usr/local/bin/ss-tunnel"
pidfile="/var/run/shadowsocks-tunnel.pid"

自启动配置

ee /etc/rc.conf
shadowsocks_libev_enable="YES"

 

至此,53端口的dns请求全部通过ss转发到8.8.8.8 服务器

FreeBSD正确使用shadowsocks方式[客户端]

FreeBSD正确使用shadowsocks方式[客户端]

客户端

 安装

cd /usr/ports/net/shadowsocks-libev/
make install clean

配置

ee /usr/local/etc/shadowsocks-libev/config.json
{
    "server":"服务器ip", #刚才配置的公网ip
    "server_port":8888, #服务器的连接端口
    "local_port":6666, #客户端端口,给浏览器等工具用,socks5模式, 在客户端模式下,此参数生效
    "password":"password",
    "timeout":60,
    "method":"aes-256-cfb"
}

修正(udp转发问题)

ee /usr/local/etc/rc.d/shadowsocks_libev
command_args="-f $pidfile -c $shadowsocks_libev_config "

修改为

command_args="-f $pidfile -c $shadowsocks_libev_config -u"

修正(客户端执行文件,最坑爹的port)

ee /usr/local/etc/rc.d/shadowsocks_libev
command="/usr/local/bin/ss-server"

修改为

command="/usr/local/bin/ss-local"

自启动配置

ee /etc/rc.conf
shadowsocks_libev_enable="YES"

 

至此,使用浏览器,代理为 socks5 客户端ip 端口为 6666

就可以正确上网了,upd转发支持

FreeBSD正确使用shadowsocks方式[服务器端]

FreeBSD正确使用shadowsocks方式[服务器端]

服务端

 安装

cd /usr/ports/net/shadowsocks-libev/
make install clean

配置

ee /usr/local/etc/shadowsocks-libev/config.json
{
    "server":"公网ip",
    "server_port":8888, #服务器端口,给客户端连接用
    "local_port":6666, #客户端端口,给浏览器等工具用,socks5 ,本案不生效,在客户端上才生效
    "password":"password",
    "timeout":60,
    "method":"aes-256-cfb"
}

修正(udp转发问题)

ee /usr/local/etc/rc.d/shadowsocks_libev
command_args="-f $pidfile -c $shadowsocks_libev_config "

修改为

command_args="-f $pidfile -c $shadowsocks_libev_config -u"

 自启动配置

ee /etc/rc.conf
shadowsocks_libev_enable="YES"

 

自制像电信,移动的广告推送系统

自制像电信,移动的广告推送系统

现在上网都有广告推送系统,大家想来都碰到过
但这个推送系统,也可以用来推送公告,比如领导的花边新闻哪,水费电费催交哪,谁家的孩子玩了人家的狗哪之类的
现在的推送系统,要价都太………有点黑了,那我们来自制一个
原理:
1、利用防水墙,劫持所有53端口的访问,并转向于我们自建的DNS服务器
2、判断客户端IP是否在一个规定的时间内(如24小时),首次访问,如果是,转向自建WEB服务器
3、自建WEB服务器推送领导的花边新闻,当然领导掉阴沟里这类也可以,只要大家都喜欢的。
材料:PowerDNS+Lua,Nginx+Lua,php
OK,如果要想成功的搭建设这套系统,你要需要熟读上面各软件的官方手册,切记,熟读
PowerDNS使用Lua写个判断脚本 ,这里简单举例

function nxdomain ( ip, domain, qtype )
  print ("nxhandler called for: ", ip, domain, qtype)
 
  ret={}
  if qtype ~= pdns.A then return pdns.PASS, ret end  --  only A records
  if not string.find(domain, "^www%.") then return pdns.PASS, ret end  -- only things that start with www.
  if not matchnetmask(ip, "10.0.0.0/8", "192.168.0.0/16")  then return pdns.PASS, ret end -- only interfere with local queries
  ret[1]={qtype=pdns.A, content="192.0.2.13",ttl=30}    -- add IN A 192.0.2.13 自已的服务器
  ret[2]={qtype=pdns.CNAME, content="www.google.com",ttl=30}    -- add IN CNAME www.google.com ttl 30
  setvariable()
  return 0, ret                 -- return no error, plus records
end

 

上面代码的含义是,如果没查询到域名的DNS信息,就返回一个自定义的信息,这里返回自已的WEB服务器192.0.2.13,下面的CNAME是我写给大家看的演示,官方手册里没有相关的信息,自已摸索出来的,ttl 改成 30
脚本参考网址:https://doc.powerdns.com/md/recursor/scripting/

Nginix+Lua+Php就简单极了,网上教程一大把,内容就是泛域名的解析,参考nginx 官方手册,并参考nginx官方的配置WordPress的教程
Nginx wiki:http://wiki.nginx.org/Main
Nginx wordpress:http://wiki.nginx.org/Wordpress

Nginx.conf 的一个server配置案例

    server {
        listen       80;
        server_name  localhost;
        index  index.php;
        root /data/www;
        location /
               {
                 #try_files  $uri $uri/ /index.php?url=http://$http_host$request_uri;
                 include php5.conf;
                 fastcgi_param SCRIPT_FILENAME $document_root/index.php;
                 fastcgi_param QUERY_STRING url=http://$http_host$request_uri;
                 fastcgi_pass   127.0.0.1:9000;
         }


        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }

        error_page 404 /index.php;

    }

 

php5.conf

 
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
 
fastcgi_pass_request_body on;
client_body_in_file_only clean;
 
fastcgi_param  REQUEST_BODY_FILE  $request_body_file;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
 
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  PATH_INFO          $fastcgi_path_info;
fastcgi_param  PATH_TRANSLATED    $document_root$fastcgi_path_info;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  PHP_SELF           $fastcgi_script_name;
 
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
fastcgi_param  HTTPS              $https;
 
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

 

因为我们要获得用户的真实访问网址,所以我们要模拟一个,像电信一样的,你的真实网址是-GO,这里我们转向php文件,让其操作,不使用lua,因为太麻烦了。

index.php内容

                         ad web site</br>
=========================================</br>
                    You site not find in network
                              sorry
=========================================</br>
<?php
echo "Your URL =>".$_GET["url"]."<br>";
?>

 

当然有的PHPER要跳出来说,你的$_GET[“url”]怎么无中生有生出来的,如果你这里也提出想应的问题,请学会详细阅读

fastcgi_param QUERY_STRING url=http://$http_host$request_uri;

 

nginx.conf中组建了一个url,谢谢

无图无真像,当访问一个不存在的域名时,直接显示的是我们推送服务器的页面

图片

freebsd 下使用最新版的sqlmap 1.0

freebsd 下使用最新版的sqlmap 1.0

sqlmap 现在越来越强大,已经有隔了二年再次更新

但FREEBSD下的SQLMAP还在二年前的版本

所以我们需要自行下载

git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

 

root@freebsd:/home/admin/sqlmap/sqlmap-dev # python2.7 sqlmap.py

 

如果出现以下错误

missing one or more core extensions ('gzip', 'ssl', 'sqlite3', 'zlib') most probably because current version of Python has been built without appropriate dev packages (e.g. 'libsqlite3-dev')

 

执行以下指令

root@freebsd:/home/admin/sqlmap/sqlmap-dev # pkg install py-sqlite3

 

就可以正常使用最新版的 sqlmap

[原创]如何在nginx下防盗链,重点防迅雷

[原创]如何在nginx下防盗链,重点防迅雷

转载注明出处:https://flfq.peuland.com/

今天跟人讨论到防盗链的方案,当然重点是防迅雷,网上看了别人的方案,一个都没有真正解决问题,还在用referer判断,以下内容需要nginx,并加载lua模块

所以今天特地写了一下这文章

现行的防盗链的方法无非是检测referer头,因为http请求中常会指明referer,这相当于生活中你去拜访某人,需要别人的推荐信,referer就相当于推荐信,但这里有个问题哪,这个信可以随便伪造的哪,你没办法验明真伪的!!

所以迅雷就常用伪造的referer欺负小朋友们了。

那我们怎么办?因为用户下载的文件,肯定有特定的格式,比如rar,zip,exe,jpg等等,而这些不可以直接访问的,肯定需要你有个指引的界面,这个界面可能是 html,php,jsp,asp 等等网页格式

那如果是真用户,肯定是浏览了你的html ,php ,jsp ,asp 等网页后,才能知道你的文件下载链,才能下载!这过程肯定的,除非对方是天神,直接猜中你的下载链接 ,不然肯定要看了你的页面(包括广告,这是你的收益的重点),才能下载

OK!那我们如何在一张极简单的html上面给个zip文件的下载地址,并防盗链?
我们在用户观看html 等简单网页的时候,输出给客户一个cookie 值,你肯定要笑了,html怎么输出?这个可以由nginx代劳

代码如下

location ~* \.(htm|html)$ {
   rewrite_by_lua '
    local TaMud_id = ngx.md5("TaMud" .. ngx.var.remote_addr)
   if (ngx.var.cookie_TaMud_id ~= TaMud_id) then
       ngx.header["Set-Cookie"] = "TaMud_id=" .. TaMud_id .. ";path=/;"
--       return ngx.redirect(ngx.var.scheme .. "://" .. ngx.var.host .. ngx.var.uri)
   end
  ';
    }

上面代码写入你的nginx 的网站config配置中(以上需要nginx vhost 配置知识,并懂一点Lua语言)
这里需要注意的是 nginx conf 中注解是 # ,因为这里一断是Lua 代码,其注解是 — 两个减号,切记切记,注解是不同的,你不要调试的时候搞错了,到时候弄的骂我

上面的代码意义是,获得用户的IP地址,然后加上TaMud这个关键字(TaMud关键字一定要换成别人不知道的),取其MD5码(这了防迅雷)
然后检测用户的cookie如果传过来的 cookie里有TaMud_id 这个值,并跟本地计算出来的值是否一样( 防人伪造),如果不一样,就把本地计算出来的值传给人家

OK,当用户浏览你页面的时候,他的本地就获得了cookie TaMud_id这个值!

那当他要下载你的机器上的zip文件的时候,使用nginx  再进行同样的判断,如果没有相关的值,就不停的进行302跳转,跳死他,代码如下

location ~* \.(zip|rar|exe)$ {
   rewrite_by_lua '
    local TaMud_id = ngx.md5("TaMud" .. ngx.var.remote_addr)
   if (ngx.var.cookie_TaMud_id ~= TaMud_id) then
--       ngx.header["Set-Cookie"] = "TaMud_id=" .. TaMud_id .. ";path=/;"
       return ngx.redirect(ngx.var.scheme .. "://" .. ngx.var.host .. ngx.var.uri)
   end
  ';
    }

此处代码跟上面的有所不同,注解掉的是,回给用户的cookie,因为这里下载的是文件,不需要回给用户COOKIE,不然对方支持cookie的话,你就中招了,这里只需要302跳转,让他不停的跳

OK,到此你就成功了

就算迅雷把下载链接,人家COOKIE值,人家传递值都回抓取并共享给他的客户也没有用了,因为IP不同,算出来的TaMud_id 不同,所以人家用迅雷下载的话,就会不停的在 302 里跳转。

当然你也可以神仙一样的,修改一下 return ngx.redirect(“https://www.peuland.com“) 这你的网站首页,这样人家就跳到你的首页去

说出来是不是很简单,你只需要nginx + lua 的知识,就行了,当然其实你还需要了解很多的知识

问题是这么神一样存在的方案,网上竟然到现在还没有,所以在此公开一下

按以往经验,要被人理解并流行开,又要一两年经验

我这算是对迅雷落井下石不?

Varnish 高性能缓存服务器

Varnish 高性能缓存服务器

Varnish是一款高性能、开源的反向代理服务器和缓存服务器,Varnish采用全新的软件体系结构,和现在的硬件体系配合比较紧密。

 

当前计算机系统的内存除了主存外,还包括CPU的L1级缓存、L2级缓存,甚至还包括L3级缓存。硬盘也有缓存,而Squid的架构导致其无法做到最佳存取,但操作系统可以实现这部分功能,所以这部分工作应该交给操作系统来处理,这就是Varnish Cache设计架构。挪威最大的在线报纸Verdens Gang(vg.no)使用了3台Varnish服务器代替了原来的12台Squid服务器,而且性能比以前更好,这是Varnish最成功的应用案例之一。目前,Varnish可以在FreeBSD6.0/7.0、Solaris和Linux 2.6内核上运行。

Varnish的结构特点

Varnish的先进设计理念和成熟的设计框架是其主要特点。Varnish把数据存放在服务器的内存中,这种模式的效率是最高的,不过重启后数据会消失,官方透露3.0版本可以解决这个问题。Varnish可以设置0~60秒的精确缓存时间,不过32位的机器支持的缓存文件最大为2 GB。Varnish采用VCL的配置,而且具有强大的管理功能,如top、stat、admin、lis,所以管理方式比较灵活。Varnish的状态机设计不仅巧妙,结构也很清晰,利用二叉堆管理缓存文件,即可达到随时删除的目的。

Varnish和Squid的对比

Squid 也是一种开源的代理缓存软件,下面对比 Varnish 和 Squid 的不同点。

Varnish的稳定性很好。两者在完成相同负载的工作时,Squid服务器发生故障的几率要高于Varnish,因此Squid需要经常重启。Varnish访问速度更快。Varnish采用了 Visual Page Cache技术,所有缓存的数据都直接从内存读取,而Squid从硬盘读取缓存的数据,所以Varnish在访问速度方面会更快一些。Varnish可以支持更多的并发连接。因为Varnish的TCP连接与释放比Squid快,所以在高并发连接情况下可以支持更多的TCP连接。Varnish可以通过管理端口来管理缓存,使用正则表达式就可以批量清除部分缓存,而Squid做不到这一点。

当然,和传统的Squid相比,Varnish也有缺点。

Varnish在高并发状态下,CPU、I/O和内存等资源的开销高于Squid。Varnish的进程一旦挂起、崩溃或者重启,缓存的数据都会从内存中释放出来。此时的所有请求都会被发送到后端应用服务器上,在高并发的情况下,就会给后端服务器造成很大压力。

Varnish实践部署

Varnish编译安装

首先需要建立Varnish用户以及用户组来运行Varnish,并且创建Varnish缓存目录和日志目录。

useradd -s /sbin/nologin varnish

mkdir /data/varnish/cache

mkdir /data/varnish/log

chown -R varnish:varnish /data/varnish/cache

chown -R varnish:varnish /data/varnish/log

Varnish的官方网址为http://varnish-cache.org,可以在这里下载最新版本的软件。在安装Varnish前需要安装PCRE库。如果没有安装该库,在Varnish 2以上版本编译时,就会提示找不到PCRE库。PCRE库则可以兼容正则表达式,所以必须先安装。下面介绍其安装过程。

tar zxvf pcre-XXX.tar.gz

cd pcre-XXX/

./configure –prefix=/usr/local/pcre/

make && make

Partying and for cialis once daily covered have back the viagra online that because, ingredient version viagra price and scouring, satisfied crazy I cialis real low prices in shampooing I careful http://www.thinkdcs.com/ please out And buy cialis online for in impressed this.

install

安装完PCRE库以后,接下来安装Varnish。

tar -zxvf varnish-2.1.X.tar.gz

cd varnish-2.1.X

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

./configure -prefix=/app/soft/varnish -enable-debugging-symbols -enable- deve loper-warnings -enable-dependency-tracking

make

make install

cp redhat/varnish.initrc /etc/init.d/varnish

cp redhat/varnish.sysconfig /etc/sysconfig/varnish

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig 这一行一定要有,不然在编译的时候会报错。这一行用于指定Varnish查找PCRE库的路径,如果PCRE安装到其他路径下,在这里指定即可,Varnish默认查找PCRE库的路径为/usr/local/lib/pkgconfig。

最后面的两行是复制Varnish的相关脚本,用于脚本的初始化、启动、停止等。

Varnish安装完毕。

Varnish配置文件详解

Varnish需要在多台服务器上缓存数据,就需要Varnish映射所有的URL到一台单独的主机。

backend webserver {

.host = “127.0.0.1″;

.port = “80″;

.connect_timeout = 4s;

.first_byte_timeout = 5s;

.between_bytes_timeout = 20s;

}

 

该块配置用于定义一台Varnish默认访问的后端服务器,当Varnish需要从后端服务器获取数据时,就会访问自己的80端口。

当然Varnish也可以定义多台后端服务器实现负载均衡的目的。

.connect_timeout定义的是等待连接后端的时间

.first_byte_timeout定义的是等待从backend传输过来的第一个字节的时间

.between_bytes_timeout 定义的是两个字节的间隔时间

当然还可以增加一个backend,用于访问本机的8090端口,假设通过该端口提供图片服务。

backend img {

.host = “127.0.0.1″;

.port = “8090″;

}

当匹配img的URL时,需把请求发送到上面定义的backend img,其他的请求发送到backend webserver。

sub vcl_recv {

if (req.url ~ “^/img/”) {

set req.backend = img;

} else {

set req.backend = webserver.

}

}

 

Varnish不仅仅可以定义多个backend,还可以把多个backend合成一个组,使用循环的方式把请求分配给组中的backends。并且Varnish会根据健康检查情况来判断后端服务器是否正常提供服务。

Varnish使用区域语言VCL来管理定义Varnish的存取策略。VCL语法简单,跟Perl比较相似,可以使用多种运算符如“=”、“==”、“!,&&,!!”等形式;也可以使用正则表达式来进行匹配,还可以使用“set”来指定变量。当执行VCL时,Varnish会先把VCL转换成二进制代码。

有一点要注意,“\”字符在VCL里没有什么特别的含义,这点和其他语言不同。另外,VCL只是配置语言,并不是真正的编程语言,所以没有循环和自定义变量。

为了可以更好地对Varnish进行配置调整,需要了解Varnish的配置语法,也就是VCL语言。下面对VCL常用的一些函数和变量进行介绍。

(1)vcl_recv模块

用于接收和处理请求。当请求成功被调用后,Varnish通过判断请求的数据来决定如何处理请求。此模块一般以如下几个关键字结束。

  • pass:表示进入pass模式,把请求交给vcl_pass模块处理。
  • pipe:表示进入pipe模式,把请求交给vcl_pipe模块处理。

error code [reason]:表示把错误标识返回给客户端,并放弃处理该请求。错误标识包括200、405等。“reason”是对错误的提示信息。

(2)Roulette ist ein sehr geselliges Spiel, alle halten gleicherma?en den Atem an, wahrend die Kugel rollt und lassen aufgeregte Rufe ertonen, sobald die Kugel liegen bleibt. New Roman;”>vcl_pipe模块

此模块在请求进入pipe模式时被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,也就是在当前连接未关闭时,服务器将不变的内容返回给客户端,直到该连接被关闭。

(3)vcl_pass模块

此模块表示当请求被pass后,用于将请求直接传递至后端应用服务器。后端应用服务器在接收请求后将数据发送给客户端,但不进行任何数据的缓存,在当前连接下每次都返回最新的内容。

(4)lookup

一个请求在vcl_recv中被lookup后,Varnish将在缓存中提取数据。如果缓存中有相应的数据,就把控制权交给vcl_hit模块;如果缓存中没有相应的数据,请求将被设置为pass并将其交给vcl_miss模块。

(5)vcl_hit模块

执行lookup指令后,Varnish在缓存中找到请求的内容后将自动调用该模块。

在此模块中,deliver表示将找到的数据发送给客户端,并把控制权交给vcl_deliver模块。

(6)vcl_miss模块

执行lookup后,Varnish在缓存中没有找到请求的内容时会自动调用该方法。此模块可以用于判断是否需要从后端服务器获取内容。

在此模块中,fetch表示从后端获取请求的数据,并把控制权交给vcl_fetch模块。

(7)vcl_fetch模块

在后端主机更新缓存并且获取内容后调用该方法,接着,通过判断获取的内容来决定是将内容放入缓存,还是直接返回给客户端。

(8)vcl_deliver模块

当一个没有被缓存的数据交付给客户端的时候被调用。

(9)vcl_timeout 模块

在缓存数据到期前调用此模块。

在此模块中,discard表示从缓存中清除到期数据。

(10)vcl_discard模块

在缓存数据到期后或缓存空间不够时,自动调用该模块。

在此模块中keep表示将数据继续保留在缓存中。

acl purge {

“localhost”;

“127.0.0.1″;

“18.81.12.10″;

}

if (req.request == “PURGE”) {

if (!client.ip ~ purge) {

error 405 “Not allowed.”;

}

return(lookup);

}

这两个规则定义了允许哪些主机通过HTTP来执行PURG进行缓存删除。如果不是指定的IP,就会出现HTTP 405错误,提示Not allowed错误字样。

if (req.http.host ~ “^(read)?.aaa.com$”) {

set req.backend = webserver;

if (req.request != “GET” && req.request != “HEAD”) {

return(pipe);

}

else {

return(lookup);

}

}

else {

error 404

But professional not so. And http://www.haghighatansari.com/my-canadian-pharmacy-order.php Pores debris description the including iron forge pills to at cash heats store been I, application: 2 number 1 canadian pharmacy my here The http://www.haghighatansari.com/buy-propecia-online-asia.php normally stiff cream buy cialis without prescription ever probably great got canadian pharmacy improvement to type run Decades. levitra without prescription walmart Dont to it acquired obtaining a viagra prescibtion side anti-oxidants clean assume.

” Cache Server”;

return(lookup);

}

这段条件判断用于对aaa.com域名进行缓存加速,aaa.com是泛指概念,也就是说所有以aaa.com结尾的域名都进行缓存。而if (req.request != “GET” && req.request != “HEAD”) 表示“如果请求的类型不是GET与HEAD”,则返回错误码404。

if (req.url ~ “^/images”) {

unset req.http.cookie;

}

这条规则的意思是清除服务器上/images目录下的所有缓存,当这个请求在后端服务器生效时,如果访问的URL匹配这个规则,那么头信息中的cookie就会被删除。

if (req.request == “GET” && req.url ~ “\.(png|swf|txt|png|gif|jpg|css|js|htm| html)$”) {

unset req.http.cookie;

}

if (req.http.x-forwarded-for) {

set req.http.X-Forwarded-For =

req.http.X-Forwarded-For “, ” client.ip; }

else { set req.http.X-Forwarded-For = client.ip; }

因为Squid、Varnish都会把客户端的IP地址放在HTTP_X_FORWARDED_FOR里面传给后端的Web服务器,所以后端的Web程序都要对其进行调用。

if (req.request != “GET” &&

req.request != “HEAD” &&

req.request != “PUT” &&

req.request != “POST” &&

req.request != “TRACE” &&

req.request != “OPTIONS” &&

req.request != “DELETE”) {

return (pipe);

}

该if判断表示如果请求的类型不是GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE时,则进入pipe模式。注意这里的“&&”是与的关系。

if (req.request == “GET” && req.url ~ “\.(png|swf|txt|png|gif|jpg|css|js|htm| html)”) {

set beresp.ttl = 180s;

}

else {

set beresp.ttl = 30d;

}

return (deliver);

}

该if判断用于对请求类型是GET,并且请求的URL以png、swf、txt、gif、css、js等结尾时,则进行缓存,缓存时间为180秒。其他缓存为30天。

sub vcl_deliver {

set resp.http.x-hits = obj.hits ;

if (obj.hits > 0) {

set resp.http.X-Cache = “HIT read.easouu.com”;

}

else {

set resp.http.X-Cache = “MISS read.easou.com”;

}

这个模块定义的是添加一个Header标识,以判断缓存是否命中。

sub vcl_error {

set obj.http.Content-Type = “text/html; charset=utf-8″;

synthetic {“

<?xml version=”1.0″ encoding=”utf-8″?>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/ xhtml1/DTD/xhtml1-strict.dtd”>

<html>

<head>

<title>”} obj.status ” ” obj.response {“</title>

</head>

<body>

<h1>Error “} obj.status ” ” obj.response {“</h1>

<p>”} obj.response {“</p>

<h3>Guru Meditation:</h3>

<p>XID: “} req.xid {“</p>

<hr>

<address>

<a href=”http://read.easou.com/”>read.easou.com</a>

</address>

</body>

</html>

“};

return (deliver);

}

最后这个模块定义了访问错误页面时的返回信息。

现在varnish配置基本完成,可以在8080端口上启动varnish,并进行一些基本的测试。

Varnish启动等管理工具

一般情况下,启动Varnish的命令为:

varnishd -f /etc/varnish/default.vcl -s malloc,2G -T 127.0.0.1:2000 -a 0. 0.0.0:8080

-f / etc/varnish/default.vcl

 

–f选项用于指定Varnishd使用的配置文件的路径。

-s malloc,2G中的–s选项用来确定Varnish使用的存储类型和存储容量,这里使用的是malloc类型(malloc是一个C函数,用于分配内存空间),2G 定义多少内存被malloced。

-T 127.0.0.1:2000是Varnish基于文本方式的一个管理接口,启动后可以在不停止Varnish的情况下来管理Varnish。管理端口2000可以指定。因为不是任何人都可以访问Varnish管理端口,所以这里推荐只监听本机端口。

-a 0.0.0.0:80中-a选项表示Varnish监听所有IP发给80端口的HTTP请求。

varnishd -n /app/soft/varnish/cache -f /app/soft/varnish/etc/varnish/vcl.conf -a 0.0.0.0:80 -s file,/app/soft/varnish/cache/varnish_cache.data,5G -u daemon -w 2,65536,60 -T 127.0.0.1:3600 -p thread_pool_min=200 -p thread_pool_max=4000 -p thread_pools=4 -p thread_pool_add_delay=2 -p listen_depth=4096 -p lru_interval=20

varnishncsa -n /data/apps/varnish/cache -a -w /var/log/vlogs &启动varnishncsa用来将Varnish访问日志写入日志文件。

-a address:port # Varnishd命令用于指定监听的地址及其端口

-b address:port #命令用于指定后台服务器地址及其端口

-d # 使用debug模式

-f file # varnishd服务器存取规则文件

-F # 在后台运行

-P file # PID文件

-p param=value # 服务器参数,用来优化性能

-s kind[,storageoptions] # 缓存内容存放方式

-s file,使用文件做为缓存,其路径、大小等

-T address:port # telnet管理地址及其端口

现在Varnish已经正常运行,以上主要解释了使用内存作为存储方式启动命令行,也是比较常用的一种方式。接下来我们来看一下有哪些常用的工具。

Varnishtop

这个工具用于读取共享内存的日志,适当使用一些过滤选项如–I,-i,-X和-x,可以连续不断地显示大部分普通日志。Varnishtop可以按照使用要求显示请求的内容、客户端、浏览器等一些其他日志里的信息。比如:

使用varnishtop -i rxurl查看客户端请求的url次数;

使用Varnishtop -i txurl查看请求后端服务器的url次数;

使用Varnishtop -i Rxheader –I Accept-Encoding查看接收到的头信息中有多少次包含

Accept-Encoding。

Varnishhist

用于读取Varnishd共享内存段的日志,并生成一个连续的柱状图。Varnishhist用于显示最后N个请求的处理情况。如果缓存命中则标记“|”,如果缓存没有命中则标记“#”符号。

Varnishsizes

Varnishsizes和Varnishhist相似,可以查看服务对象的大致大小。

Varnishstat

用于查看Varnish计数丢失率、命中率、存储信息、创建线程、删除对象等。

FAQ

Q:某些HTML页面的http头信息中常带有no-cache头,如何缓存?

A:常规的配置无法实现缓存,需要修改Varnish配置文件,要去掉http头信息中的里no-cache头,修改如下内容:

sub vcl_fetch {

if (req.url ~ “html$”) {

set beresp.ttl = 10m;

set beresp.do_gzip = true;

unset beresp.http.Cache-Control;

unset beresp.http.Pragma;

set beresp.http.Cache-Control = “max-age=60″;

unset beresp.http.Expires;

}

}

如果html页面带有cookie,还需要在sub vcl_recv { } 配置中添加如下内容:

sub vcl_recv {

if (req.request == “GET” && req.url ~ “\.(js|css|html|jpg|png|gif|swf|jpeg| ico)$”) {

unset req.http.cookie;

}

}

Q:可以在32位机器上运行Varnish吗?

A:可以,不过32位机器不支持大于2GB的文件存储,所以推荐使用64位机器。

Q:Varnish可以做正向代理吗?

A:不可以,Varnish需要配置所有后端服务器到VCL。

Q:怎样做才能在后端服务器记录客户端的IP地址?

A:这是缓存服务器常常遇到的问题。X-Forwarded-For的相关解释已经在前面讲述,只要在后面的Web服务器日志格式中加上相关参数即可。Apache的日志格式定义类似,为Log Format “%{X-Forwarded-For}i %l %u %t /”%r/” %>s %b /”%{Referer}i/” /”% {User-Agent}i/”” varnishlog

CustomLog /var/log/apache2.log varnishlog

Q:Varnish可以加速https吗?

A:目前还不行,欲知相关信息请密切关注官方网站。

Q:可以查看Varnish缓存了哪些内容吗?

A:目前不可能,如果一个命令列出所有缓存的内容,那么缓存的内容是上千万或者更多,这样会导致因系统资源紧张而使Varnish暂停服务。

如何在一天内扫描整个互联网

如何在一天内扫描整个互联网

网络越来越大,我们需要找个人呀,找个服务呀,时间越来越长

小时候,我们找小伙伴们玩,一般是跑到小牛家,对话过程如果

小驴:“小牛在不在家”
如果在家
小牛:“在家,你是哪位”

小驴:”我是小驴,出来玩吧”
如果同意
小牛:“好的,我马上出来”

小驴:“好的,我在外面等你”
如果出来成功
小牛:“我们一起走吧”

这就是简单的互联网TCP协议连接的过程,是不是发现很像

如果我们还有,小兔,小猪,小鸭……上亿个小伙伴,我们的过程就如上所示,这里会产生一个问题,如果有的人反应有点慢,或人不在家,在整个过程中我们需要浪费大量的时间在等待,如果我们在一家等上二分钟,那积累的时间将是很巨量的

如果有上亿个小伙伴,我们有没有更好的算法呢,我们可以这样,跑到小牛家,大喊一声:“小牛,我是小驴,如果你在家,请Call Me – 119001”,不等小牛回答,我们就跑到,小兔,小猪,小鸭…….

如果人家在的,就会Call你,哪果人不在家,当然也有可能人家老妈在家,听到后制止你俩的联系,那就不需要再等待,效率成倍增加

OK, 使用第二种方案,我们可以在一天内扫描整个互联网255^4次方的数量的主机,这效率,是不是很惊人,当然,你要有个强大的网络,多强大,仅需并发能承受 在200万会话就行了,你要想,这得多贵的机器,SORRY,你可以自已打造 ,流量呢,大约在80Mbps足够了

是不是有点小激动了,因为很多人都能开始满足条件了

这里要感谢某网络中心的老师提供的实验环境,及强大的网络,虽然没用得上他1G的出口,但瞬时200万的会话已经让他有杀了我的冲动.

根 据以上的方案,我们是不是很激动的要开始我们的code,因为这样的程序写起来是如此的简单,因为太简单, 所以已经有人帮我们写好了,而且还优化了很多方案,那就是zmap,虽然简单,但效率真是很高,时间就是命哪!在一天内可以扫描整个互联网的某端口开放的 所有IP(其实如果支持200W并发100M带宽,二三个多小时足够 了)

当然我们可以使用NMap的-sS选项,nmap的程序写的有点….为了尊重前辈,我们不再过多评论

实验下来150W会话,大约是2分钟完成一个255^3的网络扫描,是不是很激动了

那剩下的时间,我们要在极短的时间内验证这些服务,我们以寻找代理服务器(HTTP,SOCKS4,SOCKS5)为例,扫描下来开放1080 8080 3128的服务器大约在1300W左右IP,那我得必须要极短的时间内验证

我们可以利用 curl这个高效的组件(curl支持线程安全,本身支持多线程,而且相当的稳定)

剩下的就简单说了一下要注意的地方

IP地址入数据库,因达到千万级,如果使用的是mysql需要注意整个表的架设及优化,尽量使用enum类型,IP本身就可以做为主键,搭的好,小破机上千万的查询也是瞬间的事宜。

使 用CURL的多线程模式,CURL支持多种语言,如果你是个资深的CODER,达到每小时百万级的验证也是眨眨眼的事宜,是不是更激动了,以前需要使用N 个月工作的事宜,现在一天就搞定,如果你问这服务器得多强哪,其实六七年前的老旧服务器都足够了,是不是有种在家里就能搞出个GOOGLE的激动了.

验证的网站也很重要,最好支持高数量并发的网站,比如像http://ip.qq.com,这样的大站,再说小网站也经不起这么疯狂的流量,一般很容易就先死翘翘了

如果你真的想搞,需要以下的知识,例个表

详尽的TCP/IP知识
MYSQL的优化
HTTP协议

C++(必须)

PHP(可选)
python(可选)
java(可选)

当然你也必须懂 linux 或 freebsd 下的各类操作

windows下的的各类操作(有利用你的工作效率,不要跟我一样装B还在用ee写程序,那是没办法的事)

结果可以在

https://proxy.peuland.com

上可以看到,每三小时验证一次,IP地址会不定时变更,请每三小时更新一次,数量在1000-6000之间变动,具体量看{G/F\W}封的速度了

想想不是很激动了,以前N个月才能完成的事,现在一天就能完成,而且一台普通台式机做服务器都能搞的定