Conceder acesso ao servidor na Internet, via cliente conectado por SSH

17

Posso usar meu computador doméstico A para conectar-me por SSH a um servidor B onde o acesso à rede externa está bloqueado. Em outras palavras, todas as solicitações de Internet de B geram um erro: A rede está inacessível . Posso redirecionar todas essas solicitações para passar pelo computador A que possui acesso irrestrito à Internet?

O servidor B é um servidor que hospeda um dos meus sites. Quero baixar arquivos para instalar algum software. Mas a conexão está bloqueada. Eu era capaz de transferir arquivos, mas foi complicado porque as versões de software são diferentes em A e B , então as dependências onde diferente e é necessário arquivos diferentes em A e B .

Pesquisei na Internet e parece que preciso de um túnel reverso. Mas só encontrei soluções em que uma porta é redirecionada . Mas não é o que eu preciso, pois não quero que B acesse A, mas a Internet.

AL
fonte
se o autor da pergunta abaixo vir esse comentário, você gostaria de nos informar por quê? Não vejo nada de errado com isso, mesmo que a resposta "não seja possível".
strugee
Possível duplicata de unix.stackexchange.com/questions/111972/…
Lawrence
O ssh permite que você faça o encaminhamento de porta local ou remoto - ou seja, quando um aplicativo em B tenta abrir uma porta local X, que é encaminhada para A como uma tentativa de abrir qualquer porta que você especificou. Portanto, A é livre para encaminhar a solicitação de conexão para a Internet. Você não mencionou quais portas ou protocolos você está tentando usar, o que facilitaria a construção de respostas detalhadas.
precisa saber é o seguinte
Estou tentando usar o compositor , então deve haver solicitações HTTP e HTTPS para o github para fazer o download dos pacotes.
AL

Respostas:

8

Você pode executar um proxy no Computador A ao qual o computador B se conectaria para acessar a Internet através do Computador A.

Algo assim

             +----------+            +-----------+
             |          |+----SSH+-->|           |
             |     A    |            |    B      |
             |+--------+|            |           |
  Internet <-++-+PROXY<++<SSH Tunnel--+          |
             |+--------+|            |           |
             +----------+            +-----------+

Instale um proxy como o squid em A que escute na porta 3128 e, em seguida, você pode ssh no servidor com isso -
ssh -L 3128:127.0.0.1:3128 user@B

Isso permitirá que B acesse a Internet através de A

Lawrence
fonte
Uma vez conectado a B, como as solicitações à Internet serão redirecionadas para A? Não há configuração para mudar?
AL
Você precisará definir um servidor proxy em B para 127.0.0.1:3128
Lawrence
10

Basta adicionar mais alguns passos claros às respostas do @Lawrence e do @ SpiRail.

Faça a configuração da seguinte maneira:

Configuração no host A:

  1. Instale o servidor proxy Squid no host A. Por padrão, o Squid escuta na porta 3128.
    yum install squid
  2. Comente o http_access deny alldepois adicione http_access allow all/etc/squid/squid.conf
  3. Se o próprio host A usar algum proxy, diga 10.140.78.130:8080 para conectar-se à Internet e adicione esse proxy da /etc/squid/squid.confseguinte maneira:
refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880
cache_peer 10.140.78.130 parent 8080 0 no-query default
never_direct allow all

Configuração no host B:

  1. Adicione as seguintes entradas ao / etc / environment
export http_proxy=http://127.0.0.1:3129
export https_proxy=http://127.0.0.1:3129
  1. source /etc/environment

Agora nossa configuração está concluída.

Criando túnel SSH com encaminhamento de porta remota

  1. Execute o seguinte comando SSH no Host A
    ssh -R 3129:localhost:3128 user@HostB

    Se você deseja criar um túnel SSH persistente, pode usar o autossh da seguinte maneira:
    autossh -M 20000 -f -NT -R 3129:localhost:3128 user@HostB
    Para que o comando autossh acima funcione, você deve ter as chaves SSH configuradas do HostA para o HostB

  2. Isso permitirá que o Host B acesse a Internet através do Host A.

Verificando a internet:

  1. Execute o seguinte comando no Host B
    wget https://google.com

Diagrama de fluxo de tráfego : insira a descrição da imagem aqui

Dhiru
fonte
5

A resposta de @ Lawrence foi boa o suficiente para que eu conseguisse entender tudo. Mas aqui estão as etapas mais detalhadas que eu usei.

Eu usei isso para usar o meu laptop dongle 4G para rotear a Internet para um raspberry pi com uma conexão de linha fixa a um roteador wifi.

Se o seu host for um mac: instale o squidman http://squidman.net/squidman/

(não apenas o squid genérico, tive muitos problemas ao construí-lo) As configurações padrão pareciam boas o suficiente para mim.

conecte ao 4G conecte ao wifi - configure um ip estático no seu wifi e remova o endereço do gateway (a menos que você esteja fazendo coisas avançadas), caso contrário, você terá duas rotas padrão e isso é muito irritante. - verifique se o seu roteador wifi não está usando o mesmo intervalo 192.168.xy (configure um "x" diferente neste caso)

ssh -R 8080:localhost:8080 pi@<ip address of the pi or target machine>

No PI

export http_proxy=http://localhost:8080

com visudo adicione o texto:

Defaults env_keep = "http_proxy https_proxy ftp_proxy"

Agora o wget funcionará e o sudo apt-get também poderá instalar pacotes.

Se você quiser o git, também está aqui: /programming/128035/how-do-i-pull-from-a-git-repository-through-an-http-proxy

SpiRail
fonte
Obrigado pela sua resposta. Qual é o papel visudodaqui? Onde você adiciona o texto? (Eu não posso usar sudona minha hospedagem na Web)
AL
Eu realmente não entendo sua pergunta, mas se você apenas digitar visudo no terminal (pode precisar de um 'sudo visudo'), poderá adicionar a linha de texto na parte inferior.
SpiRail 18/03/16
não há acesso root na minha hospedagem na Web.
AL
Foi há muito tempo agora. Porém, a partir da memória, a edição visualiza o arquivo sudoers e a linha que está sendo adicionada significa que essas variáveis ​​de ambiente do usuário são mantidas ao digitar sudo. Se você não pode executar o sudo, não precisa dessa etapa.
SpiRail