LINUXQQ狂人时代

Main menu:

Archive for 11月, 2008

LINUX下的SYN攻击防御(转载)

在怀疑有Dos攻击的时候,可以输入

netstat -an | grep -i “服务器ip地址:80″ | awk ‘{print }’| sort | uniq -c | sort -n

这个命令会自动统计Tcp连接各个状态的数量,如果SYN_RECV很高的话,就不能排除有基于tcp协议的ddos攻击的可能,这个时候可以打开tcp_syncookies,输入如下命令
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
如果没有 /proc/sys/net/ipv4/tcp_syncookies说明你的内核不支持,需要重新编译内核
同时 降低syn重试次数

echo 1 > /proc/sys/net/ipv4/tcp_syn_retries
echo 1 > /proc/sys/net/ipv4/tcp_synack_retries
 
加大syn_backlog,以保证用户的访问(消耗内存为代价,设的太高)
echo “2048″ > /proc/sys/net/ipv4/tcp_max_syn_backlog
 
如果还是不行,那么只能交给相应的硬件防火墙了。

#防止SYN攻击 轻量
/sbin/iptables -N syn-flood
/sbin/iptables -A INPUT -p tcp –syn -j syn-flood
/sbin/iptables -I syn-flood -p tcp -m limit –limit 3/s –limit-burst 6 -j RETURN
/sbin/iptables -A syn-flood -j REJECT

#为了防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃
/sbin/iptables -A INPUT -s $INNET -p tcp -m state –state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -i $EXTIF -p tcp –syn -m connlimit –connlimit-above 15 -j DROP
/sbin/iptables -A INPUT -s $INNET -p tcp –syn -m connlimit –connlimit-above 15 -j DROP

#设置icmp阔值 ,并对攻击者记录在案
/sbin/iptables -A INPUT -p icmp -m limit –limit 3/s -j LOG –log-level INFO –log-prefix “ICMP packet IN:”
/sbin/iptables -A INPUT -p icmp -m limit –limit 6/m -j ACCEPT
/sbin/iptables -A INPUT -p icmp -j DROP

# 防止端口扫描
iptables -I INPUT -p icmp –icmp-type echo-request -m state –state NEW -j DROP
#禁止PING

iptables -A INPUT -i eth0 -p tcp –tcp-flags ALL FIN,URG,PSH -j DROP
#标志为FIN,URG,PSH拒绝

iptables -A INPUT -i eth0 -p tcp –tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -i eth0 -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A INPUT -i eth0 -p tcp –tcp-flags ALL ALL -j DROP
iptables -A INPUT -i eth0 -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
iptables -A INPUT -i eth0 -p tcp –tcp-flags ALL NONE -j DROP

(附:218。94。6。179/188两台服务器安装的WEBMIN限定*。181网关连接,密码为:fangzhi790529)
# 防止SYN FLOOD
iptables -N synfoold
iptables -A synfoold -p tcp –syn -m limit –limit 1/s -j RETURN
iptables -A synfoold -p tcp -j REJECT –reject-with tcp-reset
iptables -A INPUT -p tcp -m state –state NEW -j synfoold
# 禁止PING

iptables -N ping
iptables -A ping -p icmp –icmp-type echo-request -m limit –limit 1/second -j RETURN
iptables -A ping -p icmp -j REJECT
iptables -I INPUT -p icmp –icmp-type echo-request -m state –state NEW -j ping
# 端口过滤

#这个script 内容,很适合只允许外面链接特定的 port服务,剩下其余的 port 就拒绝外面主动链接
iptables -A INPUT -i eth0 -p tcp –dport 21 -j ACCEPT
  iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT
  iptables -A INPUT -i eth0 -p tcp –dport 80 -j ACCEPT
  iptables -A INPUT -i eth0 -p tcp –dport 389 -j ACCEPT
  iptables -A INPUT -i eth0 -p tcp –dport 1002 -j ACCEPT
  iptables -A INPUT -i eth0 -p tcp –dport 1720 -j ACCEPT
  iptables -A INPUT -i eth0 -p udp –dport 2121 -j ACCEPT
  iptables -A INPUT -i eth0 -p tcp –dport 3306 -j ACCEPT
  iptables -A INPUT -i eth0 -p tcp –dport 8009 -j ACCEPT
  iptables -A INPUT -i eth0 -p tcp –dport 8080 -j ACCEPT
  iptables -A INPUT -i eth0 -p tcp –dport 8081 -j ACCEPT
  iptables -A INPUT -i eth0 -p tcp –dport 10000 -j ACCEPT
  iptables -A INPUT -i eth0 -m state –state RELATED,ESTABLISHED -j ACCEPT
  iptables -A INPUT -i eth0 -m state –state NEW,INVALID -j DROP

ipdrop
  如果能创建一个特殊的”ipdrop”脚本,其被设计为能方便地插入一个规则来阻塞指定的IP,那么将上面的工作将非常容易。通过该脚本阻塞某个IP将是非常容易的工作,只需要几秒钟就可以实现。而且通过该脚本还可以防止手工加入规则时容易出现的错误。因此阻塞黑客的攻击将变为确定其攻击源地址。然后通过如下命令:

# ipdrop 129.24.8.1 on

IP 129.24.8.1 drop on.
  
ipdrop脚本将立即阻塞129.24.8.1。通过使用该脚本能显著地提高你的防卫能力。下面就是ipdrop脚本的

实现:
The ipdrop bash script
#!/bin/bash
source /usr/local/share/dynfw.sh
args 2 $# “${0} IPADDR {on/off}” “Drops packets to/from IPADDR Good for obnoxious networks/hosts/DoS”
if [ "$2" == "on" ]
   then

#rules will be appended or inserted as normal

APPEND=”-A”
INSERT=”-I”
rec_check ipdrop $1 “$1 already blocked” on
record ipdrop $1
elif [ "$2" == "off" ]
     then

#rules will be deleted instead

APPEND=”-D”
INSERT=”-D”
rec_check ipdrop $1 “$1 not currently blocked”off
unrecord ipdrop $1
     else
      echo “Error: “off” or “on” expected as second argument”
exit 1
   fi

#block outside IP address thats causing problems
#attackers incoming TCP connections will take a minute or so to time out,
#reducing DoS effectiveness.

iptables $INSERT INPUT -s $1 -j DROP
iptables $INSERT OUTPUT -d $1 -j DROP
iptables $INSERT FORWARD -d $1 -j DROP
iptables $INSERT FORWARD -s $1 -j DROP

echo “IP ${1} drop ${2}”
ipdrop:解释
  从上面的脚本源代码中最后四行内容可以看到实际的命令是在防火墙表中插入适当的规则。可以看到$INSERT变量的值取决于在命令行参数中是使用”on”还是”off”模式。当iptables行被执行时特定的规则将被适当的插入或删除。

  现在我们看看这些规则本身的功能,它们能和任何类型的防火墙一起发挥作用,甚至在没有部署防火墙的系统上。需要的条件仅仅是支持iptables的Linux2.4版本的内核。我们阻塞来自恶意IP的攻击数据报(第一条iptables语句),阻塞发向恶意攻击IP的数据报(第二条iptables语句),并且对该IP关闭任意方向的数据转发(最后两条iptables工具)。一旦这些规则发挥作用系统将丢弃满足这些条件的任何数据报。
  
    另外一个需要注意的是:脚本中调用了”rec_check”, “unrecord”, “record”,和”args”。这些都是定义在”dynfw.sh”中的特殊的bash函数。”record”函数实现将被阻塞的IP记录在文件/root下隐藏文件dynfw-tcplimit中,而”unrecord”则是将其从文件/root下隐藏文件dynfw-tcplimit中去除。”rec_check”函数是在发现试图重新阻塞某个已经阻塞的IP地址或取消某个没有被阻塞的IP地址时输出错误信息并停止脚本执行。”args”函数实现确保命令行参数的正确性,并实现打印脚本帮助命令。文件dynfw-1.0.tar.gz包含所有的这些工具。
 
 
tcplimit
  如果你需要对某个特殊的基于TCP的网络服务的使用进行限制(例如在端系统上产生严重负载时),则tcplimit脚本则可以帮助你达到这个目的,该脚本使用TCP端口、一个率值和”on”或”off”作为参数:
# tcplimit 873 5 minute on
Port 873 new connection limit (5/minute, burst=5) on.
  
    tcplimit使用iptables的”state”模块(应确保在内核中打开该选项或加载模块)来实现在某段时间内只允许特定数目的连接请求通过。在本例中防火墙将限制每分钟只允许5个新连接到我的rsync服务器(port 873)。当然你可以根据需要选择时间单位为秒钟/分钟/小时。
  
    tcplimit提供了一个限制对非关键服务的使用的非常好的方法-这样大量到非关键服务的数据不会破坏服务器。在上面的例子中使用tcplimit来设置使用rsync的限制,以防止tsync数据占用了Internet连接的所有带宽。其中连接服务限制信息记录在文件/root下隐藏文件dynfw-tcplimit中。若想关闭该限制只需要键入如下命令:
# tcplimit 873 5 minute off
Port 873 new connection limit off.
  
    tcplimit通过在”filter”表中创建一个新的规则链来实现。这个新的规则链将拒绝所有超过指定限制的数据报,同时将一个规则插入到INPUT规则链中,其将所有的到目标端口(在本例中是873端口)的新连接数据报定向到这个新的规则链。新规则链只会影响新的超过限制的连接而不会影响已经建立的连接。
  
   当tcplimit定义的规则被关闭,INPUT规则和新规则链则会被删除。象ipdrop一样其tcplimit可以和任何类型的防火墙一起工作。
 
host-tcplimit
  host-tcplimit和tcplimit非常类似,但是它是限制来自一个特定的IP的到服务器上某个特定端口的TCP连接数量。host-tcplimit在防止某个特定的人滥用你的网络资源时非常有用处。例如你维护有一个CVS服务器,有一天突然发现一个特殊的新开发者出现了,他好像建立了一个脚本每十分钟更新它的资源。占用了大量的网络资源。
  
   对于这种情况,使用host-tcplimit可以非常容易的解决问题:
 
# host-tcplimit 1.1.1.1 2401 1 day on
  
现在IP地址为1.1.1.1被限制为每天只能进行一次CVS连接从而节省了网络带宽。

phpmyadmin 登录就退出的问题!

phpmyadmin登录就自动退出,基本上就两种问题,服务器的session没开启,还一个致命看下系统时间对不对,还有自己电脑的系统的时间对不对,曾经的我在第二个问题上徘徊了很久!就此写下经验,以备后人使用!

LINUXQQ狂人

apache的跳转和转发(转载)

apache的跳转和转发
weblogic中加默认用户和密码
startWebLogic.sh
-Dweblogic.management.username=weblogic -Dweblogic.management.password=weblogic

apache中设置代理:
NameVirtualHost 10。88。3。7:80
<VirtualHost 10。88。3。7:80 >
ServerAdmin abc@123.com
ServerName 10.88.3.7
ErrorLog logs/rsa-error.log
CustomLog logs/rsa-access.log common
ProxyPass / http://10.88.3.5:7001
ProxyPassReverse / http://10.88.3.5:7001
</VirtualHost>
本来我可以访问http://10.88.3.5:7001/zhcxxt
我现在访问http://10.88.3.7/zhcxxt就可以了

apache中设置跳转:
修改httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so   
RewriteEngine On
RewriteRule ^/(.*) http://www.csdn.net/ [R,L]   
#无论http://localhost/XXX中XXX有多长都转到CSDN.net

RewriteRule ^/$ http://www.csdn.net/ [R,L]   
#只有当输入http://localhost时跳转,输入http://localhsot/index.html时不跳转.

RewriteRule ^/(.*) http://www.csdn.net/$1 [R,L]   
#当输入http://localhost/mm/index.htm 时转到http://www.csdn.net/mm/index.htm
========================

apache_plugin:

apache和weblogic放在不同的机器上,动态生成的页面发到weblogic上去。
配置方法:

在每一台机器的apache配置文件中httpd.conf加入:

ServerName 10.88.3.7:80(apache服务器的IP和端口)

LoadModule weblogic_module modules/mod_wl_20.so

<IfModule mod_weblogic.c>
WeblogicHost <填写weblogic主机名或IP地址>
WeblogicPort <weblogic服务端口>
</IfModule>

<Location />
SetHandler weblogic-handler
</Location>

例:
LoadModule weblogic_module modules/mod_wl_20.so

<IfModule mod_weblogic.c>
WeblogicHost zhcxa.tj
WeblogicPort 7001
</IfModule>

<Location />
SetHandler weblogic-handler
</Location>

4.7版本n(n>1)级域名自动生成并绑定的说明

4.7版本的子店n(n>2)级域名自动生成并绑定的功能要达到以下效果
[attach]5170[/attach]

将以上对子店的访问形式,改写为
[attach]5171[/attach]

4.7多店中子店的n级域名绑定的原理是使用apache强大的url rewrite功能实现的,有关url rewrite的详细说明请看apache的手册。

apache的url rewrite是基于正则表达式的,所以看这篇文章前最好对正则表达式有个印象

一、启用该功能的要求

1.必须是apache服务器

2.apache必须已经打开mod_rewrite
[attach]5165[/attach]

如果windows下在httpd.conf中将附图上这行的注释符去掉就行了
[attach]5167[/attach]

如果您是*nix下编译安装,可以参考这个编译参数,这样会把重写模块编译进apache核心中,加快处理速度
./configure \
–prefix=/usr/local/apache \
–with-mpm=prefork \
–enable-so \
–enable-rewrite=static \
–enable-track-vars

3.网站的域名必须做泛解析,就是让*.site.com都能指向的您服务器

本地测试可以修改hosts文件,模拟泛解析
[attach]5168[/attach]

二、配置过程:

1.配置apache的重写表,重写表保存有n级域名和子店实际物理地址的映射关系。

在include/mall_config.php中
$RewriteMap_Url=”rmap/vhost.map”;
设置apache重写表的保存地址,它的位置是相对与syssite目录。
重写表的格式如下
n级域名 子店的实际物理地址
样例:

shop1.www.xuni.com D:/Server/wwwroot/shopexm47/syssite/home/shop/00/00/01

它的内容将会由ShopEx的注册程序在子店开通时生成。

由于这个文件保存有网站的物理地址,务必请将它设置为一个不容易猜测的目录。
[attach]5166[/attach]

2.在apache的配置文件httpd.conf中启用rewrite map功能

打开apache的配置文件httpd.conf在末尾添加以下配置信息

*nix系统的内容如下

RewriteLog          logs/rewrite.log
RewriteLogLevel     0
RewriteEngine       on
RewriteMap          lowercase int:tolower
RewriteMap          vhost txt:/var/www/html/syssite/vhost.map
RewriteCond         ${lowercase:%{HTTP_HOST}|NONE} ^(.+)$
RewriteCond         ${vhost:%1} ^(/.*)$
RewriteRule         ^/(.*)$ %1/$1 [E=VHOST:${lowercase:%{HTTP_HOST}}]

windows系统的内容如下

RewriteLog          logs/rewrite.log
RewriteLogLevel     0
RewriteEngine       on
RewriteMap          lowercase int:tolower
RewriteMap          vhost txt:D:/Server/wwwroot/shopexm47/syssite/rmap/vhost.map
RewriteCond         ${lowercase:%{HTTP_HOST}|NONE} ^(.+)$
RewriteCond         ${vhost:%1} ^(D:/.*)$
RewriteRule         ^/(.*)$ %1/$1 [E=VHOST:${lowercase:%{HTTP_HOST}}]
[attach]5169[/attach]

附图中的

RewriteLogLevel     5

是用于调试用的,这样可以在logs/rewrite.log中看到形如:

127.0.0.1 - - [10/May/2007:11:33:42 +0800] [shop1.www.xuni.com/sid#2cc240][rid#5934a80/initial] (4) RewriteCond: input=’shop1.www.xuni.com‘ pattern=’^(.+)$’ => matched
127.0.0.1 - - [10/May/2007:11:33:42 +0800] [shop1.www.xuni.com/sid#2cc240][rid#5934a80/initial] (5) map lookup OK: map=vhost[txt] key=shop1.www.xuni.com -> val=D:/Server/wwwroot/shopexm47/syssitehome/shop/00/00/01
127.0.0.1 - - [10/May/2007:11:33:42 +0800] [shop1.www.xuni.com/sid#2cc240][rid#5934a80/initial] (4) RewriteCond: input=’D:/Server/wwwroot/shopexm47/syssitehome/shop/00/00/01′ pattern=’^(D:/.*)$’ => matched
127.0.0.1 - - [10/May/2007:11:33:42 +0800] [shop1.www.xuni.com/sid#2cc240][rid#5934a80/initial] (2) rewrite ‘/index.php’ -> ‘D:/Server/wwwroot/shopexm47/syssitehome/shop/00/00/01/index.php’

以上的log片段就是一个rewrite的过程。

设为5是用于调试的,实际使用环境下务必将RewriteLogLevel 设置为0,否则rewrite的log很快将您的磁盘撑爆!

要点:

1.正则^(.+)$ 要和vhost.map的第一部分匹配,在这个例子中^(.+)$是可以匹配shop1.www.xuni.com

2.正则^(D:/.*)$要和vhost.map的第二部分匹配,在这个例子中^(D:/.*)$是可以匹配D:/Server/wwwroot/shopexm47/syssite/home/shop/00/00/01的

3.vhost.map的地址要用*nix like的格式,就是要用/表示目录,而不是windows的\

所以win的主机要用
RewriteCond         ${vhost:%1} ^(D:/.*)$
把盘符D:加入到正则中,如果您的web文件不是放在D盘而是E盘,要把D:改为E:。
而*nix没有盘符,所以用
RewriteCond         ${vhost:%1} ^(/.*)$

4.这段配置信息的位置,一般放在httpd.conf的末尾。但是如果您的总站是用VirtualHost进行绑定,请将以上的配置信息放在在VirtualHost的段中。

样例:
<VirtualHost 10.1.2.3>
    DocumentRoot    /www/docs/host.foo.com
    ServerName   host.foo.com
    ErrorLog   logs/host.foo.com-error_log
    TransferLog   logs/host.foo.com-access_log

    RewriteLog          logs/rewrite.log
    RewriteLogLevel     0
    RewriteEngine       on
    RewriteMap          lowercase int:tolower
    RewriteMap          vhost txt:/var/www/html/syssite/vhost.map
    RewriteCond         ${lowercase:%{HTTP_HOST}|NONE} ^(.+)$
    RewriteCond         ${vhost:%1} ^(/.*)$
    RewriteRule         ^/(.*)$ %1/$1 [E=VHOST:${lowercase:%{HTTP_HOST}}]
</VirtualHost>

三、网店后台配置说明

前缀+商品ID方式    shop     shopxxx.mysite.com
申请的商店用户名方式   username.mysite.com    (中文名会有问题)

四、参考资料:

1.rewrite map的路径问题:   http://www.webmasterworld.com/apache/3239775.htm

2.简易正则表达式文档:       http://www.w3pop.com/sucai/regular_expression/regular_expression.htm#reference

Win的主机的Server变量有点不一样,需要替换syssite目录下的register_act.php文件,否则生成
rewrite map有问题!

关键的配置在这里:一是要打开Httpd.comf中的
LoadModule rewrite_module modules/mod_rewrite.so   
RewriteEngine On
<VirtualHost 192.168.0.52:80> //这个是你原来的虚拟主机
   AddDefaultCharset GB2312
   ServerAdmin *@*.*
   ServerName www.a.com
   DirectoryIndex index.htm index.html index.jsp
   ErrorLog logs/*.net-error_log
   CustomLog logs/*.net-access_log common
   RewriteEngine     on
   RewriteLog           logs/rewrite.log
   RewriteRule       ^/$ http://www.b.com/$1 [R=301,L] //这里设置转向

   </VirtualHost>

apache的404错误自定义跳转说明

404错误其实就是我们经常见到的找不到文件的错误,但是那是默认的效果,很难看。

有时候我们需要的这样的功能:我们要记录下来404是的页面时哪些,更有些时候我需要判断404页面是不是本来系统应该生成的静态页面但是没有生成成功的,如果是,我们应该生成这个静态页面,然后把生成的静态页面返回给用户。

我要处理的逻辑就是:把404错误跳转到一个页面,我们取名叫:missing404.php

然后再这个页面中实现我们需要的功能。

首先定义跳转:在虚拟站点定义中使用如下语句即可。

ErrorDocument 404 http://www.blogguy.cn/missing404.php

 

定义完成后的虚拟站点如下

<VirtualHost *:80>

     ServerAdmin     wayswang@gmail.com

      DocumentRoot /usr/local/apache/htdocs/blogguy.cn

      ServerName www.blogguy.cn

      ServerAlias     blogguy.cn

      ErrorLog logs/blogguy.cn_err_log

      CustomLog logs/blogguy.cn-access_log2 common

      ErrorDocument 404 http://www.blogguy.cn/missing404.php

     <IfModule mod_limitipconn.c>

      <Location /upimg/soft>

         MaxConnPerIP 5

     </Location>

      </IfModule>

</VirtualHost>

在missing404.php中的处理将另外说明

这里再提供另外一种方法,但是不推荐,以为比较耗资源,使用 .htaccess 来重定向

在 .htaccess 中加入

ErrorDocument 404 /404.html

不要以为就此完了,你可能会发现404.html根本跳转不到他上面去,嘿嘿,原因是你的404.html文件太小了,IE认为找不到,又是404错误。如果404.html的小于512字节的话,那么IE会认为这个错误页面不够“友好”,会忽视掉的。

我想过!

我想过,我该改变现状.很多地方令我不满. 情感是让我最头疼的,我想忘掉这些,去做我喜欢的事情,离开这座城市可能比较好.