分类 linux 下的文章

使用python模拟网站登录和识别验证码

我们有几个产品访问量比较大,所用的短信和voip服务消耗非常快,为了不影响业务,老大要求运维每天要检查供应商的余额并登记,账号有十几个,查起来非常烦。听说真正的geek重复两遍以上的操作都会写脚本完成,我这个小菜鸟也不自量力一下,写个脚本模拟账号登录和查额,验证码识别等,这篇博客做个备忘,人生苦短,当然用python啦!

比较难搞定的是验证码识别,用的是pytesseract,默认没有training对验证码识别不高,但好在验证码比较简单,写个循环一直拿验证码,直到识别出来:

#!/usr/bin/env python 
# -*- coding: UTF-8 -*-

import pytesseract
from PIL import Image,ImageFile,ImageEnhance
ImageFile.LOAD_TRUNCATED_IMAGES = True
'''
Dependencies List :
   1: yum install tesseract tesseract-devel -y
   2: yum install libjpeg libjpeg-devel -y
   3: pip install requests
   4: pip install pytesseract
   5: pip install pillow
   6: pip install tesseract-ocr
 '''
 
def get_captcha(self):

    api_captcha = 'http://sms.nixops.me/main/GetCode.asp'
    get_headers = {

            'Host' : 'sms.nixops.me',
            'Cache-Control':'max-age=0',
            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Upgrade-Insecure-Requests' : '1',
            'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36',
            'Referer': 'http://sms.nixops.me/index.asp',
            'Accept-Encoding' : 'gzip, deflate,sdch',
            'Accept-Language ' : 'zh-CN,zh;q=0.8',
            'Connection': 'close',

    }

    while True:
        r = requests.get(api_captcha,timeout=5,headers=get_headers)
        with open('captcha.jpg','wb') as f:
            for chunk in r.iter_content(1024):
                f.write(chunk)

        img = Image.open('captcha.jpg')
        text = pytesseract.image_to_string(img)
        text = text.strip()
        #确保识别到的是4位数字
        if len(text) == 4:
            try:
                int(text)
            except:
                pass
            else:
                break

    return text,r.cookies
    

识别到验证码会返回识别结果和cookies,用这个cookies和验证码一起登录才行,否则就会报验证码不符。登录是使用requests库,好处是不用手动处理cookies,非常简单:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__='will@nixops.me'
import requests
''' pip install requests'''

def login(self):

    start = requests.session()
    login = start.post(url_login,data=postdata,headers=post_headers,cookies=post_cookies,params=url_params)
    
    while True :
        start = requests.session()
        login = start.post(api_login,data=postdata,params=url_params,headers=post_headers,cookies=get_data[1])
        #判断登录是否拿到登录后的cookies,确保登录成功
        if len(start.cookies) == 7:
            return start.cookies
            break

    bal = start.get(api_balance)
.....

总的来说,还是非常简单的,完整代码就不贴了

bash记录所有用户的历史记录

bash是多数Linux发行版默认的shell,虽然不及zsh好用,但比其它的shell好太多。
我们的生产服务器很多,没有用跳板机,又是多人共用root用户,为了审计用户操作,需要记录执行命令的用户、时间和ip等信息。本文之所以要优化,主要是因为bash默认配置存在以下几点不足:

  1. 历史记录保存数目有限,默认1000条
  2. 记录不详细,不记录命令执行时间/执行用户名/用户ip等
  3. 历史记录会丢失,主要有两种情况: 1. bash异常退出 2.同一用户多处登录或开了多个会话,只会记录最后退出的会话历史

上面这三点不足,都可以通过调整bashrc的参数解决,怎么做就不说了。服务器这么多,如何用最省事方法解决才是关键。我采用的是用syslog记录bash历史命令

一、常规配置syslog做法

1.1 配置全局bash历史记录格式
编辑/etc/bashrc(centos)或/etc/bash.bashrc(debian),增加:

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(who am i) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

1.2 配置rsyslog
新增文件/etc/rsyslog.d/bash.conf,内容:

local6.*    /var/log/bash_history.log

重启rsyslog :

service rsyslog restart

1.3 配置日志分割
虽然bash历史记录不会占用太多空间,但为了方便查看还是用logrotate分割一下。,按天切分日志,新建文件/opt/logrotate_bash.conf,内容:

/var/log/bash_history.log
  {
   sharedscripts
   postrotate
   /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
  endscript
}

添加定时任务:

59 23 *  *  * root /usr/sbin/logrotate -f /opt/logrotate_bash.conf

如果不介意两天的日志混在一起,可以直接将/var/log/bash_history.log加入/etc/logrotate.d/syslog中即可。

二、使用logger命令记录到syslog

服务器这么多,这样配置有些麻烦,能不能更简单一点,答案是可以的。logger命令是一个shell接口,可以通过它使用Syslog日志系统。直接编辑/etc/profile文件,在最后加入:

    function log2syslog
    {
export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`] "
export PROMPT_COMMAND='\
  if [ -z "$OLD_PWD" ];then
        export OLD_PWD=$(pwd);
  fi;
  if [ ! -z "$LAST_CMD" ] && [ "$(history 1)" != "$LAST_CMD" ]; then
        logger  `whoami`_shell_cmd "[$OLD_PWD]$(history 1)";
  fi ;
  export LAST_CMD="$(history 1)";
  export OLD_PWD=$(pwd);'
}    
trap log2syslog DEBUG

即可将bash的历史记录打入/var/log/message中,同时系统会自动切割,查看命令只需grep一下shell_cmd即可,美中不足是cronjob不是每天0点执行,所以日志不是按天分割,两天的日志会混在一起

三、直接打到指定文件

bash命令即使记录时间非常久也很小,不需要切割;同时为方便查看,不想bash历史日志和message日志混在一起,所以需要单独打到一个文件中。只需按第二种做法稍稍改变一下即可,同样编辑/etc/profile文件,在最后加入:

    function log2file
    {
export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`] "
export PROMPT_COMMAND='\
  if [ -z "$OLD_PWD" ];then
        export OLD_PWD=$(pwd);
  fi;
  if [ ! -z "$LAST_CMD" ] && [ "$(history 1)" != "$LAST_CMD" ]; then
        echo  `whoami`_shell_cmd "[$OLD_PWD]$(history 1)" >>/var/log/bash_history.log;
  fi ;
  export LAST_CMD="$(history 1)";
  export OLD_PWD=$(pwd);'
}    
trap log2file DEBUG

将logger命令改成echo,即可将bash历史记录打到/var/log/bash_history.log

四、三种做法的效果

正常做法,使用syslog,日志输出到/var/log/bash_history.log ,格式:

Feb 20 01:44:07 Centos-Test root: root     pts/2        2016-02-20 01:44 (will-pc.nixops.me) [17983]: ps -ef [0]

第二种方法,通过logger使用syslog,日志输出到/var/log/messages,格式:

Feb 20 01:37:44 Centos-Test root: root_shell_cmd [/etc/rsyslog.d] 1179  [2016-02-20 01:37:44] [will-pc.nixops.me] ps -ef

第三种方法,不用syslog直接打到文件,日志输出到/var/log/bash_history.log,格式:

    root_shell_cmd [/root]   76  [2016-03-27 07:27:41] [10.11.15.41] vim /var/log/messages

参考文章:

https://www.ttlsa.com/linux/history-record-in-message-log/
http://askubuntu.com/questions/93566/how-to-log-all-bash-commands-by-all-users-on-a-server

在防火墙或代理后端的fail2ban配置

一、遇到的问题

防火墙、反向代理或者负载均衡这些设备,为了提供服务,会安装在用户和服务器之间,作为中间人转发用户的流量给服务器。服务器只与这些设备通信,在不经过配置的情况下拿不到客户的真实ip,导致无法通过iptables限制ip访问,同时其他需要客户真实ip的服务也会受到影响。

二、解决方法

对于7层的http服务来说,防火墙/代理通过设置X-Forwarded-For参数,可以将用户的ip转给后端web服务器。对于恶意的攻击流量,通过iptables匹配字符串功能,将包含X-Forwarded-For:ip的流量丢掉,从而达到限制ip访问的目的

屏蔽规则:

iptables -I  INPUT 1 -p tcp --dport 80 -m string --algo bm --string 'X-Forwarded-For: <ip>' -j DROP

解除屏蔽:

iptables -D  INPUT -p tcp --dport 80 -m string --algo bm --string 'X-Forwarded-For: <ip>' -j DROP

有了这两个规则,就可以用fail2ban来检测恶意流量了。
对于4层的应用,能不能简单的通过配置让后端拿到客户的真实ip?答案是不能,目前没有4层的tcp代理能实现保持源ip的功能,至少开源的软件中没有
能不能实现?答案是可以,需要tcp代理在转发流量时更改ip报头,要自己编程写,这里只说7层的情况

三、配置方法

3.1 配置防火墙、反向代理、负载均衡

增加http头:X-Forwarded-For,基本上这类软件都都支持,配置方法要看所用的软件

3.2 安装配置fail2ban

fail2ban安装、配置filer和jail:
见:https://opswill.com/articles/nginx-anti-ddos-setting-2.html
根据上面的两条iptables规则,新建fail2ban的action,参考自带的iptables规则文件,改一下:

[INCLUDES]

before = iptables-blocktype.conf

[Definition]

actionstart = iptables -N fail2ban-<name>
          iptables -A fail2ban-<name> -j RETURN
          iptables -I <chain> -p <protocol> --dport <port> -j fail2ban-<name>

actionstop = iptables -D <chain> -p <protocol> --dport <port> -j fail2ban-<name>
         iptables -F fail2ban-<name>
         iptables -X fail2ban-<name>

actioncheck = iptables -n -L <chain> | grep -q 'fail2ban-<name>[ \t]'

actionban = iptables -I fail2ban-<name> 1 -p tcp --dport 80 -m string --algo bm --string 'X-Forwarded-For: <ip>' -j DROP

actionunban = iptables -D fail2ban-<name> -p tcp --dport 80 -m string --algo bm --string 'X-Forwarded-For: <ip>' -j DROP

[Init]
name = default
port = http
protocol = tcp
chain = INPUT

保存为action.d/iptables-proxy.conf

jail的配置文件中指定action:

[iptables-proxy]
enabled = true
filter = iptables-proxy-filter
action = iptables-proxy[name = iptables-proxy , port = http, protocol = tcp]
port = http
logpath = /path/to/your/log
maxretry = 5
findtime = 60
bantime = 3600

上面的配置按照实际情况修改,fail2ban的用法不多说了,主要就是action文件

参考文章:
http://centos.tips/fail2ban-behind-a-proxyload-balancer/

mysql数据删除与磁盘空间释放

一、立即释放磁盘空间

以下操作会在删除数据后立即释放磁盘空间:

  1. drop table table_name
  2. truncate table table_name
  3. delete from table_name (MyISAM )

二、不立即释放磁盘空间

以下操作删除数据后不立即释放磁盘空间:

  1. delete from table_name where xxx
  2. delete from table_name (InnoDB)

三、强制释放磁盘空间

delete from table_name (InnoDB) 只是将删除的数据标记为已删除,并不真正释放所占用的磁盘空间,这是mysql的bug: mysql bug;想delete操作后立即释放磁盘空间,还要看mysql数据库的配置:

  1. innodb_file_per_table=off (默认配置)
    所有数据都保存在ibdata中,磁盘空间只能通过备份/还原数据库来释放;
  2. innodb_file_per_table=on
    delete操作后可以通过执行optimize table table_name释放空间

参考文章
http://blog.csdn.net/seven_3306/article/details/30254299
https://www.percona.com/blog/2013/09/25/how-to-reclaim-space-in-innodb-when-innodb_file_per_table-is-on/
https://dev.mysql.com/doc/refman/5.5/en/innodb-truncate-table-reclaim-space.html

centos下制作RPM包并签名

一、准备制作环境

我系统是centos 6.6 64位,rpmdevtools 版本为7.5,rpm-build版本为4.8,本文以制作openresty-1.9.7.1的rpm包为例。

1.1 安装打包工具

制作rpm包主要用到rpmbuild工具,rpmdevtools套件包含了rpmbuild等软件,同时又提供了很多有用的脚本,安装:

 yum install rpmdevtools

spec配置检查工具:

yum install rpmlint

查看下rpmbuild的版本:

rpmbuild --version
RPM version 4.8.0

1.2 新建用户

rpm包在打包过程中,会将文件临时安装到系统中,为了保证构建程序不破坏系统,要使用普通用户打包:

useradd rpmuser
su - rpmuser

1.3 初始化打包环境

rpmdev-setuptree是rpmdevtools中带的初始化环境脚本,执行后会在用户主目录下创建rpmbuild目录和.rpmmacros文件,同时生成所需的子目录和默认的控制参数,执行:

rpmdev-setuptree

生成的目录结构:

rpmbuild/
    ├── BUILD   #打包过程中的工作目录
    ├── RPMS    #RPM包存放目录
    ├── SOURCES #源码和补丁目录
    ├── SPECS    #SPEC文件目录
    └── SRPMS    #src rpm包存放目录

默认的全局控制宏文件.rpmmacros内容:

cat ~/.rpmmacros 
%_topdir      %(echo $HOME)/rpmbuild
%_smp_mflags  -j3
%__arch_install_post   /usr/lib/rpm/check-rpaths   /usr/lib/rpm/check-buildroot

1.4 安装编译软件

制作rpm包要先编译在打二进制包,所以要装gcc、make等工具:

yum install gcc gcc-c++ make

准备环境就结束了

二、制作RPM包

以打包openresty为例

2.1 下载源码包

将源码包和补丁等放入rpmbuild/SOURCE目录:

cd rpmbuild/SOURCE
wget https://openresty.org/download/ngx_openresty-1.9.7.1.tar.gz

2.2 编写SPEC文件

SPEC文件控制整个rpm的打包过程,包含了打包的全部信息和控制参数,可以使用 rpmdev-newspec 命令来创建一个初始的SPEC文件,SPEC文件需放入rpmbuild/SPECS目录:

rpmdev-newspec  ngx_openresty.spec

这个脚本也自带了一些软件的模版,在/etc/rpmdevtools/spectemplate-*。spec文件主要定义了打包过程中的几个阶段的配置:

  1. 信息定义阶段 :定义软件包的名字、版本等信息和打包过程中用到的变量等
  2. 制作准备阶段 :解压源码包、补丁包并打补丁
  3. 编译阶段 :设置编译参数并编译源码
  4. 安装阶段 :定义安装过程所执行的命令,包括安装前、安装后、卸载前、卸载后执行的操作
  5. 清理阶段 :清理打包过程中用到的目录文件等
  6. 文件设置阶段 :要打包的文件和目录,并设置文件权限等

主要就是以上几个阶段,其中用到的宏比较多,看起来容易晕,遇到不明白的可以查最下面的参考文章。
附上ngx_openresty.spec文件:

## 1. 信息定义阶段

### 自定义宏,不是必须
#自定义一个宏名字为nginx_user值为nginx,%{nginx_user}引用 
%define nginx_user nginx    
### 软件名字,要与spec的文件名一致 openresty
Name:           ngx_openresty    
### 软件主版本号,参考下载的源码包      tengine-2.1.1.tar.gz 
Version:        1.9.7.1            
### 发行编号,每打包一次值递增,主版本号发布新版后需重置该值
Release:        4%{?dist}
### 一行简短的软件简介,结尾不要加标点
Summary:        OpenResty  is a full-fledged web platform 
### 安装后所属的组, 通过/usr/share/doc/rpm-4.8.0/GROUPS选择,部分发行版已经废除此标签
Group:          System Environment/Daemons  
### 软件许可
License:        GPLv2  
### 软件项目主页                       
URL:           https://openresty.org/ 
### 放置在SOUIRCES目录的软件源码包名,可以指定多个:source1、source2等
Source0:        %{name}-%{version}.tar.gz   
### 补丁名,也可以写多个 patch1、patch2等 
#patch0:            0.patch 
### 在 install 阶段的测试安装目录,方便写files               
#buildroot:      %_topdir/BUILDROOT         
### 编译过程所需的软件 
BuildRequires:  gcc,make                           
### 安装软件包时所需的依赖包列表,可以指定版本如 bash >= 1.1.1
Requires:       readline-devel,pcre-devel,openssl-devel
### 程序的详细多行描述,每行必须小于等于 80 个字符,空行表示开始新段
%description 
OpenResty is a full-fledged web platform by integrating the standard Nginx core,
LuaJIT, many carefully written Lua libraries, lots of high quality 
3rd-party Nginx modules, and most of their external dependencies. 
It is designed to help developers easily build scalable 
web applications, web services, and dynamic web gateways.
this rpm created by nixops.me 
### 2.准备阶段 

%prep    
### 静默模式解压并进入解压后的目录,也常用:%autosetup -n %{name}                                            
#%autosetup -n %{name}-%{version}.tar.gz
%setup -q        
### 需要打补丁,在这里写打补丁的命令                         
#%patch0 -p1                                       

### 3. 编译阶段

%build 
### 编译参数
./configure \
    --with-luajit \
    --without-http_redis2_module \
    --without-http_xss_module \
    --without-http_memc_module \
    --user=nginx \
    --group=nginx \

#使用多核处理器并行编译 
make %{?_smp_mflags}          
                                   
### 4.安装阶段 

%install 
### 删除之前的残留文件                                
rm -rf %{buildroot}   
### 指定安装目录为虚拟目录         
#gmake install DESTDIR=%{buildroot} 
gmake install DESTDIR=$RPM_BUILD_ROOT
#如果makefile不支持make install DESTDIR=$RPM_BUILD_ROOT,可以手写安装流程,即先建好目标目录,在复制文件
### rpm安装前制行的脚本 
%pre  
### $1==1 代表的是第一次安装,2代表是升级,0代表是卸载 
if [ $1 == 1 ];then     
     /usr/sbin/useradd -r %{nginx_user} 2> /dev/null 
fi 
### 安装后执行的脚本
%post        
###卸载前执行的脚本
%preun       
if [ $1 == 0 ];then 
     /usr/sbin/userdel -r %{nginx_user} 2> /dev/null 
fi 
### 卸载后执行的脚本
%postun 
                         
### 5.清理阶段

%clean 
### 删除buildroot目录
rm -rf %{buildroot} 
                             
###  6.文件设置阶段 

%files  
### 设定默认权限,如果下面没有指定权限,则继承默认
%defattr (-,root,root,0755)    
###要打包的文件和目录,在执行完rpmbuild -bi后,参考%{rootbuild}下生成的文件和目录
/usr/ 
                                   
###  变更日志 格式固定,生成请用命令: rpmdev-bumpspec --comment=COMMENT --userstring=NAME+EMAIL_STRING SPECFILES
%changelog
* Thu Dec 31 2015 will <will@nixops.me> - 1.9.7.1-4
- openresty init

编辑好ngx_openresty.spec文件后检查一下配置是否有错误:

rpmlint ngx_openresty.spec

如果有错误或者警告,使用 "-i" 选项可以查看更详细的信息

2.3 开始打包rpm

rpmbuild命令会根据spec文件来生成rpm包,主要用到以下几个参数:

rpmbuild  --help 
-bp 执行到%prep阶段结束
-bc 执行到%build阶段结束
-bi 执行到%install阶段结束 
-bl 检测%files文件是否有丢失
-ba 创建src.rpm和二进制包 
-bs 只创建src.rpm源码包 
-bb 只创建二进制rpm包 

常用的参数就这几个,其它的自己看man手册,开始打包:

rpmbuild -bp ngx_openresty.spec
rpmbuild -bc ngx_openresty.spec
rpmbuild -bi ngx_openresty.spec
rpmbuild -bl ngx_openresty.spec
rpmbuild -ba ngx_openresty.spec

分阶段测试,方便排错,如果哪个阶段有错误,可以使用--short-circuit跳过之前成功的阶段,节省时间:

rpmbuild -bi --short-circuit  ngx_openresty.spec

我这个spec文件为了省事,没有手写%install过程,导致rpmbuild -bi会报一个RPATH错误,不影响打包,但是要跳过:

QA_RPATHS=$[ 0x0002|0x0010 ] rpmbuild -ba ngx_openresty.spec

到这里就会在RPMS目录和SRPMS目录生产对应的rpm包,用root进行安装测试:

rpm -ivh RPMS/x86_64/ngx_openresty-1.9.7.1-4.el6.x86_64.rpm

默认安装到/usr/local/openresty,测试程序是否正常运行,卸载:

rpm -e ngx_openresty-1.9.7.1-4.el6.x86_64

三、RPM包签名

对rpm包进行签名可以防止软件包被篡改,像epel、remi等公共软件源都会使用签名,签名要用到gnupg软件包,查询是否安装:

rpm -qf `which gpg`

3.1 生成密钥对

此过程要用root执行,使用普通用户会出现错误

gpg --gen-key
Please select what kind of key you want: 默认
What keysize do you want? (2048) 默认
Key is valid for? (0) 默认
is this correct? (y/N) y 
Real name: willis 名字
Email address: willis@nixops.me 邮箱
Comment: GPG-RPM-KEY
hange (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
这步之后会要求输入密码,可以为空

生成密钥对时会使用/dev/random生成的真随机数(通过噪音产生),可能会因熵池不够而阻塞,需要安装rng-tools自动补充熵池:

yum install rng-tools

在 /etc/sysconfig/rngd中添加:

EXTRAOPTIONS="-r /dev/urandom"

启动:

service rngd start

查看熵池大小:

cat /proc/sys/kernel/random/entropy_avail

如果是几十,产生密钥对时就会卡住
将/root/.gnupg 移到 /home/rpmuser,并将权限改为rpmuser:

mv /root/.gnupg /home/rpmuser 
chown rpmuser.rpmuser /home/rpmuser/ -R

切换到rpmuser查看公钥:

 gpg --list-keys

3.2 rpm软件包签名

切换回rpmuser,在~/.rpmmacros中添加:

%_signature gpg
%_gpg_name willis

对rpm软件包签名:

rpm --addsign ngx_openresty-1.9.7.1-4.el6.x86_64.rpm
Enter pass phrase:    gpg密码,这里没有设置
Pass phrase is good.
ngx_openresty-1.9.7.1-4.el6.x86_64.rpm:

在rpmbuild打包时签名:

 rpmbuild --sign --bb ~/rpmbuild/SPECS/ngx_openresty.spec

3.3 验证签名

验证软件包签名要将公钥导入到rpm的数据库中,然后用rpm命令验证,导出公钥:

gpg --export -a willis >GPG-RPM-KEY-nixops

查看当前rpm数据库中已有的公钥:

rpm -q gpg-pubkey-*
gpg-pubkey-c105b9de-4e0fd3a3
gpg-pubkey-0608b895-4bd22942

使用root导入到rpm数据库中:

 rpm --import GPG-RPM-KEY-nixops

在查询一下:

rpm -q gpg-pubkey-*
gpg-pubkey-c105b9de-4e0fd3a3
gpg-pubkey-0608b895-4bd22942
gpg-pubkey-a2bc02d9-56849054

最后一个就是导入的公钥,验证签名:

rpm -K  rpmbuild/RPMS/x86_64/ngx_openresty-1.9.7.1-4.el6.x86_64.rpm 
rpmbuild/RPMS/x86_64/ngx_openresty-1.9.7.1-4.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

验证成功

参考文章:
https://fedoraproject.org/wiki/How_to_create_an_RPM_package/zh-cn
http://laoguang.blog.51cto.com/6013350/1103628
http://www.worldhello.net/2011/04/12/2442.html

用proxychains-ng为程序设置代理

linux下代理一般是通过http_proxy和https_proxy这两个环境变量,但是很多软件并不使用这两个变量,导致流量无法走代理。在不使用vpn的前提下,linux并没有转发所有流量的真全局代理。但是可以用proxychains-ng为程序指定走代理,proxychains-ng是proxychains的加强版,主要有以下功能:

  1. 支持http/https/socks4/socks5
  2. 支持认证
  3. 远端dns查询
  4. 多种代理模式

不足:

  1. 不支持udp/icmp转发
  2. 少部分程序和在后台运行的可能无法代理

一、安装
下载源码:

git clone https://github.com/rofl0r/proxychains-ng

编译和安装:

./configure --prefix=/usr --sysconfdir=/etc
make 
make install
make install-config

二、配置
proxychains-ng的配置非常简单,只需将代理加入[ProxyList]中即可,贴一份配置:

dynamic_chain
chain_len = 1 #round_robin_chain和random_chain使用
proxy_dns 
remote_dns_subnet 224
tcp_read_time_out 15000
tcp_connect_time_out 8000
[ProxyList]
socks5     socks5.nixops.me 1080
socks4     socks4.nixops.me 1081
http     http.nixops.me   3128

proxychains-ng支持多种代理模式:

  • dynamic_chain :动态模式,按照代理列表顺序自动选取可用代理
  • strict_chain :严格模式,严格按照代理列表顺序使用代理,所有代理必须可用
  • round_robin_chain :轮询模式,自动跳过不可用代理
  • random_chain :随机模式,随机使用代理

三、测试

proxychains4 curl ip.cn

四、使用
用法非常简单:


proxychains4 程序 参数

这样用每次都要在命令前输入proxychains4,比较麻烦,可以用proxychains4代理一个shell,在shell中执行的命令就会自动使用代理了,例如:

[root@nixops.me]# proxychains4  -q /bin/bash

可以把上面的命令加入到用户的.bashrc或者.bash_profile中,用户登录后自动代理一个bash shell,这就有点像全局代理了

ssh通过代理连接服务器

网上用ssh隧道来翻墙的教程比较多,通过代理连接ssh的文章相对较少,这种方法适用于网络中防火墙屏蔽了ssh协议,或者其它原因无法通过ssh直连服务器的情况。配置好后ssh流量会通过指定的代理中转,从而突破防火墙的限制,主要用到了ssh client的ProxyCommand选项,需要配合第三方代理软件

一、 SSH over http

Corkscrew是专门为ssh提供http代理的软件,要使用corkscrew需要http代理支持HTTP CONNECT方法,建议使用squid或者ATS这类专业的代理软件,代理不建议设置认证

1.1 Corkscrew安装

下载:

wget http://agroman.net/corkscrew/corkscrew-2.0.tar.gz

编译安装:

./configure
make && make install

1.2 配置

假设我的http代理是proxy.nixops.me,端口是8080;ssh服务器是nixops.me,ssh端口2882,格式:

ssh user@server -o "ProxyCommand corkscrew 代理地址 代理端口 ssh服务器地址 ssh端口 "

测试一下:

ssh -p2882 root@nixops.me -o " ProxyCommand /usr/local/bin/corkscrew  proxy.nixops.me 8080  server.nixops.me 2882 "

正常会弹出ssh输入密码的提示,这时的ssh就是通过http代理连接到服务器的。每次都这样连接比较麻烦,将配置写入ssh_config文件中,配置全局使用http代理:

编辑ssh客户端配置文件 /etc/ssh/ssh_config,加入:

Host *
ProxyCommand corkscrew proxy.nixops.me 8080 %h %p

%h表示目标地址,%p是目标端口。这样配置后,用ssh user@host连接服务器就会通过http代理中转。
非全局配置,可以指定具体的ip:

Host nixops  #别名,可以不设置
Hostname server.nixops.me  #域名或者ip
User root
Port 2862
#IdentityFile 证书路径
ProxyCommand corkscrew proxy.nixops.me 8080  %h %p

使用下面命令连接即可:

ssh nixops

如果ssh配置无密码证书登录,是不是有种ssh跳板机的感觉?

二、ssh over socks

corkscrew不支持socks代理,如果是socks代理要使用nc,或者其它支持socks的软件,配置和上面类似:

ProxyCommand nc -X 5 -x socks5.nixops.me:1080 %h %p

nc非常强大,我的http代理支持CONNECT方法,即能打开https的网站,也可以用nc代替corkscrew:


ProxyCommand nc -X connect -x proxy.nixops.me:8080 %h %p

个人更喜欢用nc,因为各发行版的包管理中都有,使用起比方便。proxycommand 命令相当的灵活,不只是http和socks代理,如果有其它形式的代理,只要有客户端支持都可以用

nginx配置正向http代理

http代理软件非常多,主流的web server也都支持,nginx正向代理功能比较简单,又不支持https,建议使用squid或者ATS这类专业的代理软件,nginx配置http代理比较简单,直接贴配置:

server {
listen 8888;

    access_log  logs/proxy.access.log;
    error_log   logs/proxy.error.log;
           
    location / {
       resolver 8.8.8.8;

       #allow 192.168.1.1; # ip白名单配置
       #allow 127.0.0.1; 
        #deny all; 
       #auth_basic "Auth needed"; #用户名密码认证 
       #auth_basic_user_file /path/passwd; #用htpasswd -c /path/passwd user 命令创建

   
       proxy_redirect off;
       proxy_pass http://$http_host$uri$is_args$args;
       proxy_set_header Host $http_host;
      }
}

测试http代理:

curl  --proxy 127.0.0.1:8888 http://www.nixops.me/

有认证的测试方法:

    curl --proxy 127.0.0.1:8888 --user  aaa:123123  http://www.nixops.me

当然也可以在浏览器中设置http代理测试

nginx代理不支持http CONNECT方法,如果访问https网站,会报错:

curl: (56) Received HTTP code 400 from proxy after CONNECT

最新文章

最近回复

分类

归档

统计

  • 文章总数:168篇
  • 分类总数:5个
  • 评论总数:103条
  • 页面总数:172个
  • 本站运行:4885天

其它