![如何通过另一个子网中的特定 SOCKS 代理路由一个子网的流量?](https://linux22.com/image/1384111/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%AD%90%E7%BD%91%E4%B8%AD%E7%9A%84%E7%89%B9%E5%AE%9A%20SOCKS%20%E4%BB%A3%E7%90%86%E8%B7%AF%E7%94%B1%E4%B8%80%E4%B8%AA%E5%AD%90%E7%BD%91%E7%9A%84%E6%B5%81%E9%87%8F%EF%BC%9F.png)
这是我的网络图:
Internet
|
|
Router (192.168.1.1)
|
|
(192.168.1.100) (wireless)
MacBook ( mac os x / windows 7 / ubuntu. It doesn't matter )
(192.168.2.1) (wired)
|
|
TargetComputer (192.168.2.2)
我想通过在我的 MacBook 上运行的 Socks 代理路由来自 TargetComputer 192.168.2.2 的所有流量。
在目标计算机上,我只能更改 IP 设置(IP 地址、子网掩码、网关、DNS)。
答案1
终于解决了。您需要做的就是在端口 1080 上运行 socks 代理,然后运行此脚本。
#!/bin/bash
########################################################################
# This bash script will create a socksifying router and pass all subnet
# traffic through
# a socks5 proxy. As the script is now written, local traffic is not
# proxied, however, make the change noted below and it will be.
#
# Assumptions here are that you are using a laptop with an internet
# connection on wlan0, and an additional wired ethernet port eth0.
#
# The script requires that a dhcp server be running using the
# isc-dhcp-server package on ubuntu, or equivalent on other O/S varieties.
# This dhcp server will serve addresses on eth0 to nodes trying to
# connect. Either that or all of the subnet clients have to have static
# addresses. To configure dhcpd, add the following to /etc/dhcp/dhcpd.conf
# (changing the subnet address as appropriate):
#
#subnet 192.168.1.0 netmask 255.255.255.0 {
# range 192.168.1.10 192.168.1.100;
# range 192.168.1.150 192.168.1.200;
# option routers 192.168.1.254;
# option broadcast-address 192.168.1.255;
#}
#
# Also, the script requires the redsocks, openssh-client, and iptables
# packages be installed as well.
#
# Finally, you need to edit /etc/sysctl.conf as follows:
#
# Uncomment the next line to enable packet forwarding for IPv4
# net.ipv4.ip_forward=1
########################################################################
########################################################################
# Define various configuration parameters.
########################################################################
SOCKS_PORT=1080
REDSOCKS_TCP_PORT=$(expr $SOCKS_PORT + 1)
TMP=/tmp/subnetproxy ; mkdir -p $TMP
REDSOCKS_LOG=$TMP/redsocks.log
REDSOCKS_CONF=$TMP/redsocks.conf
SUBNET_INTERFACE=eth1
SUBNET_PORT_ADDRESS="192.168.2.1" #can't be the same subnet as eth1
INTERNET_INTERFACE=eth0
########################################################################
#standard router setup - sets up subnet SUBNET_PORT_ADDRESS/24 on eth0
########################################################################
# note - if you just want a standard router without the proxy/tunnel
# business, you only need to execute this block of code.
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
sudo ifconfig eth1 $SUBNET_PORT_ADDRESS netmask 255.255.255.0
sudo iptables -A FORWARD -o eth0 -i eth1 -s $SUBNET_PORT_ADDRESS/24 \
-m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED \
-j ACCEPT
sudo iptables -A POSTROUTING -t nat -j MASQUERADE
########################################################################
#redsocks configuration
########################################################################
cat >$REDSOCKS_CONF <<EOF
base {
log_info = on;
log = "file:$REDSOCKS_LOG";
daemon = on;
redirector = iptables;
}
redsocks {
local_ip = 0.0.0.0;
local_port = $REDSOCKS_TCP_PORT;
ip = 127.0.0.1;
port = $SOCKS_PORT;
type = socks5;
}
EOF
# To use tor just change the redsocks output port from 1080 to 9050 and
# replace the ssh tunnel with a tor instance.
########################################################################
# start redsocks
########################################################################
sudo redsocks -c $REDSOCKS_CONF -p /dev/null
########################################################################
# proxy iptables setup
########################################################################
# create the REDSOCKS target
sudo iptables -t nat -N REDSOCKS
# don't route unroutable addresses
sudo iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
#sudo iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
# redirect statement sends everything else to the redsocks
# proxy input port
sudo iptables -t nat -A REDSOCKS -p tcp -j REDIRECT \
--to-ports $REDSOCKS_TCP_PORT
# if it came in on eth0, and it is tcp, send it to REDSOCKS
sudo iptables -t nat -A PREROUTING -i $SUBNET_INTERFACE \
-p tcp -j REDSOCKS
# Use this one instead of the above if you want to proxy the local
# networking in addition to the subnet stuff. Redsocks listens on
# all interfaces with local_ip = 0.0.0.0 so no other changes are
# necessary.
#sudo iptables -t nat -A PREROUTING -p tcp -j REDSOCKS
# don't forget to accept the tcp packets from eth0
sudo iptables -A INPUT -i eth1 -p tcp --dport $REDSOCKS_TCP_PORT \
-j ACCEPT
答案2
我对你的脚本做了一些小改动,并添加了一些注释和变量。
#!/bin/bash
########################################################################
# This bash script will create a socksifying router and pass all subnet
# traffic through
# a socks5 proxy. As the script is now written, local traffic is not
# proxied, however, make the change noted below and it will be.
#
# Assumptions here are that you are using a laptop with an internet
# connection on wlan0, and an additional wired ethernet port eth0.
#
# The script requires that a dhcp server be running using the
# isc-dhcp-server package on ubuntu, or equivalent on other O/S varieties.
# This dhcp server will serve addresses on eth0 to nodes trying to
# connect. Either that or all of the subnet clients have to have static
# addresses. To configure dhcpd, add the following to /etc/dhcp/dhcpd.conf
# (changing the subnet address as appropriate):
#
# Replace option :
# domain-name-servers XXXXXXX, XXXXXXX;
# for:
# option domain-name-servers 1.1.1.1, 1.0.0.1;
# And Add:
#subnet 192.168.2.0 netmask 255.255.255.0 {
# range 192.168.2.10 192.168.2.100;
# range 192.168.2.150 192.168.2.200;
# option routers 192.168.2.254;
# option broadcast-address 192.168.2.255;
#}
#
#
# Edit /etc/default/isc-dhcp-server addiding the network interface that dhcp-server work:
# INTERFACESv4="eth1"
#
# Also, the script requires the redsocks, openssh-client, and iptables
# packages be installed as well.
#
# Finally, you need to edit /etc/sysctl.conf as follows:
#
# Uncomment the next line to enable packet forwarding for IPv4
# net.ipv4.ip_forward=1
########################################################################
########################################################################
# Define various configuration parameters.
########################################################################
SOCKS_PORT=1080
REDSOCKS_TCP_PORT=$(expr $SOCKS_PORT + 1)
TMP=/tmp/subnetproxy ; mkdir -p $TMP
REDSOCKS_LOG=$TMP/redsocks.log
REDSOCKS_CONF=$TMP/redsocks.conf
SUBNET_INTERFACE=eth1
SUBNET_PORT_ADDRESS="192.168.2.1" #can't be the same subnet as eth1
INTERNET_INTERFACE=eth0
########################################################################
#standard router setup - sets up subnet SUBNET_PORT_ADDRESS/24 on eth0
########################################################################
# note - if you just want a standard router without the proxy/tunnel
# business, you only need to execute this block of code.
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
sudo ifconfig $SUBNET_INTERFACE $SUBNET_PORT_ADDRESS netmask 255.255.255.0
sudo iptables -A FORWARD -o $INTERNET_INTERFACE -i $SUBNET_INTERFACE -s $SUBNET_PORT_ADDRESS/24\
-m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED \
-j ACCEPT
sudo iptables -A POSTROUTING -t nat -j MASQUERADE
########################################################################
#redsocks configuration
########################################################################
cat >$REDSOCKS_CONF <<EOF
base {
log_info = on;
log = "file:$REDSOCKS_LOG";
daemon = on;
redirector = iptables;
}
redsocks {
local_ip = 0.0.0.0;
local_port = $REDSOCKS_TCP_PORT;
ip = 127.0.0.1;
port = $SOCKS_PORT;
type = socks5; # or socks4;
}
EOF
# To use tor just change the redsocks output port from 1080 to 9050 and
# replace the ssh tunnel with a tor instance.
########################################################################
# start redsocks
########################################################################
sudo redsocks -c $REDSOCKS_CONF -p /dev/null
#You will need to copy this config file to work as a service:
#mv /etc/redsocks.conf /etc/redsocks.conf.original
#cp $REDSOCKS_CONF /etc/redsocks.conf
########################################################################
# proxy iptables setup
########################################################################
# create the REDSOCKS target
sudo iptables -t nat -N REDSOCKS
# don't route unroutable addresses
sudo iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
#sudo iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
# redirect statement sends everything else to the redsocks
# proxy input port
sudo iptables -t nat -A REDSOCKS -p tcp -j REDIRECT \
--to-ports $REDSOCKS_TCP_PORT
# if it came in on eth1, and it is tcp, send it to REDSOCKS
sudo iptables -t nat -A PREROUTING -i $SUBNET_INTERFACE \
-p tcp -j REDSOCKS
# Use this one instead of the above if you want to proxy the local
# networking in addition to the subnet stuff. Redsocks listens on
# all interfaces with local_ip = 0.0.0.0 so no other changes are
# necessary.
#sudo iptables -t nat -A PREROUTING -p tcp -j REDSOCKS
# don't forget to accept the tcp packets from subnet Interface
sudo iptables -A INPUT -i $SUBNET_INTERFACE -p tcp --dport $REDSOCKS_TCP_PORT\
-j ACCEPT