src: http://www.catonmat.net/blog/linux-socks5-proxy/

I thought I'd do a shorter article on catonmat this time. It goes hand in hand with my upcoming article series on "100% technical guide to anonymity" and it's much easier to write larger articles in smaller pieces. Then I can edit them together and produce the final article.

This article will be interesting for those who didn't know it already -- you can turn any Linux computer into a SOCKS5 (and SOCKS4) proxy in just one command:

ssh -N -D 0.0.0.0:1080 localhost

And it doesn't require root privileges. The ssh command starts up dynamic -D port forwarding on port1080 and talks to the clients via SOCSK5 or SOCKS4 protocols, just like a regular SOCKS5 proxy would! The -N option makes sure ssh stays idle and doesn't execute any commands on localhost.

If you also wish the command to go into background as a daemon, then add -f option:

ssh -f -N -D 0.0.0.0:1080 localhost

To use it, just make your software use SOCKS5 proxy on your Linux computer's IP, port 1080, and you're done, all your requests now get proxied.

Access control can be implemented via iptables. For example, to allow only people from the ip1.2.3.4 to use the SOCKS5 proxy, add the following iptables rules:

iptables -A INPUT --src 1.2.3.4 -p tcp --dport 1080 -j ACCEPT
iptables -A INPUT -p tcp --dport 1080 -j REJECT

The first rule says, allow anyone from 1.2.3.4 to connect to port 1080, and the other rule says, deny everyone else from connecting to port 1080.

Surely, executing iptables requires root privileges. If you don't have root privileges, and you don't want to leave your proxy open (and you really don't want to do that), you'll have to use some kind of a simple TCP proxy wrapper to do access control.

Here, I wrote one in Perl. It's called tcp-proxy.pl and it uses IO::Socket::INET to abstract sockets, and IO::Select to do connection multiplexing.

#!/usr/bin/perl
# use warnings;
use strict; use IO::Socket::INET;
use IO::Select; my @allowed_ips = ('1.2.3.4', '5.6.7.8', '127.0.0.1', '192.168.1.2');
my $ioset = IO::Select->new;
my %socket_map; my $debug = 1; sub new_conn {
my ($host, $port) = @_;
return IO::Socket::INET->new(
PeerAddr => $host,
PeerPort => $port
) || die "Unable to connect to $host:$port: $!";
} sub new_server {
my ($host, $port) = @_;
my $server = IO::Socket::INET->new(
LocalAddr => $host,
LocalPort => $port,
ReuseAddr => 1,
Listen => 100
) || die "Unable to listen on $host:$port: $!";
} sub new_connection {
my $server = shift;
my $client = $server->accept;
my $client_ip = client_ip($client); unless (client_allowed($client)) {
print "Connection from $client_ip denied.\n" if $debug;
$client->close;
return;
}
print "Connection from $client_ip accepted.\n" if $debug; my $remote = new_conn('localhost', 55555);
$ioset->add($client);
$ioset->add($remote); $socket_map{$client} = $remote;
$socket_map{$remote} = $client;
} sub close_connection {
my $client = shift;
my $client_ip = client_ip($client);
my $remote = $socket_map{$client}; $ioset->remove($client);
$ioset->remove($remote); delete $socket_map{$client};
delete $socket_map{$remote}; $client->close;
$remote->close; print "Connection from $client_ip closed.\n" if $debug;
} sub client_ip {
my $client = shift;
return inet_ntoa($client->sockaddr);
} sub client_allowed {
my $client = shift;
my $client_ip = client_ip($client);
return grep { $_ eq $client_ip } @allowed_ips;
} print "Starting a server on 0.0.0.0:1080\n";
my $server = new_server('0.0.0.0', 1080);
$ioset->add($server); while (1) {
for my $socket ($ioset->can_read) {
if ($socket == $server) {
new_connection($server);
}
else {
next unless exists $socket_map{$socket};
my $remote = $socket_map{$socket};
my $buffer;
my $read = $socket->sysread($buffer, 4096);
if ($read) {
$remote->syswrite($buffer);
}
else {
close_connection($socket);
}
}
}
}

To use it, you'll have to make a change to the previous configuration. Instead of running ssh SOCKS5 proxy on 0.0.0.0:1080, you'll need to run it on localhost:55555,

ssh -f -N -D 55555 localhost

After that, run the tcp-proxy.pl,

perl tcp-proxy.pl &

The TCP proxy will start listening on 0.0.0.0:1080 and will redirect only the allowed IPs in@allowed_ips list to localhost:55555.

Another possibility is to use another computer instead of your own as exit node. What I mean is you can do the following:

ssh -f -N -D 1080 other_computer.com

This will set up a SOCKS5 proxy on localhost:1080 but when you use it, ssh will automatically tunnel your requests (encrypted) via other_computer.com. This way you can hide what you're doing on the Internet from anyone who might be sniffing your link. They will see that you're doing something but the traffic will be encrypted so they won't be able to tell what you're doing.

That's it. You're now the proxy king!

Download tcp-proxy.pl

Download link: tcp proxy (tcp-proxy.pl)
Download URL: http://www.catonmat.net/download/tcp-proxy.pl
Downloaded: 6035 times

I also pushed the tcp-proxy.pl to GitHub: tcp-proxy.pl on GitHub. This project is also pretty nifty to generalize and make a program that redirects between any number of hosts:ports, not just two.

PS. I will probably also write "A definitive guide to ssh port forwarding" some time in the future because it's an interesting but little understood topic.

最新文章

  1. android listview 异步加载图片并防止错位
  2. Mysql手册—基本规范与数据类型
  3. gulp入坑系列(4)——gulp的代码转换
  4. LightOJ::1077 -----奇妙的最大公约数
  5. HTML <div> 和 <span>
  6. linux下,如何把整个文件夹上传到服务器(另一台linux)
  7. linux系统垃圾清理
  8. ASP.NET+ashx+jQuery动态添加删除表格
  9. poj 2892 &&hdu 1540 Tunnel Warfare
  10. html5 兼容参考文档 与 浏览器hack兼容参考文档
  11. Effective C++ 10
  12. Maven搭建struts2+spring+hibernate环境
  13. bean shell 中parameter传递参数的方法
  14. R语言绘制箱型图
  15. Java 深复制和浅复制
  16. c# zxing生成二维码和打印
  17. js基础梳理-究竟什么是变量对象,什么是活动对象?
  18. [linux] 查看网卡UUID
  19. [Vani有约会]雨天的尾巴——树上差分+动态开点线段树合并
  20. Build IKAnalyzer With Solr 5.1.0

热门文章

  1. Unity 软件使用事项
  2. LightOJ 1370- Bi-shoe and Phi-shoe (欧拉函数)
  3. git团队开发
  4. iis应用池内存溢出卡死优化
  5. ajax json 学习笔记
  6. openssl asn.1 生成DER文件,把DER文件转换成内部数据结构
  7. 洛谷P4782 【模板】2-SAT问题 [2-SAT]
  8. Kuhn-Munkres算法
  9. Openstack关于Regions和Availability Zones
  10. 安装与配置ironic