Использование HTTP proxy и SOCKS в Linux

    В Linux существует много полезных консольных команд, которые при необходимости хотелось бы запустить через proxy. Некоторые приложения имеют встроенную поддержку proxy, а некоторые нет. Далее описано как пользоваться востребованными утилитами через proxy, даже теми, которые этой поддержки не имеют.

    curl: передача данных через proxy


    curl имеет полноценную поддержку как HTTP proxy так и SOCKS.

    Для тестирования возможно использовать proxy сервера из бесплатных списков (socks — sockslist.net, и HTTP proxy — proxyhttp.net). Проверка IP адреса будет производиться с помощью ресурса check-host.net

    # Проверить HTTP proxy
    curl --proxy 11.22.33.44:5555 check-host.net/ip
    # Тоже самое, но если для HTTP proxy требуется авторизация
    curl --proxy 11.22.33.44:5555 -U username:password check-host.net/ip
    # Проверить socks4
    curl --socks4 11.22.33.44:5555 check-host.net/ip
    # Проверить socks5
    curl --socks5 11.22.33.44:5555 check-host.net/ip
    # Тоже самое, только преобразование имен идет также через SOCKS
    # (подробнее о преобразовании имен можно прочитать ниже в подразделе "DNS запросы через proxy")
    curl --socks5-hostname 11.22.33.44:5555 check-host.net/ip
    



    Часть параметров curl можно записать в файл ~/.curlrc:
    socks5 = 11.22.33.44:5555
    proxy-user = username:password
    user-agent = "Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"
    


    С помощью time и curl также можно замерить время отклика сервера:
    # Без proxy:
    time curl check-host.net/ip
    # С proxy:
    time curl --socks5 11.22.33.44:5555 check-host.net/ip
    # Или любого сайта:
    time curl habrahabr.ru
    


    Результат будет выглядеть так:
    real    0m0.307s
    user    0m0.000s
    sys     0m0.004s
    


    wget: закачка файлов через proxy



    wget имеет встроенную поддержку proxy. Недостаток лишь в том, что только поддержку HTTP proxy. Для использования совместно с SOCKS рекомендуется использовать соксификатор dante.

     # Скачать файл через proxy:
    http_proxy="http://33.22.44.44:8080" wget http://www.google.com/favicon.ico
      Тоже самое, но для HTTPS
    https_proxy="http://33.22.44.44:8080" wget https://www.google.com/favicon.ico
     # Использовать proxy с авторизацией
    http_proxy="http://33.22.44.44:8080" wget --proxy-user=user --proxy-password=password http://www.google.com/favicon.ico
    


    Чтобы все время не указывать --proxy-user и --proxy-password можно их прописать в файл ~/.wgetrc:
    proxy-user = username
    proxy-password = password
    user-agent = Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
    


    ssh: доступ к серверам



    Для доступа к серверам через ssh и proxy также лучше использовать соксификатор dante.

    Соксификатор dante



    Установка:
    apt-get install dante-client # пример для Debian-based систем
    


    Использование:
    # Если требуется зайти по ssh на сервер
    SOCKS_PASSWORD="" SOCKS_SERVER="11.22.33.44:1080" socksify ssh myserver
    # Тоже самое, только если для подключения к соксу требуется авторизация
    SOCKS_USERNAME="user" SOCKS_PASSWORD="password" SOCKS_SERVER="11.22.33.44:1080" socksify ssh myserver  
    # Пример с использованием IRC клиента - irssi
    SOCKS_PASSWORD="" SOCKS_SERVER="11.22.33.44:1080" socksify irssi
    # Тоже самое, только с использованием HTTP proxy с поддержкой метода CONNECT
    HTTP_CONNECT_PROXY="http://11.22.33.44:8080" socksify irssi
    


    С помощью socksify можно направить через proxy почти любое приложение, не только консольное.

    Чтобы все время не вводить данные о proxy можно создать файл /etc/socks.conf
    Пример для SOCKS:
    route {
    	from: 0.0.0.0/0   to: 0.0.0.0/0   via: 11.22.33.44 port = 55555
    	protocol: tcp udp
    	proxyprotocol: socks_v4 socks_v5
    	method: none
    }
    


    Пример для HTTP proxy с авторизацией:
    route {
    	from: 0.0.0.0/0   to: 0.0.0.0/0   via: 11.22.33.44 port = 8080
    	command: connect
    	proxyprotocol: http
            method: username
    }
    


    А также экспортировать переменные SOCKS_USERNAME и SOCKS_PASSWORD, если для SOCKS или HTTP proxy требуется авторизация:
    export SOCKS_USERNAME="username"
    export SOCKS_PASSWORD="password"
    


    DNS запросы через proxy



    Часто требуется чтобы и преобразование имен происходило через proxy. Если использовать dante, то запрос на преобразование имен идет и через proxy, и через именной сервер указанный в /etc/resolv.conf . Понять почему же идет два одинаковых запроса вместо одного не удалось. Поэтому можно предложить два варианта:
    1) Закомментировать именные сервера в файле /etc/resolv.conf, чтобы преобразование имен шло только через proxy. Это отразится на всей системе.
    2) Изменить /etc/resolv.conf и выставить именные сервера необходимой страны, или просто отличные от серверов провайдера. Например установить сервера Google:
    nameserver 8.8.8.8
    nameserver 8.8.4.4
    


    Чтобы данные не были перезаписаны именными серверами провайдера (при переподключении), можно запретить обновление списка именных серверов сетевому менеджеру (NetworkManager/wicd) или DHCP-клиенту (спасибо ergil за корректировку).

    Или воспользоваться «грубым» методом — запрещением изменения файла /etc/resolv.conf:
    sudo chattr +i /etc/resolv.conf
    


    Если есть какие-то дополнения, пожалуйста, напишите, это будет полезно узнать и применить.

    Дополнительная информация:
    man socks.conf
    man socksify
    man curl
    Поделиться публикацией
    Похожие публикации
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 18
    • +4
      export HTTP_PROXY=1.2.3.4:5
      Работает в 99% случаев. А если еще и сунуть куда-нибудь в /etc/profile — то и в DE обычно подтягивается.
      • +5
        proxychains — создает цепочку из внешних соксов/проксей
        * Allows TCP and DNS tunneling through proxies.
        * Supports HTTP, SOCKS4 and SOCKS5 proxy servers.
        * Different proxy types can be mixed in the same chain.
        * Proxy chain: user-defined list of proxies chained together.
        * Run SSH, telnet, wget, ftp, apt, vnc, nmap through proxy servers.
        и тд…
        установка стандартно через apt-get install proxychains
        домашняя страничка: proxychains.sourceforge.net/
        • +1
          Да, proxychains хороший. Кстати, только у меня с опцией proxy_dns DNS запросы идут через 4.2.2.2, а не через socks?
          % proxychains curl habr.ru
          ProxyChains-3.1 (http://proxychains.sf.net)
          |DNS-request| habr.ru
          |S-chain|-<>-1.2.3.4:5-<><>-4.2.2.2:53-<><>-OK
          |DNS-response| habr.ru is 62.213.71.224
          |S-chain|-<>-1.2.3.4:5-<><>-62.213.71.224:80-<><>-OK
        • 0
          для ssh была такая вещь

          bent.latency.net/bent/git/goto-san-connect-1.85/src/connect.html

          Работает на Маке и Линуксах
          в конфиге просто ~/.ssh/config

          Host myhost.com
          ProxyCommand connect -w 10 -4 -S 192.159.32.155:1080 %h %p

          можно еще сюда вписывать порт если ssh используется как транспортный канал к SVN/SCP /SFTP и так далее
          • +3
            За chattr +i /etc/resolv.conf нужно бить по рукам.
            Просто скажите своему нетворкменеджеру или дхцп-клиенту не обновлять список ДНС-серверов.
            • +2
              Да, действительно, этот вариант более грамотный.
              • +1
                использование расширенных атрибутов на системные файлы вообще очень плохая идея, если систему потом по каким-то причинам придется админить другому человеку он будет долго пытаться понять что это за безобразие происходит.
                • +2
                  Или через некоторое время сам будешь долго пытаться понять это. :)
                  • +1
                    И такое возможно :)
                    Правильный путь тот, что я указал выше, благо что с тем же wicd или networkmanager это решается одной галочкой поставленной в GUI :)
            • +3
              Еще дополнение, если вы хотите скрывать от провайдера куда это Вы пошли, но не хотите использовать бесплатные socks-прокси, то можете использовать встроенный в ssh вариант socks(конечно для этого Вам необходим сервер на который Вы можете сделать ssh)

              $ ssh -D localhost:1080 you_server

              поднимет Вам на порту 1080 SOCKS5-прокси и ходите через него уже куда вашей душе угодно.
              Я сам использую такой вариант, что бы в одном из браузеров ходить с американских IP.
              • 0
                Ничего не путаете??? провайдер то почему не узнает, куда ходит юзер??!
                • 0
                  упс сорри. невнимательность))
                  • 0
                    да ничего страшного ;)
                • +5
                  А еще можно ssh -w any your_server, тогда вообще vpn поднимется.
                  • 0
                    Если целью является «скрывать от провайдера куда это Вы пошли», то это неудачный способ: провайдер спалит Вас на dns, который не заворачивается в вашу проксю.
                    • +2
                      кто мешает завернуть туда же и ДНС-запросы?
                      network.proxy.socks_remote_dns
                      в about:config Вашего Firefox поможет Вам :)
                    • 0
                      зачем такой изврат, когда есть кошерный openvpn?
                      • 0
                        OpenVPN прекрасен, только порой надо направить через прокси траффик одного приложения, а не всей системы. Или нескольких приложений через разные прокси. :)

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое