在 Bash 会话中代理所有网络通信

在 Bash 会话中代理所有网络通信

是否可以在 bash 会话中为所有网络通信指定代理?我怀疑可以使用 ssh 来实现,但如果有更好的方法,我宁愿不使用它。

答案1

在 Linux 中有proxychainsproxychains-ng。我相信后者proxychains4在 Ubuntu 中被调用。用法如下:

proxychains4 some_program     # see the manual to learn about config files

或者

proxychains4 -f configfile.conf some_program

是否可以在 bash 会话中为所有网络通信指定代理?

基本上是的。

proxychains4 bash

该工具的工作原理是使用LD_PRELOAD多变的预加载其共享对象,该对象执行实际工作。首先,bash本身是代理的(通常您不希望您的 shell 发起网络连接,但 Bash 会为特殊重定向(如)执行此操作foo > /dev/tcp/host/port,它们将被代理)。变量在环境中,因此在此 Bash 会话中调用的任何命令都将受到影响。

# from within our proxified Bash
wget -O /dev/null superuser.com     # also proxified

然而

  • 如果我们的代理 Bash(或任何代理命令)产生了一个LD_PRELOAD没有指向正确对象的子进程,那么该子进程将不会被代理,例如:

    # from within our proxified Bash
    LD_PRELOAD="" wget -O /dev/null superuser.com     # not proxified
    
  • 如果我们的代理 Bash(或任何代理命令)执行到一个新进程(可能是其自身的新实例)但LD_PRELOAD没有指向正确的对象,则生成的进程将不会被代理,例如:

    # from within our proxified Bash
    unset LD_PRELOAD
    exec bash
    # now we are in non-proxified Bash, it replaced the proxified one
    wget -O /dev/null superuser.com     # not proxified
    

答案2

telnet您可以通过将其导出为环境变量来设置大多数支持 SOCKS 的程序(即wget等)使用的代理:

export http_proxy=http://username:password@proxyhost:port/ 
export https_proxy=https://username:password@proxyhost:port/
export ftp_proxy=http://username:password@proxyhost:port/

相关内容