您如何在Linux上设置Internet直通(反向绑定)?


19

我有一个HTC Desire S,可以选择通过USB连接并使用计算机的Internet连接。这在Windows上可以正常工作,但是我正在努力在Ubuntu中进行设置。当我插入电源并从usb菜单中选择Internet pass-through时,就会创建usb1设备,并且可以ping它的ip地址。我已经尝试了各种iptables配置并设置了nat,但是我不确定自己是否做对了,或者是否需要其他配置...

谢谢你的帮助。


我结合使用了来自trac.osuosl.org/trac/replicant/wiki/ReplicantUSBNetworkingtranslate.googleusercontent.com/…的信息组合来使其正常工作。请在下面回答。
bluegray

Answers:


11

以下内容可以使用一段时间,但仅适用于浏览器。

通过usb插入电话并选择Internet pass-through时,您应该获得一个新的RNDIS设备(usb0或usb1)。对于ubuntu,编辑/ etc / network / interfaces并添加以下行:

iface usb0 inet dhcp
iface usb1 inet dhcp

添加设备后,这将自动分配IP。如果未将网络地址自动分配给usb0或usb1,则必须手动进行操作。

然后,您需要在Linux计算机上设置NAT。就像是:

sudo iptables -A POSTROUTING -t nat -j MASQUERADE
sudo echo 1 > /proc/sys/net/ipv4/ip_forward 

您还需要一个DNS服务器:

sudo apt-get install bind9

这可以工作几分钟,但过一会儿电话会放弃寻找HTC Sync并断开连接。

对于有根电话

如果您的手机已扎根,则可以永久连接(fre3vo对我有用)。使用adb执行以下操作。

为网络和ADB启用USB模式:

adb shell echo 6 > /sys/devices/platform/msm_hsusb/usb_function_switch

为电话上的usb0设备分配IP:

adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up

添加默认路由。该IP应该是在Linux中分配给usb0的IP:

adb shell route add default gw 192.168.99.1 dev usb0

设置DNS服务器。这是Google的开放式DNS服务器,但如果您有DNS服务器,则它可以是Linux计算机的IP:

adb shell setprop net.dns1 8.8.8.8

2
根据传说,您可以通过执行以下操作来伪造HTC同步:在HTC手机上,当您插入USB并选择Internet直通时,它将等待HTC同步并放弃。它正在侦听端口6000。因此,您只需要伪造HTC与netcat同步。在命令行中尝试以下操作: phoneip=$(arp -n | grep usb | awk '{print $1}') echo -n -e "\x00\x02\x00\x00" | nc $phoneip 6000 > /dev/null 的十六进制值00 02 00 00就是它要查找的全部。
geffchang

@geffchang,谢谢!对于Windows用户,当移动设备尝试通过USB进行连接时,您可以运行netsh interface ip show config以查看所有接口名称,然后netsh interface ip show config name="Local Area Connection #2"仅获取该接口,Local Area Connection #2新适配器被称为何处。为了方便起见,您可以重命名。
山姆·哈斯勒

3

一个使这个小bash自动化。只需将手机以充电模式插入计算机,然后运行此bash。

#!/bin/bash
/opt/android-sdk-update-manager/platform-tools/adb shell 'echo 6 > /sys/devices/platform/msm_hsusb/usb_function_switch'
sleep 1
/opt/android-sdk-update-manager/platform-tools/adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up
sleep 1
/opt/android-sdk-update-manager/platform-tools/adb shell setprop net.dns1 8.8.8.8

get_ip ()
{
ifconfig usb0 | grep inet | awk '{print $2}' | sed 's/addr://' | grep .
}

echo "waiting for IP on computer usb0"
while [[ `get_ip` < 192 ]];do sleep 2; done
ip=`get_ip`
echo "IP adress is $ip "
/opt/android-sdk-update-manager/platform-tools/adb shell route add default gw $ip dev usb0
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

0

由于我自己没有使用Linux机器的权限,因此无法测试此解决方案,但是您可以尝试此处描述 的步骤(来自俄语的Google翻译)

翻译评论:

  • “ rutovanym”是指扎根;
  • WB或BB表示“老大哥”(桌面);
  • smarta是“ smartphone's”的缩写。

祝好运!


谢谢,但是有一个比桥接接口更简单的方法。
bluegray 2011年

0

好的,这正是我所做的,不需要HTC扎根:

设置bind9和NAT等...

注意:1:如果只执行sudo echo 1> / proc / sys / net / ipv4 / ip_forward,则会出现权限错误,因此这是该过程的脚本2:您可以通过以下方式使iptables更具体地进行处理:为特定设备添加参数。


cd ~
echo '!/bin/bash
apt-get install bind9
iptables -A POSTROUTING -t nat -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward' > setup_bind9_nat.sh

chmod +x setup_bind9_nat.sh
sudo ./setup_bind9_nat.sh

现在插入电话,然后选择“互联网通过”

等待设备出现在: ifconfig 检查设备 是否也在: arp

我发现必须拔出设备的电源,然后再次插入才能使它出现在arp中,如果arp未显示该设备,则说明该设备无法正常工作。

然后,设备将等待HTC Sync向其发送消息,因此您必须模拟HTC Syncs消息:


#change this line to be more specific if you have more than one usb network device
phone_usb_device="usb"
get_ip ()
{
    arp -n | grep $phone_usb_device | awk '{print $1}'
}

#TODO: This needs a timeout and loop needs cleaning up, but works fine and borrowed from another post.
echo "waiting for IP on computer usb"
while [[ `get_ip` < 192 ]];do sleep 2; done
phoneip=`get_ip`
echo "IP adress is $phoneip "

echo -n -e "\x00\x02\x00\x00" | nc -q 2 $phoneip 6000 > /dev/null

我可能会使用D-Bus编写此版本,因此当插入设备等时,后者会自动执行。

好的,这是我正在进行的工作,我在d-bus上找不到任何“通用”的东西,因此我选择了使用udev的一些hack解决方案。这不是完美的,例如命令被运行了两次,所以我'必须看看我是否可以更好地过滤匹配的参数,还要在最后一个脚本上添加一个超时,以防万一,看看我是否可以将arp替换为更好的东西,例如查看/ proc

这是我从/etc/udev/rules.d创建的.rules文件


cat /etc/udev/rules.d/htc-desire.rules

您可以随意调用它,但不要以数字开头,这样它才能最终运行。

使用您选择的编辑器将以下内容作为sudo添加到文件中...


#KERNEL=="usb?" or DRIVERS=="usb" not sure which is best, may need extra mode information too from usb device.
SUBSYSTEM=="net", DRIVERS=="usb", ATTRS{manufacturer}=="HTC", ATTRS{idProduct}=="0ffe", RUN+="/home/olli/chain_mock_htc_sync.sh $kernel"


Ubuntu is setup to create the file with the correct permissions already 


ls -lrt /etc/udev/rules.d/htc-desire.rules 
-rw-r--r-- 1 root root 248 Jun 26 22:09 htc-desire.rules

基本上,如果您没有看到这3个“ r”,


sudo chmod a+r /etc/udev/rules.d/htc-desire.rules 

然后,您将需要另外两个文件,一个要链接另一个文件,因为udev的RUN会阻止其他所有文件(即使最后运行!)……嗯……无论如何:

我现在在主目录中创建了“ / home / olli /”文件,因此请记住将“ / home / olli /”位替换为创建文件的位置:

所以对我来说,cd到我的主目录。


cd ~

创建一个名为


chain_mock_htc_sync.sh

包含以下内容:



#!/bin/bash
/home/olli/mock_htc_sync.sh "$1" &
exit

使它可执行


chmod +x chain_mock_htc_sync.sh

创建另一个名为


mock_htc_sync.sh

包含以下内容


#!/bin/bash
#change this line to be more specific if you have more than one usb network device

phone_usb_device="$1"
get_ip ()
{
    arp -n | grep $phone_usb_device | awk '{print $1}'
}

#TODO: This needs a timeout and loop needs cleaning up, but works fine and borrowed from another post.
echo "waiting for IP on computer $phone_usb_device"
while [[ `get_ip`  /dev/null

使它可执行:

chmod +x mock_htc_sync.sh

希望我尽快在pos上有一个很好的整理版本。(大概是明天)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.