首页 > 解决方案 > 代理是否允许在任何端口上进行任何类型的连接?

问题描述

我有一个运行 Python 的 Heroku 应用程序,它似乎无法连接到外部 Postgres 数据库。该应用程序使用代理隧道连接到数据库,并且代理本身肯定可以工作,但我不确定该应用程序是否使用它来连接。

以下是相关的代码行: import records as records_client from apps.socks import Socks5Proxy

PROXY_URL='http://username:password@proxyhost:9293'
db_url = 'postgresql://username:password@12.345.6.789:5432/dbname?'

public_ip = requests.get("http://wtfismyip.com/text").text
print('Before proxy: ', public_ip)
# Output: 11.111.1.111

with Socks5Proxy(url=PROXY_URL) as p:
    public_ip = requests.get("http://wtfismyip.com/text").text
    print('Inside proxy: ', public_ip)
    # Output: 22.222.2.222
    
    db = records_client.Database(db_url)
    # FATAL: no pg_hba.conf entry for host "11.111.1.111", user "username", database "dbname", SSL off

我已确保将代理的 IP 地址列入白名单以访问数据库。更令人困惑的是为什么错误消息中的 IP 地址在代理的上下文管理器之前设置了 IP 地址。

以下是Socks5Proxy是否有帮助的定义:

import socks
import socket
from urllib.parse import urlparse

import logging
logger = logging.getLogger(__name__)


SOCKS5_PORT = 1080

class Socks5Proxy(object):
    def __init__(self, url=None, host=None, user=None, password=None):
        if not url and not host:
            raise ValueError('Must supply either a proxy URL or host')

        if url:
            parsed_url = urlparse(url)
            host = parsed_url.hostname
            user = parsed_url.username
            password = parsed_url.password

        socks.set_default_proxy(socks.PROXY_TYPE_SOCKS5, host, SOCKS5_PORT, True, user, password)

    def __enter__(self):
        self.old_socket = socket.socket

        self.proxied_socket = socks.socksocket
        logger.debug('Switching from existing socket %s to proxied socket %s', self.old_socket, self.proxied_socket)
        socket.socket = self.proxied_socket
        return self.proxied_socket

    def __exit__(self, exc_type, exc_value, traceback):
        socket.socket = self.old_socket
        logger.debug('Switching back from proxied socket %s to original socket %s', self.proxied_socket, self.old_socket)

这以前是有效的,所以我倾向于将标题中的问题回答为“是”,但由于 IP 地址不匹配而被抛弃。如何检查连接尝试中使用的 IP 地址?

标签: pythonsocketsproxy

解决方案


推荐阅读