我有一台安装了linux的笔记本,笔记本有两个网络接口eth0和wlan0,平时我都是通过eth0上网的,在linux中已经成功设置了热点,供kindle使用,重要代码如下:
# Enable NAT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Run access point daemon
sudo hostapd /etc/ap-hotspot.conf
平时上网一般会通过加密的socks5代理:127.0.0.1:10000,而且希望全系统都使用这个代理,所以安装了redsocks,可以把所有的TCP连接都重定向到socks5代理,重要代码如下:
#redsocks requires all the data to be redirected to port 12345, and the socks5 address and port(127.0.0.1:10000) has been written to redsocks's configuration file.
sudo iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 12345
到目前为止,一切似乎都运行良好。我的 kindle 可以连接到热点,我可以通过 Linux 中的系统范围代理上网。问题是,我的 kindle 绕过了 socks5 代理并直接连接到互联网。那么如何让我的 kindle 在使用热点时通过代理呢?我的意思是,如何在 Linux 中做到这一点,因为没有办法在我的 kindle 中设置代理。
答案1
我有一个类似的设置。wlan0
连接到互联网(通过我的路由器),同时wlan1
充当我的Android手机的热点(接入点)。wlan1
设置了ipv4地址10.0.0.1/24
,即我的手机在10.0.0.x
范围内获取ip地址。
我用来通过 redsocks 传输手机所有流量的 iptables 规则是:
sudo iptables -t nat -A PREROUTING -s 10.0.0.0/24 -p tcp -j REDIRECT --to-ports 12345
据我了解,该规则基本上会获取来自任何具有地址的源设备的所有 TCP 流量10.0.0.0/24
,并将其重定向到12345
通过的端口redsocks
。
答案2
我没有使用过 hostapd,但它可能会修改路由表(甚至可能是 iptables)。
启动 hostapd 后,最好运行
网络状态监测
iptables -t nat -L
iptables -t 过滤器 -L
并尝试找出数据包的目的地。
然后,启动你的 redsocks 并重新查看完整的 iptables 设置
让我知道这些输出,我也许能帮忙
答案3
对我来说,redsocks 与“socks5”代理一起工作,对于“http”代理,我用“transocks”替换它,我的 iptables 配置如下所示:
#!/usr/bin/bash
# Transocks: https://github.com/cybozu-go/transocks
set -e
stty -echoctl
# Point to the transparent socket port (running in an exclusive user)
TRANSOCKS_PORT=12345
TRANSOCKS_USER=transocks
# Redirect all the network of your computer (except transocks user)
REDIRECT_LOCAL_NETWORK=1
# Redirect access point (wifi hotspot)
AP_SUBNET_ENABLED=1
AP_SUBNET_IFACE=ap0
AP_SUBNET_RANGE="192.168.12.0/24"
function action_up()
{
echo "-----------------------------"
echo "# Adding iptables chain rules"
echo "-----------------------------"
iptables -v -t nat -N TRANSOCKS
iptables -v -t nat -A TRANSOCKS -d 0.0.0.0/8 -j RETURN
iptables -v -t nat -A TRANSOCKS -d 10.0.0.0/8 -j RETURN
iptables -v -t nat -A TRANSOCKS -d 100.64.0.0/10 -j RETURN
iptables -v -t nat -A TRANSOCKS -d 127.0.0.0/8 -j RETURN
iptables -v -t nat -A TRANSOCKS -d 169.254.0.0/16 -j RETURN
iptables -v -t nat -A TRANSOCKS -d 172.16.0.0/12 -j RETURN
iptables -v -t nat -A TRANSOCKS -d 192.168.0.0/16 -j RETURN
iptables -v -t nat -A TRANSOCKS -d 198.18.0.0/15 -j RETURN
iptables -v -t nat -A TRANSOCKS -d 224.0.0.0/4 -j RETURN
iptables -v -t nat -A TRANSOCKS -d 240.0.0.0/4 -j RETURN
iptables -v -t nat -A TRANSOCKS -p tcp -j REDIRECT --to-ports $TRANSOCKS_PORT
if [ "$REDIRECT_LOCAL_NETWORK" = 1 ]; then
echo "--------------------------------"
echo "# Redirecting non-transocks user"
echo "--------------------------------"
iptables -v -t nat -A OUTPUT -p tcp -m owner ! --uid-owner $TRANSOCKS_USER -j TRANSOCKS
fi
if [ "$AP_SUBNET_ENABLED" = 1 ]; then
echo "-----------------------"
echo "# Redirecting AP subnet"
echo "-----------------------"
iptables -v -t nat -I PREROUTING -i $AP_SUBNET_IFACE -s $AP_SUBNET_RANGE -j TRANSOCKS
iptables -v -I INPUT -i $AP_SUBNET_IFACE -s $AP_SUBNET_RANGE -p tcp -m tcp --dport $TRANSOCKS_PORT -j ACCEPT
fi
}
function action_down()
{
if [ "$REDIRECT_LOCAL_NETWORK" = 1 ]; then
echo "------------------------------"
echo "# Cleaning non-transocks rules"
echo "------------------------------"
iptables -v -t nat -D OUTPUT -p tcp -m owner ! --uid-owner $TRANSOCKS_USER -j TRANSOCKS
fi
if [ "$AP_SUBNET_ENABLED" = 1 ]; then
echo "--------------------------"
echo "# Cleaning AP subnet rules"
echo "--------------------------"
iptables -v -t nat -D PREROUTING -i $AP_SUBNET_IFACE -s $AP_SUBNET_RANGE -j TRANSOCKS
iptables -v -D INPUT -i $AP_SUBNET_IFACE -s $AP_SUBNET_RANGE -p tcp -m tcp --dport $TRANSOCKS_PORT -j ACCEPT
fi
echo "-----------------------------"
echo "# Cleaning and removing chain"
echo "-----------------------------"
iptables -v -F TRANSOCKS -t nat
iptables -v -X TRANSOCKS -t nat
}
trap 'action_down' SIGINT
action_up
echo
echo "Hit Ctrl+C to remove the ip table rules"
echo
while :
do
sleep 1
done