东东东 陈煜东的博客

标签存档: 代理

wget下载http/https代理设置

如果你的Linux机器是在内网的,需要下载一个文件,在没办法直接访问外网的情况下就需要使用代理了。如果你需要搭建HTTP代理服务器,那么参考Squid搭建正向代理

使用wget命令可以设置http代理

wget http://www.baidu.com/ -e use_proxy=yes -e http_proxy=yourproxy.com:port

下载https的文件就要其他的额外参数了。

wget --no-check-certificate https://www.google.com/   \
 -e use_proxy=yes -e https_proxy=yourproxy.com:port   ##使用https_proxy才可以哟

参数--no-check-certificate可以不检查服务器的证书。

如果你觉得麻烦,可以对shell进行http proxy的代理设置:

export http_porxy=yourproxy.com:port
export https_proxy=yourproxy.com:port

这样其他的程序就可以通过这个代理进行网络访问了。

如果wget不需要代理可以使用参数--no-proxy取消代理。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: wget下载http/https代理设置 – https://www.chenyudong.com/archives/wget-http-proxy-setting.html

分类: Linux 软件

Squid为http代理设置密码权限

touch /etc/squid/squid_passwd
chmod o+r /etc/squid/squid_passwd

#添加用户名和密码
htpasswd -cb /etc/squid/squid_passwd username password  

注意htpasswd是Apache Httpd中的一个应用,我在安装Squid后,发现这个就已经有了。如果没有这个程序的话,需要安装httpd服务器。

yum install httpd
apt-get install apache2

接下来修改squid的配置文件,/etc/squid/squid.conf

在文件的最上方添加下面的配置(总之在acl和http_access之前),我的ncsa_auth是在lib64下的,我是64位的操作系统

auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/squid_passwd

以前这个放在中间的时候,我这里出现了下面的问题:

Can’t use proxy auth because no authentication schemes are fully configured.

在acl那里配置里最后一行加入

acl ncsa_users proxy_auth REQUIRED

在http_access那里最上一行加入

http_access allow ncsa_users

重新启动

/etc/init.d/squid restart
chkconfig squid on  #开机自动启动,自己选择安装

附送一个代理检测网站,如果是高度的匿名代码是不会被检测出来的http://www.iprivacytools.com/proxy-checker-anonymity-test/

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Squid为http代理设置密码权限 – https://www.chenyudong.com/archives/squid-http-proxy-set-password.html

分类: 网络

Linux下ssh动态端口转发

SSH协议是一个非常棒的协议,因为他的存在,在互联网上传输才会的安全。

一般在Linux上,ssh客户端程序都会安装,ssh服务端程序不会安装。如果需要安装自己apt或者yum安装一下。

ssh的端口转发给我们带来了很多方便。比如我们在一个公共的WIFI环境或者局域网中,我们的网络包可以被他们截取,有了ssh的端口转发,他们之间会有一个加密的过程,防止被监听。

另外通过ssh端口转发,我们可以访问一些不能访问的网站。想象一下,你处于一个局域网中、或者学校的网络中,那么你的网络无法访问某些网站,此限制看网络管理员是如何限制的。比如在天朝,你无法访问facebook;再或者有些网站会封锁中国的IP,这些通过ssh的端口转发,就可以轻松的访问到。

ssh端口转发

ssh端口转发

根据图例说明:我们用浏览器访问www.google.com,此时浏览器开启了一个端口15453,但是发现在访问到某个节点,此网络包被丢弃了或者返回了错误的信息,导致我们无法访问www.google.com。但是我们想到了另外的一个方法,因为我们发现我们可以访问proxy.remotehost.com,而且他可以访问google.com,因此我们利用proxy.remotehost.com来做一个跳转。

因此我们利用的ssh的动态端口转发技术来达到这个目的。通过命令,我们在本地开启了一个7070端口,并且将7070端口关联到了proxy.remotehost.com的22号端口上。通过对浏览器设置,将所有的请求都转发到127.0.0.1:7070上,通过ssh的隧道,会将数据包传递到了proxy.remotehost.com:22。proxy服务器会随机开启一个端口去访问google.com。然后将数据在返回给proxy,再返回给浏览器。这就是一个代理转发的一个过程了。

下面我来看看如何具体的操作。

基本的动态端口转发

首先在我们的机器运行一下命令,先开启本机的7070端口到远程的22号端口的连接。

ssh -D 7070 -l username proxy.remotehost.com

参数说明:

  • -D 7070 -D [bind_address:]port D参数说明我们开启一个本地的端口转发。通过在本地分配一个socket去监听端口。只要有连接请求到这个port上来时,这个连接就会被安全通过给转发出去,应用程序的协议将有远程机器来决定连接到哪里。目前支持SOCKS4SOCKS5协议,ssh会扮演一个SOCKS5服务器。另外只有root用于才能转发原始端口。
  • -l username 小写字母l参数指定了登录ssh服务器的用户名
  • proxy.remotehost.com 指定了我们需要登录的远程ssh服务器。默认使用ssh程序的指定端口,一般是22号端口,除非系统做了修改

通过这一个命令,再配合一下浏览器的设置,我们就能访问被封锁的网站了。但是不能太高兴了,还是有些问题的。

帐号一登录成功就被退出了?

我的帐号在输入密码成功后,就被强制退出了,这样不就不能进行动态端口转发了吗?

其实这情况很容易解决,因为你的帐号被远程服务器做了手脚了,ssh服务器禁止这个帐号登录请求shell终端了,不能执行远程命令。目的是防止你登录他的系统进行命令的操作。一般专门用于代理的帐号都做了这个限制。

这个时候我们就需要增加一个参数-N来解决这个问题了。

ssh -D 7070 -l username proxy.remotehost.com -N

-N 参数是不请求一个shell界面,不执行远程命令。这个在只是端口转发的时候非常实用(只能在SSH2协议下工作,现在一般都是SSH2协议了,SSH1协议有安全问题,基本不用了)

让这个端口转发连接后台运行

如果只是上面的命令,在登录成功后,你是无法在当前的shell终端中进行任何的操作的,此时你想要干其他的事情只能再起一个端口了。

通常这个是没有意义的,放一个无用的窗口在那边,我们可以增加一个-f参数,让这个连接在后台运行

ssh -D 7070 -l username proxy.remotehost.com -Nf

这样我们就可以用当前的shell终端继续工作了。或者弄一个开机自动运行的脚本,开机自动连接。

给ssh连接增加http代理

如果你的PC无法直接访问到ssh服务器上,但是只有http代理可以访问,那么我们要建立这个socks5的动态端口转发只能为他加上一个代理了。

ssh -D 7070 -l username proxy.remotehost.com -Nf -o ProxyCommand="connect -H web-proxy.oa.com:8080 %h %p "

加上了-o ProxyCommand="connect -H web-proxy.oa.com:8080 %h %p "这个参数,就让我们的ssh连接建立在了一个http代理上了,这个应用对于在公司内网里面非常实用。

其中ProxyCommand指定了使用connect程序来进行代理。通常还可以使用corkscrew来达到相同的效果。

附connect的安装。

如果你是Ubuntu或者Debain系列的使用

sudo apt-get install connect-proxy

如果你是Ubuntu、Debain系列没找到源或者是Centos系列的,需用从下面去访问下载http://pkgs.org/download/connect-proxy。寻找一个适合你系统的包下载下来。

rpm -ivh connect-proxy-1.93-2.el6.x86_64.rpm
或者rpm -Uvh connect-proxy-1.93-2.el6.x86_64.rpm

一段时间没动作,连接自动断开了

一段时间没有发送消息,就出现了

Write failed: Broken pipe

这样的情况,这样的情况就是因为长时间没有发送消息,此隧道被关闭了。

因此我们需要设置一下ssh,让其每隔一段时间就发送一些消息,想服务器说明我还活着,不管关闭了我们的连接。

ssh -D 7070 -l username proxy.remotehost.com -Nf -o ProxyCommand="connect -H web-proxy.oa.com:8080 %h %p " -o ServerAliveInterval=60

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Linux下ssh动态端口转发 – https://www.chenyudong.com/archives/linux-ssh-port-dynamic-forward.html

分类: 网络

Squid搭建正向代理

本文主要讲述squid正向代理,如果你需要反向代理,可以参考一下Nginx的反向代理

网络环境复杂,不是所有的机器都能直接访问目标服务器的,总是有那么多的阻隔。比如我们的机器处于内网环境中(公司内网、墙内、学校内网),无法直接访问。这个时候如果有个机器能够访问外网的资源,那么我们就可以通过这个机器进行跳转。如下图。

正向代理

不只是普通的上网可以使用正向代理,我们的程序部署在内网内,但是又要主动请求外部资源的时候,这个时候也可以使用能够访问互联网资源的机器搭建正向代理服务。以此达到安全的服务。通过Squid,我们可以使用HTTP代理,这样就可以访问外网了。

安装Squid

快速的安装squid就是使用yum或者apt-get了。

yum install squid

默认的配置文件介绍

默认的文件在/etc/squid/squid.conf

#############################################################################
# squid权限控制 acl和http_access
#############################################################################
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1

# 局域网内的IP,看情况是否考虑需要
acl localnet src 10.0.0.0/8         # 一般大型企业或者学校使用,或者虚拟机中的网络
acl localnet src 172.16.0.0/12      # 一般很少用
acl localnet src 192.168.0.0/16     # 一般家用路由器或者虚拟机中的网络
acl localnet src fc00::/7           # IPv6
acl localnet src fe80::/10          # IPv6

# 定义ssl端口、一些安全端口和http访问的connect方法
acl SSL_ports port 443
acl Safe_ports port 80      # http
acl Safe_ports port 21      # ftp
acl Safe_ports port 443     # https
acl Safe_ports port 70      # gopher
acl Safe_ports port 210     # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280     # http-mgmt
acl Safe_ports port 488     # gss-http
acl Safe_ports port 591     # filemaker
acl Safe_ports port 777     # multiling http
acl CONNECT method CONNECT


# 推荐最小访问权限配置

# 允许本机管理缓存,其他的拒绝
http_access allow manager localhost
http_access deny manager

# 拒绝非安全端口
http_access deny !Safe_ports

# 拒绝connect到非ssl 443端口(上面定义了)
http_access deny CONNECT !SSL_ports

# 强烈建议去除注释。防止通过代理来访问本代理服务器上的web程序
# 以免认为是localhost用户访问web服务。
#http_access deny to_localhost

# 下面插入你自己的规则
#---------

# 允许localhost和局域网内用户的请求,根据需要调整
http_access allow localnet
http_access allow localhost

# 最后,拒绝其他的对代理的访问
http_access deny all

#############################################################################
##   Squid的基本配置
#############################################################################
# 默认监听3128端口
http_port 3128

# 设置对外显示的主机名
visible_hostname proxy.daoiqi.com


#############################################################################
###    squid缓存配置
#############################################################################
# 建议最少使用下面一行
hierarchy_stoplist cgi-bin ?

# 去除注释并调整下面这行语句来增加一个磁盘缓存目录
#cache_dir ufs /var/spool/squid 100 16 256

# 将核心输出保存在第一个缓存目录
coredump_dir /var/spool/squid

# 添加自己的刷新缓存的正则
refresh_pattern ^ftp:       1440    20% 10080
refresh_pattern ^gopher:    1440    0%  1440
refresh_pattern -i (/cgi-bin/|\?) 0 0%  0
refresh_pattern .       0   20% 4320

其中visible_hostname是我自己添加上去的,如果没有这个配置,会报warning。

默认的log路径为/var/log/squid/。可以进行查看一下相关的日志。

运行服务

service squid start # 启动squid
service squid stop 关闭squid
service squid restart 重启squid

以上部分基本上squid就可以正常工作了。

权限控制

默认的配置文件定义了局域网内用户都可以访问代理。但是在机房中,机器很多,他们都可能是处于内网上,这个需要注意。看看这些机器间是否有开启隔离,否则很危险。

对于云服务器来说这个应该还是安全的,他们会进行过滤。据我所知,目前云服务器上的隔离,主要是在宿主机(母机)上进行控制的,云服务器有一个内网IP和外网IP,对于内网IP的请求包,会在母机上使用iptables进行过滤。防止不同开发商的机器互相访问。

因此默认配置的局域网IP需要特别的注意一下。

附:我的squid配置

#############################################################################
# squid权限控制 acl和http_access
#############################################################################
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1

# 声明我的IP,来自我的IP,可以请求squid。注意一定要有掩码
acl myip src 121.14.10.9/32

# 局域网内的IP,看情况是否考虑需要
acl localnet src 10.0.0.0/8         # 一般大型企业或者学校使用,或者虚拟机中的网络
acl localnet src 172.16.0.0/12      # 一般很少用
acl localnet src 192.168.0.0/16     # 一般家用路由器或者虚拟机中的网络
acl localnet src fc00::/7           # IPv6
acl localnet src fe80::/10          # IPv6

# 定义ssl端口、一些安全端口和http访问的connect方法
acl SSL_ports port 443
acl Safe_ports port 80      # http
acl Safe_ports port 21      # ftp
acl Safe_ports port 443     # https
acl Safe_ports port 70      # gopher
acl Safe_ports port 210     # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280     # http-mgmt
acl Safe_ports port 488     # gss-http
acl Safe_ports port 591     # filemaker
acl Safe_ports port 777     # multiling http
acl CONNECT method CONNECT


# 推荐最小访问权限配置

# 允许本机管理缓存,其他的拒绝
http_access allow manager localhost
http_access deny manager

# 拒绝非安全端口
http_access deny !Safe_ports

# 拒绝connect到非ssl 443端口(上面定义了)
http_access deny CONNECT !SSL_ports

# 强烈建议去除注释。防止通过代理来访问本代理服务器上的web程序
# 以免认为是localhost用户访问web服务。
#http_access deny to_localhost

# 下面插入你自己的规则
#---------
# 允许我的IP访问squid
http_access allow myip


# 允许localhost和局域网内用户的请求,根据需要调整
http_access allow localnet
http_access allow localhost

# 最后,拒绝其他的对代理的访问
http_access deny all

#############################################################################
##   Squid的基本配置
#############################################################################
# 默认监听3128端口
http_port 3128

# 设置对外显示的主机名
visible_hostname proxy.daoiqi.com

# 对于本地配置hosts的网站,没有此配置,squid无法访问本地的hosts。
# 但是官网文档默认值就是/etc/hosts,我要显示声明才有效。
hosts_file /etc/hosts

#############################################################################
###    squid缓存配置
#############################################################################
# 建议最少使用下面一行
hierarchy_stoplist cgi-bin ?

# 去除注释并调整下面这行语句来增加一个磁盘缓存目录
#cache_dir ufs /var/spool/squid 100 16 256

# 将核心输出保存在第一个缓存目录
coredump_dir /var/spool/squid

# 添加自己的刷新缓存的正则
refresh_pattern ^ftp:       1440    20% 10080
refresh_pattern ^gopher:    1440    0%  1440
refresh_pattern -i (/cgi-bin/|\?) 0 0%  0
refresh_pattern .       0   20% 4320

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Squid搭建正向代理 – https://www.chenyudong.com/archives/squid-forward-proxy.html

分类: 网络

nginx 反向代理 proxy

上次说了,有个需求,是使用nginx做反向代理用的。可以看看具体的nginx的安装。另外还有一篇介绍Squid的正向代理

基本的nginx反向代理设置

要配置一下nginx,进入到${nginx}/conf/nginx.conf,增加一个服务器。

增加一条server记录

server {
        listen 80;  # 端口
        server_name testproxy; # 域名

        location / {
                proxy_pass http://www.chenyudong.com/;  # 需要访问的网站
                proxy_redirect off;                 # 重定向关闭
                proxy_set_header Host $host;        # 设置一下访问头
        }
    }

注意:通过上面的方法,只是服务器简单的将文件下载下来,然后就未加工的提交给用户了。也就是里面的链接是不会出现替换的,原来是什么就该是什么。

那么要替换某些URL要怎么做的?

替换网页里某些关键字或链接

如果需要替换关键字或者链接,该怎么办呢?

我们需要重新编译一下nginx,对,重新编译。在编译的时候添加参数--with-http_sub_module。也就是编译的命令./configure --with-http_sub_module。然后的安装过程见这篇文章。

接下来需要修改一下${nginx}/conf/nginx.conf配置。

server {
        listen 80;  # 端口
        server_name testproxy; # 域名

        ##将页面出现的www.baidu.com改成google.com
        sub_filter 'www.baidu.com' 'google.com';

        ## off:在符合的地方,替换所有出现的地方。默认为on:只替换第一个出现的地方
        sub_filter_once off;

        location / {
                proxy_pass http://www.google.com/;  # 需要访问的网站
                proxy_redirect off;                 # 重定向关闭
                proxy_set_header Host $host;        # 设置一下访问头
        }
    }

需要关心用于的真实IP了

说明:这个用户的真实IP指的是,直接和我们服务器连接的那个IP,用户可以躲在代理后面,这种情况获取不到用户真实IP,想要获得,成本很高,还不一定能获得到。下文说的都是基于这个前提条件的。

以上配置,是多么美好啊,应该能正常工作了。但是还是有些不足,就是我们对用户真实IP的获取上,已经无法通过_SERVER['REMOTE_ADDR']获取,因为这个获取的值是前台的nginx的IP。

nginx反向代理

nginx反向代理

对于我们backend nginx代理,只能看到所有的请求是来自front nginx的,所以PHP程序想要获得用户的真实IP,需要做一些设置。

## front nginx 设置
server {
    listen          80;
    server_name     server.com;
    #access_log      /data/home/log/server.access.log main;

    location / {
        proxy_pass http://www.chenyudong.com/;
        proxy_redirect off;
        proxy_set_header X-real-ip $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

从HTTP_X_REAL_IP获取

通过增加HTTP_X_REAL_IPHTTP_X_FORWARDED_FOR这两个变量,让后端的backend nginx从这里获取用户的真实IP。

设置用户真实IP头的结果

设置用户真实IP头的结果

我们可以看到,PHP中的HTTP_X_REAL_IPHTTP_X_FORWARDED_FOR已经获取到用户的真实IP了。

这还不够完美,这需要我们的程序重新使用_SERVER["HTTP_X_REAL_IP"]这样来取值。但是程序不是从头写起的,大家都在使用_SERVER['REMOTE_ADDR']获取,要替换,工程浩大,不适宜。那么就只能在程序的入口做个变量的替换了。

<?php
    _SERVER['REMOTE_ADDR'] = _SERVER["HTTP_X_REAL_IP"];
....
?>

来个狠的,就要从REMOTE_ADDR获取

如果你觉得上面还是不太爽,我就是从那里取值。

在上面front nginx的配置基础上不变。这次我们对backend nginx做配置:

 location ~ ^.+\.php {
          fastcgi_pass 127.0.0.1:9000;
          fastcgi_index index.php;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
          fastcgi_param REMOTE_ADDR $HTTP_X_REAL_IP;
  }

就是高亮的第六行,添加fastcgi_param REMOTE_ADDR $HTTP_X_REAL_IP;,把REMOTE_ADDR这个变量在这里就给他替换了。看看替换的结果:

替换REMOTE_ADDR变量

替换REMOTE_ADDR变量

经过这么一折腾,我们的PHP就可以和以前一样工作了。

这样就好了吗?

如果你觉得这样,就可以了,那就错了。虽然我们的PHP正确获得了用户的IP,但是nginx要打access的log,看看他的log,你会发现请求的IP还是front nginx的那个IP。

要解决这个问题,我们就要再修改一把。并且这个解决方案比上一步来的更好一些。完全可以替换上一部的方案。

前端的front nginx的配置和前面一样。

## front nginx 设置
server {
    listen          80;
    server_name     server.com;
    #access_log      /data/home/log/server.access.log main;

    location / {
        proxy_pass http://www.chenyudong.com/;
        proxy_redirect off;
        proxy_set_header X-real-ip $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

后台的backend nginx要使用set_real_ip_fromreal_ip_header这两个指令,这两个是在nginx的HttpRealipModule中,这个模块默认不被编译,因此需要在编译是添加--with-http_realip_module参数

## 源码编译增加参数
./configure --with-http_realip_module

## yum 安装默认是有安装的,可以
nginx -V ##查看一下编译的参数

后端的backend nginx配置

## backend nginx
location ~ ^.+\.php {
          fastcgi_pass 127.0.0.1:9000;
          fastcgi_index index.php;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
          set_real_ip_from   10.221.0.197;
          #set_real_ip_from   100.100.0.0/16;
          #set_real_ip_from  2001:0db8::/32;
          real_ip_header     X-Real-IP;
}

第7行,set_real_ip_from定义了一个信任的IP地址,从这个信任的IP发送的可以替换用户的IP地址。如果值是unix,所有来自UNIX域的sockets都被信任。

IPv6 addresses are supported starting from versions 1.3.0 and 1.2.1.

第10行,real_ip_header定义了一个请求头,用于替换用户的真实IP。

这样的配置,我们的_SERVER['REMOTE_ADDR']还是用户的真实IP,而不是front nginx的IP。并且log里面的IP也是用户的真实IP。还等什么,赶快试一试吧。

参考资料:

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: nginx 反向代理 proxy – https://www.chenyudong.com/archives/nginx-reverse-proxy.html

分类: 网站建设

Copyright © 2017 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑