Como você configura a passagem da Internet (conexão reversa) no linux?

19

Eu tenho um HTC Desire S que tem a opção de conectar através de usb e usar a conexão de internet do computador. Isso funciona bem no Windows, mas estou lutando para configurá-lo no Ubuntu. Quando conecto e seleciono o acesso à Internet no menu usb, o dispositivo usb1 é criado e posso executar ping no endereço IP. Eu tentei várias configurações do iptables e defini o nat, mas não tenho certeza se estou fazendo certo ou se precisa haver alguma configuração adicional ...

Obrigado por qualquer ajuda.

cinza azulado
fonte
Comecei a trabalhar usando uma combinação de informações em trac.osuosl.org/trac/replicant/wiki/ReplicantUSBNetworking e translate.googleusercontent.com/… . Responda abaixo.
BlueGray

Respostas:

11

O seguinte funciona por um tempo, mas apenas para o navegador.

Ao conectar o telefone via usb e escolher a passagem pela Internet, você deve obter um novo dispositivo RNDIS (usb0 ou usb1). Para o ubuntu, edite o / etc / network / interfaces e adicione as seguintes linhas:

iface usb0 inet dhcp
iface usb1 inet dhcp

Isso atribuirá um IP automaticamente quando o dispositivo for adicionado. Se um endereço de rede não for atribuído automaticamente a usb0 ou usb1, você deverá fazê-lo manualmente.

Então você precisa configurar o NAT no seu computador Linux. Algo como:

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

Você também precisa de um servidor DNS:

sudo apt-get install bind9

Isso funciona por alguns minutos, mas depois de um tempo o telefone desiste de procurar o HTC Sync e se desconecta.

Para telefones com root

Você pode se conectar permanentemente se tiver um telefone raiz (o fre3vo funcionou para mim). Execute o seguinte com adb.

Ative o modo usb para rede e adb:

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

Atribua um IP ao dispositivo usb0 no telefone:

adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up

Adicione uma rota padrão. O IP deve ser o IP atribuído a usb0 no linux:

adb shell route add default gw 192.168.99.1 dev usb0

Defina o servidor DNS. Este é o servidor DNS aberto do Google, mas pode ser o IP do seu computador Linux se você tiver um servidor DNS:

adb shell setprop net.dns1 8.8.8.8
cinza azulado
fonte
2
Segundo a lenda, você pode falsificar a sincronização do HTC fazendo o seguinte: Nos telefones HTC, quando você conecta o usb e seleciona a passagem da Internet, ele aguarda a sincronização do HTC e desiste. Está escutando na porta 6000. Portanto, você só precisa falsificar a sincronização do HTC com o netcat. Tente isso na linha de comando: phoneip=$(arp -n | grep usb | awk '{print $1}') echo -n -e "\x00\x02\x00\x00" | nc $phoneip 6000 > /dev/null O valor hexadecimal de 00 02 00 00é tudo o que ele está procurando.
geffchang
@geffchang, Obrigado! Para usuários do Windows, quando o celular está tentando se conectar via USB, você pode executar netsh interface ip show configpara ver todos os nomes de interface e netsh interface ip show config name="Local Area Connection #2"obter apenas essa interface, onde Local Area Connection #2está o nome do novo adaptador. Você pode renomear isso por conveniência.
Sam Hasler
3

A fez essa pequena festança para automatizar tudo. Basta conectar o telefone no modo de carregamento ao computador e executar este 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
DaMs
fonte
0

Como eu mesmo não tenho acesso à máquina Linux, não posso testar esta solução, mas você pode tentar as etapas descritas aqui (tradução do Google para o russo) .

Comentários à tradução:

  • "rutovanym" significa enraizado;
  • WB ou BB significa Big Brother (desktop);
  • smarta é a abreviação de "smartphone".

Boa sorte!

nonsleepr
fonte
Obrigado, mas há uma maneira mais fácil do que conectar as interfaces.
quer
0

Ok, aqui está exatamente o que eu fiz, nenhum enraizamento da HTC desejado:

Instalação bind9 e NAT etc ...

note: 1: se você apenas fizer sudo echo 1> / proc / sys / net / ipv4 / ip_forward, receberá um erro de permissão, então aqui está um script para o processo 2: Você pode tornar as tabelas de ip mais específicas sobre como ele faz as coisas, adicionando parâmetros para dispositivos específicos.


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

agora conecte seu telefone e selecione 'Internet Pass Through'

aguarde o dispositivo aparecer: ifconfig verifique também em: arp

Descobri que era necessário desconectar o dispositivo e conectá-lo novamente para que ele apareça no arp; as coisas não funcionarão corretamente se o arp não mostrar o dispositivo.

O dispositivo fica aguardando que o HTC Sync envie uma mensagem para que você precise zombar da mensagem do 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

Posso escrever uma versão disso usando o D-Bus, para que a última parte seja executada automaticamente quando o dispositivo estiver conectado, etc.

Ok, aqui está o meu trabalho em andamento, eu não consegui encontrar nada 'genérico' no d-bus, então optei por uma solução de hack usando o udev. Isso não é perfeito, por exemplo, o comando é executado duas vezes, então eu vou ter que ver se consigo filtrar os parâmetros correspondentes um pouco melhor, também adicionar um tempo limite no último script, apenas colocar e ver se consigo substituir o arp por algo um pouco melhor, digamos procurando em / proc

here.s meu arquivo .rules em /etc/udev/rules.d Criei


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

Você pode chamá-lo como quiser, mas NÃO O INICIE COM UM NÚMERO, para que seja executado por último.

Adicione o seguinte ao arquivo como sudo usando um editor de sua escolha, etc ....


#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

Basicamente, se você não vê esses 3 'r's,


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

Então você precisará de mais dois arquivos, um para encadear o outro, já que o RUN do udev bloqueará todo o resto (mesmo que tenha sido executado por último !!) ... hmm ... de qualquer maneira:

Eu criei os arquivos no meu diretório pessoal por enquanto "/ home / olli /" ... então lembre-se de substituir o bit '/ home / olli /' por onde você criar os arquivos:

então, para mim, CD para o meu diretório pessoal.


cd ~

crie um arquivo chamado


chain_mock_htc_sync.sh

contendo o seguinte:



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

torná-lo executável


chmod +x chain_mock_htc_sync.sh

crie outro arquivo chamado


mock_htc_sync.sh

contendo o seguinte


#!/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

Torne executável:

chmod +x mock_htc_sync.sh

Espero ter uma boa versão arrumada assim que pos. (provavelmente amanhã).

user2330377
fonte
0

Para tethering reverso de USB com Android e Linux sem enraizamento, veja minha resposta aqui

salutepc
fonte