欢迎来到suibing的小站

yum 安装nginx0.8.X php-fpm

[不指定 2010/06/21 21:31 | by suibing ]
Create repo
# cd /etc/yum.repos.d
# vim rusia-repo.repo

- and paste this

[rusia-repo]
name=CentOS-$releasever – rusia packages for $basearch
baseurl=http://centos.alt.ru/repository/centos/5/$basearch/
enabled=1
gpgcheck=0
protect=1




rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/$(uname -m)/epel-release-5-3.noarch.rpm



yum install nginx php-fpm




Linux VPS下简单解决CC攻击

[不指定 2010/06/08 21:34 | by suibing ]
一,准备工作
1,登录进VPS控制面板,准备好随时重启VPS。
2,关闭Web Server先,过高的负载会导致后面的操作很难进行,甚至直接无法登录SSH。
3,以防万一,把设置的Web Server系统启动后自动运行去掉。
(如果已经无法登录进系统,并且重启后负载过高导致刚刚开机就已经无法登录,可联系管理员在母机上封掉VPS的IP或80端口,在母机上用虚拟控制台登录进系统,然后进行2&3的操作,之后解封)

二,找出攻击者IP

1,在网站根目录建立文件ip.php,写入下面的内容。复制内容到剪贴板代码:

<?php
$real_ip = getenv('HTTP_X_FORWARDED_FOR');
if(isset($real_ip)){
        shell_exec("echo $real_ip >> real_ip.txt");
        shell_exec("echo $_SERVER['REMOTE_ADDR'] >> proxy.txt");
}else{
        shell_exec("echo $_SERVER['REMOTE_ADDR'] >> ips.txt");  
}

echo '服务器受到攻击,正在收集攻击源,请在5分钟后访问本站,5分钟内多次访问本站有可能会被当作攻击源封掉IP。谢谢合作!';
?>


2,设置伪静态,将网站下的所有访问都rewrite到ip.php。
Nginx规则:

rewrite (.*) /ip.php;


Lighttpd规则:复制内容到剪贴板代码:
url.rewrite = (
"^/(.+)/?$" => "/ip.php"
)

3,启动Web Server开始收集IP
进行完1和2的设置后,启动Web Server,开始记录IP信息。
收集时间建议为3到5分钟,然后再次关闭Web Server。
real_ip.txt,这个文件中保存的IP有80%以上都相同的,这个IP就是攻击者实施攻击的平台的IP。
proxy.txt,这个文件中保存的是攻击者调用的代理服务器的IP,需要封掉。
ips.txt,这里记录的是未表现出代理服务器特征的IP,根据访问次数判断是否为攻击源。

三,对上一段的补充
如果VPS上启用了WEB日志,可以查看日志文件的增长速度来判断是哪个站点被攻击。
如果没有启用日志,并且站点数量很少,临时启用日志也很方便 。
如果没有启用日志,并且站点数量过多,可以使用临时的Web Server配置文件,不绑定虚拟主机,设置一个默认的站点。然后在ip.php里加入下面一行

shell_exec(“echo $_SERVER['HTTP_HOST'] >> domain.txt”);

domain.txt里将保存被访问过的域名,被CC攻击的站点将在里面占绝大多数。


四,开始封堵IP
建立文件ban.php

<?
$threshold = 10;
$ips = array_count_values(file('ips.txt'));
$ban_num = 0;
foreach($ips as $ip=>$num){
    if($num > $threshold){
                $ip = trim($ip);
                $cmd = "iptables -I INPUT -p tcp --dport 80 -s $ip -j DROP";
        shell_exec($cmd);
        echo "$ip baned!\n";
        $ban_num ++;
        }
}

$proxy_arr = array_unique(file('proxy.txt'));
foreach($proxy_arr as $proxy){
    proxy = trim($proxy);
    $cmd = "iptables -I INPUT -p tcp --dport 80 -s $proxy -j DROP";
    shell_exec($cmd);
    echo "$proxy baned!\n";
    $ban_num ++;
}

echo "total: $ban_num ips\n";
?>

用下面的命令执行脚本(确保php命令在PATH中)复制内容到剪贴板代码:
php ban.php这个脚本依赖于第二段中ips.txt里保存的结果,当其中记录的IP访问次数超过10次,就被当作攻击源给屏蔽掉。如果是代理服务器,则不判断次数直接封掉。
封完IP之后,把所有的网站设置恢复正常,站点可以继续正常运行了。


五,一些细节
为保持对操作过程的描述尽量简洁,没有在上面的内容中加入过多的解释,留在这段统一讲述。
1,关于“代理服务器”的一些本质
两个与TCP&HTTP协议相关的值,REMOTE_ADDR和HTTP_X_FORWARDED_FOR。
(1)REMOTE_ADDR总是取离Web服务器最接近的一台主机的IP,如果没有使用代理,这个值就是访问者本身的IP,如果使用了代理,这个值就是代理服务器的IP,如果通过多个代理服务器进行的连接,这个值就是到达Web服务器前最后一台代理服务器的IP。
REMOTE_ADDR是由TCP/IP层决定的,不能修改不能伪造。
(2)HTTP_X_FORWARDED_FOR,因为这个值是属于HTTP部分,而不是TCP/IP,所以这个值不管是什么,都不影响数据的传输。事实上,一般情况下,如果是访问者直接访问Web服务器,这个值为空;通过透明代理的时候,这个值会被代理服务器设置为访问者的IP;通过匿名代理连接时,这个值可能为代理服务器的IP也可能是空的也有可能是随机的。
HTTP_X_FORWARDED_FOR可以被任意修改。大多数代理服务器都是透明代理,也就是说,会把这个值设置为最原始访问者的IP。

2,关于解决CC攻击的层面问题
按处理效率从高到低排列。
(由于本文是针对VPS服务器所写,而VPS简单来说就是服务器的低端替代品,内存和CPU等资源普遍偏低,当然是处理效率越高越好。)
(1)网络传输层。也就是本文所用的iptables,这个工具本身是工作于系统内核,在建立网络连接时直接把攻击者的连接给否了。在这一层面上将攻击源处理掉后,消耗掉的资源几乎可以忽略不计。
(2)Web Server层,大多数Web Server都可以设置禁止访问的IP。在这一层上解决的意义和上面的差不多,但是效率要差些。
(3)脚本层,从脚本程序上制定适合于本身的策略过滤掉攻击源。网络上有很多流传的在这一层面的解决方案,但是不太适用于VPS,而且设置难度可能要增加几倍或者几十倍。

3,为什么不是从日志收集IP?
主要是考虑两点,一是大多数VPS使用者都因为硬盘空间过小,经常清除日志很麻烦,而直接禁止了日志。
二是如果从日志收集IP,脚本复杂程度要高很多,而且可能要根据情况做些调整,考虑到将要读到本文的人大多数都未必掌握更多的技术,本文的目的就是按部就班的依本文进行操作,即可解决问题。


六,其他
本文版权归www.diahosting.com所有,转载请保留超链接。

这次中美经济对话

中方向美国承诺,将完善国民收入分配格局,逐渐增加居民收入占国民收入的比重。加强社会保障体系建设,改革垄断行业。


  http://cq.people.com.cn/news/2010526/201052693245.htm


  本国人民的福祗却要向美国承诺,我终于明白了谁在代表中国最广大人民群众的根本利益。



------------------------这才是真正的超级囧的冷笑话!!!

CListCtrl控件的使用

[不指定 2010/05/30 15:52 | by suibing ]
初始化:
DWORD dwStyle;
dwStyle = m_bzlist.GetStyle();
dwStyle |= LVS_EX_GRIDLINES |LVS_EX_FULLROWSELECT|LVS_SHOWSELALWAYS ;
m_bzlist.SetExtendedStyle(dwStyle);
m_bzlist.SetBkColor(RGB(0xec,0xf1,0xfd));
m_bzlist.SetTextBkColor(RGB(0xfe,0xFF,0xc6));
插入一列:
m_bzlist.InsertColumn(0,"编号");
m_bzlist.SetColumnWidth(0,50);
插入一行:
方法1:
LV_ITEM lvitem;
lvitem.pszText="";
lvitem.mask=LVIF_TEXT;
lvitem.iSubItem=0;
lvitem.iItem=0;
m_jbxxlist.InsertItem(&lvitem);
m_jbxxlist.SetItemText(0,0,xh);
m_jbxxlist.SetItemText(0,1,xm);
m_jbxxlist.SetItemText(0,2,nj);
方法2:
m_yktlist.InsertItem(i,"2");
m_yktlist.SetItemText(i,0,s);  
m_yktlist.SetItemText(i,1,xh);
m_yktlist.SetItemText(i,2,xm);
读取数据
  resultlist.GetItemText(行数, 列数);
  
每行前有复选框的列表:
初始化时使用LVS_EX_CHECKBOXES属性
DWORD dwStyle;
dwStyle = m_yktlist.GetStyle();
dwStyle |= LVS_EX_GRIDLINES |LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES ;
m_yktlist.SetExtendedStyle(dwStyle);
设置选中:
m_yktlist.SetItemState (行数,0x2000, LVIS_STATEIMAGEMASK);//设为选中状态
判断是否选中:
m_yktlist.GetItemState(行数,LVIS_STATEIMAGEMASK)==0x2000//选中


  
实现点击列头排序:
定义可以排序的列表类
只需要多定义两个变量
class SortCListCtrl : public CListCtrl
{
// Construction
public:
SortCListCtrl();

// Attributes
public:
BOOL m_fAsc;//是否顺序排序
int m_nSortedCol;//当前排序的列
....
}
在使用可以排序列表时 实例化自己的变量
SortCListCtrl m_yktlist;


//响应点击列函数
void CAuditingCertView::OnColumnclickListYkt(NMHDR* pNMHDR, LRESULT* pResult)
{

for (int i = 0; i < m_yktlist.GetItemCount(); ++i)
{
  m_yktlist.SetItemData(i, i);//供排序使用的item编号
}

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

//设置排序方式
if( pNMListView->iSubItem ==m_yktlist.m_nSortedCol )
  m_yktlist.m_fAsc = !m_yktlist.m_fAsc;
else
{
  m_yktlist.m_fAsc = TRUE;
  m_yktlist.m_nSortedCol = pNMListView->iSubItem;
}
//调用排序函数,此函数为CListCtrl定义好的,但是需要调用我们定义的函数才比较任意两个项目的值
m_yktlist.SortItems(MyListCompare, (LPARAM)&m_yktlist);

for ( i = 0; i < m_yktlist.GetItemCount(); ++i){
  m_yktlist.SetItemData(i, i);//供排序使用的item编号
  CString s;
  s.Format("%d",i+1);//编号
  m_yktlist.SetItemText(i,0,s);
  
}
*pResult = 0;
}

///全局函数,比较两个项目的依据
int CALLBACK  MyListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
//通过传递的参数来得到CSortList对象指针,从而得到排序方式
SortCListCtrl * pV=(SortCListCtrl *)lParamSort;
//通过ItemData来确定数据
CString szComp1,szComp2;
int iCompRes;
szComp1=pV->GetItemText(lParam1,pV->m_nSortedCol);
szComp2=pV->GetItemText(lParam2,pV->m_nSortedCol);
switch(pV->m_nSortedCol)
{
case(0):
  //以第一列为根据排序 编号
  iCompRes=atof(szComp1)<=atof(szComp2)?-1:1;
  break;
case(4):
  //以第5列为根据排序 总次数
  iCompRes=atof(szComp1)<=atof(szComp2)?-1:1;
  break;
default:
  iCompRes=szComp1.Compare(szComp2);
  break;
}
//根据当前的排序方式进行调整
if(pV->m_fAsc)
  return iCompRes;
else
  return -iCompRes;


}

导出数据为excel文件
使用ODBC将数据输出到excel数据区  
void ExportAsExcel(CString filename,CListCtrl &resultlist,CWnd * wnd)
{
CDatabase database;
CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动
CString sSql,sExcelFile;
//弹出对话框选择路径
    CFileDialog fileDlg (FALSE, "Path", filename,OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, "*.xls",wnd);
if( fileDlg.DoModal()==IDOK)
{
  sExcelFile = fileDlg.GetPathName();    // 要建立的Excel文件
  CFileFind finder;
  BOOL bWorking = finder.FindFile(sExcelFile);//寻找文件
  if (bWorking)//如果已经存在文件,则删除
  {
   CFile::Remove((LPCTSTR)sExcelFile);
  }

}
else return;

TRY
{
  // 创建进行存取的字符串
  sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriver, sExcelFile, sExcelFile);
  
  // 创建数据库 (既Excel表格文件)
  if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
  {
   CHeaderCtrl* pHeader = resultlist.GetHeaderCtrl();
   //获得行,列的个数
   int nColCount = pHeader->GetItemCount();
   int nLineCount = resultlist.GetItemCount();
   int ColOrderArray[100];
   CString ca[100];
   resultlist.GetColumnOrderArray(ColOrderArray, nColCount);
   //检索各列的信息,确定列标题的内容
   for(int i =0 ; i< nColCount; i++)
   {
    LVCOLUMN lvc;
    char text[100];
    lvc.mask = LVCF_TEXT|LVCF_SUBITEM;
    lvc.pszText = text;
    lvc.cchTextMax = 100;
    resultlist.GetColumn(ColOrderArray[i], &lvc);
    ca[i] = lvc.pszText;      
   }
    
   // 创建表结构
   CString tempsql="(";
   for(i =0 ; i< nColCount-1; i++)
   {
    tempsql+=ca[i];
    tempsql+=" TEXT,";
    
   }
   tempsql+=ca[nColCount-1];
   tempsql+=" TEXT)";
   sSql = "CREATE TABLE Sheet1 ";
   sSql+=tempsql;
   database.ExecuteSQL(sSql);
   //插入数据
   int item_count=resultlist.GetItemCount();
   tempsql="(";
   for(i =0 ; i< nColCount-1; i++)
   {
    tempsql+=ca[i];
    tempsql+=" ,";
    
   }
   tempsql+=ca[nColCount-1];
   tempsql+=")";
   for(int itemnum=0;itemnum    sSql="";
    sSql ="INSERT INTO Sheet1 ";
    sSql+=tempsql;
    sSql+="VALUES ('";
    for(i =0 ; i< nColCount-1; i++)
    {
     sSql+=resultlist.GetItemText(itemnum, i);
     sSql+="','";
    
    }
    sSql+=resultlist.GetItemText(itemnum, nColCount-1);
    sSql+="')";
    database.ExecuteSQL(sSql);
    
   }
  
  
  }      
  
  // 关闭数据库
  database.Close();
  
  AfxMessageBox("Excel文件写入成功!");
}
CATCH_ALL(e)
{
  TRACE1("Excel驱动没有安装: %s",sDriver);
}
END_CATCH_ALL;
}

CListCtrl控件在数据库编程中是用得比较多的控件之一,也是Window控件中较难掌握的一个控件。他可以有四显示方式,在这里只介绍报表方式,因为在数据库开发程序中使用很经常。

  在Report方式中,列表控件的显示方式是有行和列的,行有叫做Item,但有多列是我们只能操作每一行的第零列,也就是最前列。

插入列,使用的是InsertColumn

设置完列后我们就可以设置列表控件的数据了

使用的是InsertItem和setItemText

其中InsertItem用于向列表控件插入一行,并设置第零列的值,如果有多列,该行其他列的值要使用SetItemText来设置数据。

当然最关键的问题是:怎么获取CListCtrl对象的Item数据

我们可以使用这样一个函数GetNextItem(-1,LVNI_ALL | LVNI_SELECTED)来获取当前选中的行(Item)如果该函数还回的值是-1,说明没有行(item)被选中,如果有行被选中,还回的是一个大于等于0的整数值,我们可以通过这个索引值来得到该行的相关列的数据,使用的是GetItemText()函数

int CurSel=m_list.GetNextItem(-1,LVNI_ALL | LVNI_SELECTED);

str=m_list.GetItemText(CurSel,col); 0=
CHeaderCtrl *header=m_List.GetHeaderCtrl();
int iCols=header->GetItemCount();
CString s;
HDITEM hditem;
char Buffer[256]={0};
TRACE("\n");
for(int i=0;i{
hditem.mask=HDI_TEXT;
hditem.cchTextMax=256;
hditem.pszText=Buffer;
header->GetItem(i,&hditem);
s.Format("第%d列 标题:%s\n",i,Buffer);
TRACE(s);

}


删除以下表的内容即可

#


delete from SVI_SC_BASE_DISK_KEYS
where PARENT_ID = (SELECT ID FROM SVI_SIM_CLONE
WHERE (VM_NAME = ‘’))

delete from SVI_SC_PDISK_INFO
where PARENT_ID = (SELECT ID FROM SVI_SIM_CLONE
WHERE (VM_NAME = ‘’))

delete FROM SVI_SIM_CLONE
WHERE (VM_NAME = ‘’)



You cannot provision a linked clone desktop pool  
You see the error:

Desktop Composer Fault: 'Virtual Machine with Input Specification already exists
  
Provisioning a linked clone desktop pool fails with the error:

Virtual machine with Input Specification already exists
  
The Connection Server shows that linked clone virtual machines are stuck in a Deleting state
Resolution
This issue occurs if a table in the database has incorrect data. You must delete the pae-VM object from the ADAM database and from the View Composer database so the tables regenerate properly.
Removing the virtual machine from the ADAM database
Find the virtual machine's GUID stored in ADAM:
Log in to the culprit virtual machine using the VMware Infrastructure (VI) Client Console or directly using Windows RDP.
Open the Windows registry, go to HKEY_LOCAL_MACHINE\SOFTWARE\VMware, Inc.\VMware VDM\Node Manager\Server DN.
Record the cn=.
To delete the pae-VM object from the ADAM database:
Click Start > Programs > ADAM > ADAM ADSI Edit to open the ADAM Active Directory Service Interfaces Editor.
Right-click ADAM ADSI Edit and click Connect to.
Choose Distinguished name (DN) or naming context and type dc=vdi, dc=vmware, dc=int.

Note: For more information about ADSI Edit, see http://technet.microsoft.com/en-us/library/cc773354%28WS.10%29.aspx.
The preceding link was correct as of July 15, 2009. If you find the link is broken, provide feedback and a VMware employee will update the link.


Locate the OU=SERVERS container.
Locate the corresponding virtual machine's GUID (from above) in the list which can be sorted in ascending or descending order, choose Properties and check the pae-DisplayName Attribute to verify the corresponding linked clone virtual machine object.
Delete the pae-VM object.
Removing the linked clone references from the View Composer database
To remove the linked clone references from the View Composer database:

Open SQL Manager > Databases > View Composer database > Tables.
Open dbo.SVI_VM_NAME table and delete the entire row where the virtual machine is referenced under column NAME.
Open dbo.SVI_COMPUTER_NAME table and delete the entire row where the virtual machine is referenced under column NAME.
Open dbo.SVI_SIM_CLONE table, find the virtual machine reference under column VM_NAME and note the ID. If you try to delete this row it complains about other table dependencies.
Open dbo.SVI_SC_PDISK_INFO table and delete the entire row where dbo.SVI_SIM_CLONE ID is referenced under column PARENT_ID.
Open dbo.SVI_SC_BASE_DISK_KEYS table and delete the entire row where dbo.SVI_SIM_CLONE ID is referenced under column PARENT_ID.
If the linked clone was in the process of being deployed when a problem occurred, there may be additional references to the clone left around in the dbo.SVI_TASK_STATE table and dbo.SVI_REQUEST table.
Open dbo.SVI_TASK_STATE table and find the row where dbo.SVI_SIM_CLONE ID is referenced under column SIM_CLONE_ID. Note the REQUEST_ID in that row.
Open dbo.SVI_REQUEST table and delete the entire row where dbo.SVI_TASK_STATE REQUEST_ID is referenced ID.
Delete the entire row from dbo.SVI_TASK_STATE table.
  
In dbo.SVI_SIM_CLONE table, delete the entire row where the virtual machine is referenced.
Remove the virtual machine from Active Directory Users and Computers.
Deleting the virtual machine from VirtualCenter
To delete the virtual machine from VirtualCenter:

Log in to VirtualCenter using the VI Client.
Right-click the linked clone virtual machine and click Delete from Disk.

分页: 1/51 第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]