python - 代理是否允许在任何端口上进行任何类型的连接?
问题描述
我有一个运行 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 地址?
解决方案
推荐阅读
- reactjs - AWS Beanstalk CLI 不断部署 react/npm 开发构建
- vbscript - 由多余的分配修复的莫名其妙的崩溃
- javascript - Angular - 如何使用 Angular CLI 创建子组件
- session - Flask WTF CSRF 会话令牌丢失,未找到 secret_key
- django - django ModuleNotFoundError: No module named
- spring - 使用 spring webflux WebClient 进行服务发现
- sql - 将数据类型 varchar 转换为数字时出错 - 但具有数值
- wordpress - 无法在 Docker 上使用 Wordpress 保存帖子
- excel - 如何获取从 A2 到 End 的范围(无选择语句)
- applescript - 当我询问前窗的名称时,AppleScript 返回最后一个 Finder 的名称