Open itgoyo opened 5 years ago
proxychains.conf
# proxychains.conf VER 4.x
#
# HTTP, SOCKS4a, SOCKS5 tunneling proxifier with DNS.
# The option below identifies how the ProxyList is treated.
# only one option should be uncommented at time,
# otherwise the last appearing option will be accepted
#
#dynamic_chain
#
# Dynamic - Each connection will be done via chained proxies
# all proxies chained in the order as they appear in the list
# at least one proxy must be online to play in chain
# (dead proxies are skipped)
# otherwise EINTR is returned to the app
#
strict_chain
#
# Strict - Each connection will be done via chained proxies
# all proxies chained in the order as they appear in the list
# all proxies must be online to play in chain
# otherwise EINTR is returned to the app
#
#round_robin_chain
#
# Round Robin - Each connection will be done via chained proxies
# of chain_len length
# all proxies chained in the order as they appear in the list
# at least one proxy must be online to play in chain
# (dead proxies are skipped).
# the start of the current proxy chain is the proxy after the last
# proxy in the previously invoked proxy chain.
# if the end of the proxy chain is reached while looking for proxies
# start at the beginning again.
# otherwise EINTR is returned to the app
# These semantics are not guaranteed in a multithreaded environment.
#
#random_chain
#
# Random - Each connection will be done via random proxy
# (or proxy chain, see chain_len) from the list.
# this option is good to test your IDS :)
# Make sense only if random_chain or round_robin_chain
#chain_len = 2
# Quiet mode (no output from library)
#quiet_mode
# Proxy DNS requests - no leak for DNS data
proxy_dns
# set the class A subnet number to use for the internal remote DNS mapping
# we use the reserved 224.x.x.x range by default,
# if the proxified app does a DNS request, we will return an IP from that range.
# on further accesses to this ip we will send the saved DNS name to the proxy.
# in case some control-freak app checks the returned ip, and denies to
# connect, you can use another subnet, e.g. 10.x.x.x or 127.x.x.x.
# of course you should make sure that the proxified app does not need
# *real* access to this subnet.
# i.e. dont use the same subnet then in the localnet section
#remote_dns_subnet 127
#remote_dns_subnet 10
remote_dns_subnet 224
# Some timeouts in milliseconds
tcp_read_time_out 15000
tcp_connect_time_out 8000
### Examples for localnet exclusion
## localnet ranges will *not* use a proxy to connect.
## Exclude connections to 192.168.1.0/24 with port 80
# localnet 192.168.1.0:80/255.255.255.0
## Exclude connections to 192.168.100.0/24
# localnet 192.168.100.0/255.255.255.0
## Exclude connections to ANYwhere with port 80
# localnet 0.0.0.0:80/0.0.0.0
## RFC5735 Loopback address range
## if you enable this, you have to make sure remote_dns_subnet is not 127
## you'll need to enable it if you want to use an application that
## connects to localhost.
# localnet 127.0.0.0/255.0.0.0
## RFC1918 Private Address Ranges
# localnet 10.0.0.0/255.0.0.0
# localnet 172.16.0.0/255.240.0.0
# localnet 192.168.0.0/255.255.0.0
# ProxyList format
# type ip port [user pass]
# (values separated by 'tab' or 'blank')
#
# only numeric ipv4 addresses are valid
#
#
# Examples:
#
# socks5 192.168.67.78 1080 lamer secret
# http 192.168.89.3 8080 justu hidden
# socks4 192.168.1.49 1080
# http 192.168.39.93 8080
#
#
# proxy types: http, socks4, socks5
# ( auth types supported: "basic"-http "user/pass"-socks )
#
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
# socks4 127.0.0.1 9050
http 127.0.0.1 57652
socks5 127.0.0.1 57651
export https_proxy=http://127.0.0.1:57652
pc git clone xxx
其中pc是proxychains4的缩写,已经在.zshrc
alias pc='proxychains4'使用 brew 安装 proxychains brew install proxychains-ng
开启科学上网的代理,这个不多说,懂的自然会搞,有心的自然会找。
配置相应的文件 /usr/local/etc/proxychains.conf
http 127.0.0.1 1087
socks5 127.0.0.1 1086
根据实际情况来写,上面的是我根据shadowsocket-ng
得到的,相应的你要查看自己的。
最后要测试终端是否已经使用代理了,可以使用以下命令
proxychains4 curl cip.cc
走没走代理得到的效果如下:
itgoyo@itgoyodeMacBook-Pro ~ curl cip.cc
IP : 183.15.177.45
地址 : 中国 广东 深圳
运营商 : 电信
数据二 : 广东省深圳市 | 电信
数据三 : 中国广东省深圳市 | 电信
URL : http://www.cip.cc/183.15.177.45
itgoyo@itgoyodeMacBook-Pro ~ pc curl cip.cc
[proxychains] config file found: /usr/local/etc/proxychains.conf
[proxychains] preloading /usr/local/Cellar/proxychains-ng/4.14/lib/libproxychains4.dylib
[proxychains] DLL init: proxychains-ng 4.14
[proxychains] Strict chain ... 127.0.0.1:1087 ... 127.0.0.1:1086 ... cip.cc:80 ... OK
IP : 211.20.175.4
地址 : 中国 台湾 台中市
运营商 : cht.com.tw
数据二 : 台湾省 | 中华电信(HiNet)
数据三 : 中国台湾省台湾 | 中华电信
URL : http://www.cip.cc/211.20.175.4
至于为什么是pc是因为我在.zshrc
里面配置了相应的映射
alias pc='proxychains4'
由于 SIP 问题,导致 ProxyChains 在 Mac 上失效
解决方案:
关闭 SIP
reboot
# 按住 option 键
# 到系统选择页面后, 按住 Command + R , 进入系统恢复页面
# 左上角 工具里选择 [终端]
csrutil disable
reboot
# 查看 SIP 是否真的被关闭
csrutil status
# System Integrity Protection status: disabled. 说明SIP已关闭, 即可使用
export all_proxy=socks5://127.0.0.1:1086
对于技术人员shadowsocks应该不陌生,shadowsocks实质上也是一种socks5代理服务,类似于ssh代理。
与vpn的全局代理不同,shadowsocks仅针对浏览器代理,不能代理应用软件,比如curl、wget等一些命令行软件。如果要让终端下的命令行工具都能支持代理,这时我们就要用上proxychains-ng这款神器了。
什么是 proxychains-ng
项目主页:https://github.com/rofl0r/proxychains-ng
proxychains-ng 介绍
proxychains-ng是proxychains的加强版,主要有以下功能和不足:
proxychains-ng 原理
简单的说就是这个程序 Hook 了 sockets 相关的操作,让普通程序的 sockets 数据走 SOCKS/HTTP 代理。
其核心就是利用了 LD_PRELOAD 这个环境变量(Mac 上是 DYLD_INSERT_LIBRARIES)。
在 Unix 系统中,如果设置了 LD_PRELOAD 环境变量,那么在程序运行时,动态链接器会先加载该环境变量所指定的动态库。也就是说,这个动态库的加载优先于任何其它的库,包括 libc。
ProxyChains 创建了一个叫 libproxychains4.so(Mac 上是 libproxychains4.dylib)的动态库。里面重写了 connect、close 以及 sendto 等与 socket 相关的函数,通过这些函数发出的数据将会走代理,详细代码可以参考 libproxychains.c。
在主程序里,它会读取配置文件,查找 libproxychains4 所在位置,把这些信息存入环境变量后执行子程序。这样子程序里对 socket 相关的函数调用就会被 Hook 了,对子程序来说,跟代理相关的东西都是透明的。
可以用 printenv 程序来查看增加的环境变量,在 Mac 上输出结果类似于:
$ proxychains4 printenv
[proxychains] config file found: /usr/local/Cellar/proxychains-ng/4.11/etc/proxychains.conf [proxychains] preloading /usr/local/Cellar/proxychains-ng/4.11/lib/libproxychains4.dylib [proxychains] DLL init: proxychains-ng 4.11 ... PROXYCHAINS_CONF_FILE=/usr/local/Cellar/proxychains-ng/4.11/etc/proxychains.conf DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=/usr/local/Cellar/proxychains-ng/4.11/lib/libproxychains4.dylib
一共设置了三个环境变量,其中 PROXYCHAINS_CONF_FILE 保存的是配置文件路径,DYLD_INSERT_LIBRARIES 保存的是动态库路径,在 Mac 中,必须使DYLD_FORCE_FLAT_NAMESPACE 为 1 才能保证 DYLD_INSERT_LIBRARIES 起作用。
安装 proxychains-ng
通过源代码安装
$ git clone https://github.com/rofl0r/proxychains-ng
$ ./configure --prefix=/usr --sysconfdir=/etc $ make $ make install $ make install-config (安装proxychains.conf配置文件)
MAC下安装
关闭 SIP
macOS 10.11 后下由于开启了 SIP(System Integrity Protection) 会导致命令行下 proxychains-ng 代理的模式失效,如果你要使用 proxychains-ng 这种简单的方法,就需要先关闭 SIP。
具体的关闭方法如下:
安装 Proxychains-ng
安装好 Homebrew 后,终端中输入
$ brew install proxychains-ng
配置 proxychains-ng
proxychains-ng默认配置文件名为
proxychains.conf
。/etc/proxychains.conf
。/usr/local/etc/proxychains.conf
。proxychains-ng的配置非常简单,只需将代理加入[ProxyList]中即可。
$ vim proxychains.conf
quiet_mode 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 localnet 127.0.0.0/255.0.0.0 localnet 10.0.0.0/255.0.0.0 localnet 172.16.0.0/255.240.0.0 localnet 192.168.0.0/255.255.0.0
[ProxyList] socks5 127.0.0.1 1086 http 127.0.0.1 1087
proxychains-ng支持多种代理模式,默认是选择 strict_chain。
proxychains-ng 使用
proxychains-ng 语法
proxychains-ng用法非常简单,使用格式如下:
$ proxychains4 程序 参数
proxychains-ng 测试
$ proxychains4 curl ip.cn
proxychains-ng 优化
alias
给proxychains4增加一个别名,在 /.zshrc或/.bashrc末尾加入如下行: |
---------------------------------------
proxychain-ng config
---------------------------------------
alias pc='proxychains4'
|
以后就可以类似
$ pc curl http://www.google.com
这样调用proxychains4,简化了输入。自动补全
你输了很长一段命令,然后你突然想使用代理功能,怎么办?
在
iTerm -> Preferences -> Profiles -> Keys
中,新建一个快捷键,例如 ⌥ + p ,Action 选择 Send Hex Code,键值为 0x1 0x70 0x63 0x20 0xd,保存生效。以后命令要代理就直接敲命令,然后 ⌥ + p 即可,这样命令补全也能保留了。
附上 Hex Code 对应表,获取工具为keycodes(http://manytricks.com/keycodes/)
$ git clone git@github.com:six-ddc/zsh-proxychains-ng.git ~/.oh-my-zsh/custom/plugins/zsh-proxychains-ng $ echo "plugins+=(zsh-proxychains-ng)" >> ~/.zshrc
使用时按[ESC]-P ,自动添加(去除)
proxychains4 -q
命令前缀,支持 emacs 和 vi mode 。如果你还是觉得每次使用都要输入proxychains4或其别名,比较麻烦。你还可以用proxychains-ng代理一个shell,在shell中执行的命令就会自动使用代理了。
方法一
手动设置环境变量
$ export PROXYCHAINS_CONF_FILE=/usr/local/Cellar/proxychains-ng/4.11/etc/proxychains.conf $ export DYLD_INSERT_LIBRARIES=/usr/local/Cellar/proxychains-ng/4.11/lib/libproxychains4.dylib $ export DYLD_FORCE_FLAT_NAMESPACE=1
方法二
proxychains-ng直接调用SHELL
BASH
$ proxychains4 -q /bin/bash
ZSH
$ proxychains4 -q /bin/zsh
这样在当前 shell 中运行的所有程序的网络请求都会走代理了。可以把上面的命令加入到用户目录的.bashrc或者.zshrc中,用户登录后自动代理一个shell,这就类似一个全局代理了。在这个SHELL下的所有命令都可以使用代理了。
参考文档
http://www.google.com http://t.cn/R4tiUB1 http://t.cn/Rxg7oJR http://t.cn/RG1Hbs3
文章转载自:https://www.hi-linux.com/posts/48321.html