Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Installing Python MTProxy on CentOS 8 with Python update #293

Open
kmurachev opened this issue Jul 14, 2023 · 5 comments
Open

Installing Python MTProxy on CentOS 8 with Python update #293

kmurachev opened this issue Jul 14, 2023 · 5 comments

Comments

@kmurachev
Copy link

yum -y install epel-release
yum -y update
yum -y upgrade
yum -y install wget htop nano mc vim-common traceroute bind-utils yum-utils lsof net-tools git
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
firewall-cmd --list-all
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
echo 'net.core.default_qdisc=fq' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv4.tcp_congestion_control=bbr' | sudo tee -a /etc/sysctl.conf
sysctl -p
sysctl net.ipv4.tcp_available_congestion_control

# This should include bbr in it

sysctl -n net.ipv4.tcp_congestion_control

# This one should be bbr

lsmod | grep bbr

# The output will be similar to "tcp_bbr 16384 0"

python3 -V

>> Python 3.6.8

yum groupinstall 'development tools' -y && yum install wget openssl-devel bzip2-devel libffi-devel xz-devel -y
cd /tmp
wget https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tgz
tar xzf Python-3.11.4.tgz
cd Python-3.11.4 && ./configure --enable-optimizations
make altinstall
ls /usr/local/bin/python*
alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.11 1 && alternatives --set python3 /usr/local/bin/python3.11 && echo "3" | alternatives --config python
/usr/local/bin/python3.11 -m pip install --upgrade pip
ls /usr/local/bin/pip*
alternatives --install /usr/bin/pip pip /usr/local/bin/pip3.11 1 && alternatives --set pip /usr/local/bin/pip3.11
python -V && pip -V

>> Python 3.11.4
>> pip 23.1.2 from /usr/local/lib/python3.11/site-packages/pip (python 3.11)

head -c 16 /dev/urandom | xxd -ps
echo -n "www.cloudflare.com" | od -A n -t x1 | sed 's/ *//g'

AD_TAG = "<tag>"

git clone -b stable https://github.com/alexbers/mtprotoproxy.git /opt/mtprotoproxy
cd /opt/mtprotoproxy
nano /opt/mtprotoproxy/config.py
useradd --no-create-home -s /usr/sbin/nologin tgproxy
nano /etc/systemd/system/mtprotoproxy.service
[Unit]
    Description=Async MTProto proxy for Telegram
    After=network-online.target
    Wants=network-online.target

[Service]
    ExecStart=/opt/mtprotoproxy/mtprotoproxy.py
    AmbientCapabilities=CAP_NET_BIND_SERVICE
    LimitNOFILE=infinity
    User=tgproxy
    Group=tgproxy
    Restart=on-failure

[Install]
    WantedBy=multi-user.target

pip install setuptools_rust
pip install cryptography
pip install uvloop
systemctl enable mtprotoproxy
systemctl daemon-reload
systemctl restart mtprotoproxy
systemctl status mtprotoproxy
journalctl -u mtprotoproxy | cat
@kmurachev
Copy link
Author

Столкнулся с тем, что не прогружаются картинки в каналах, по типу как в
#283 (comment)

попробовал изменить
MAX_CONNS_IN_POOL на 8 как тут #283 (comment) , но особо ничего не поменялось
В итоге изменил на 1 как тут #169 (comment) и пока вроде всё работет и грузится

@alexbers
Copy link
Owner

Хм.. интересно, вероятно, у них что-то поменялось, гляну

@kmurachev
Copy link
Author

Тут https://github.com/alexbers/mtprotoproxy/wiki/Optimization-and-Fine-Tuning с целью повышения производительности прокси рекомендовано внести в конфиг

nano /opt/mtprotoproxy/config.py
TO_CLT_BUFSIZE = 262144
TO_TG_BUFSIZE = 262144

а какие ещё документированные настройки имеются?

Где-то пробегало, что если проблема с ntp-синхронизацией на сервере, то (не)рекомендуется внести в конфиг
IGNORE_TIME_SKEW = True

также пробегали, но уже не вспомню, где и для чего
BLOCK_IF_FIRST_PKT_BAD = False
REPLAY_CHECK_LEN = 0

@alexbers
Copy link
Owner

REPLAY_CHECK_LEN - это сколько хранить последних хендшейков для защиты от активных replay-атак, направленных на детектирование прокси
IGNORE_TIME_SKEW - принимать ли соединение от клиентов с плохим временем (если принимать, увеличивается шанс детекции из-за replay-атак)

А в целом настроек много, их можно посмотреть в исходнике, продублирую сюда

    # accept incoming connections only with proxy protocol v1/v2, useful for nginx and haproxy
    conf_dict.setdefault("PROXY_PROTOCOL", False)

    # set the tls domain for the proxy, has an influence only on starting message
    conf_dict.setdefault("TLS_DOMAIN", "www.google.com")

    # enable proxying bad clients to some host
    conf_dict.setdefault("MASK", True)

    # the next host to forward bad clients
    conf_dict.setdefault("MASK_HOST", conf_dict["TLS_DOMAIN"])

    # set the home domain for the proxy, has an influence only on the log message
    conf_dict.setdefault("MY_DOMAIN", False)

    # the next host's port to forward bad clients
    conf_dict.setdefault("MASK_PORT", 443)

    # use upstream SOCKS5 proxy
    conf_dict.setdefault("SOCKS5_HOST", None)
    conf_dict.setdefault("SOCKS5_PORT", None)
    conf_dict.setdefault("SOCKS5_USER", None)
    conf_dict.setdefault("SOCKS5_PASS", None)

    if conf_dict["SOCKS5_HOST"] and conf_dict["SOCKS5_PORT"]:
        # Disable the middle proxy if using socks, they are not compatible
        conf_dict["USE_MIDDLE_PROXY"] = False

    # user tcp connection limits, the mapping from name to the integer limit
    # one client can create many tcp connections, up to 8
    conf_dict.setdefault("USER_MAX_TCP_CONNS", {})

    # expiration date for users in format of day/month/year
    conf_dict.setdefault("USER_EXPIRATIONS", {})
    for user in conf_dict["USER_EXPIRATIONS"]:
        expiration = datetime.datetime.strptime(conf_dict["USER_EXPIRATIONS"][user], "%d/%m/%Y")
        conf_dict["USER_EXPIRATIONS"][user] = expiration

    # the data quota for user
    conf_dict.setdefault("USER_DATA_QUOTA", {})

    # length of used handshake randoms for active fingerprinting protection, zero to disable
    conf_dict.setdefault("REPLAY_CHECK_LEN", 65536)

    # accept clients with bad clocks. This reduces the protection against replay attacks
    conf_dict.setdefault("IGNORE_TIME_SKEW", False)

    # length of last client ip addresses for logging
    conf_dict.setdefault("CLIENT_IPS_LEN", 131072)

    # delay in seconds between stats printing
    conf_dict.setdefault("STATS_PRINT_PERIOD", 600)

    # delay in seconds between middle proxy info updates
    conf_dict.setdefault("PROXY_INFO_UPDATE_PERIOD", 24*60*60)

    # delay in seconds between time getting, zero means disabled
    conf_dict.setdefault("GET_TIME_PERIOD", 10*60)

    # delay in seconds between getting the length of certificate on the mask host
    conf_dict.setdefault("GET_CERT_LEN_PERIOD", random.randrange(4*60*60, 6*60*60))

    # max socket buffer size to the client direction, the more the faster, but more RAM hungry
    # can be the tuple (low, users_margin, high) for the adaptive case. If no much users, use high
    conf_dict.setdefault("TO_CLT_BUFSIZE", (16384, 100, 131072))

    # max socket buffer size to the telegram servers direction, also can be the tuple
    conf_dict.setdefault("TO_TG_BUFSIZE", 65536)

    # keepalive period for clients in secs
    conf_dict.setdefault("CLIENT_KEEPALIVE", 10*60)

    # drop client after this timeout if the handshake fail
    conf_dict.setdefault("CLIENT_HANDSHAKE_TIMEOUT", random.randrange(5, 15))

    # if client doesn't confirm data for this number of seconds, it is dropped
    conf_dict.setdefault("CLIENT_ACK_TIMEOUT", 5*60)

    # telegram servers connect timeout in seconds
    conf_dict.setdefault("TG_CONNECT_TIMEOUT", 10)

    # listen address for IPv4
    conf_dict.setdefault("LISTEN_ADDR_IPV4", "0.0.0.0")

    # listen address for IPv6
    conf_dict.setdefault("LISTEN_ADDR_IPV6", "::")

    # listen unix socket
    conf_dict.setdefault("LISTEN_UNIX_SOCK", "")

    # prometheus exporter listen port, use some random port here
    conf_dict.setdefault("METRICS_PORT", None)

    # prometheus listen addr ipv4
    conf_dict.setdefault("METRICS_LISTEN_ADDR_IPV4", "0.0.0.0")

    # prometheus listen addr ipv6
    conf_dict.setdefault("METRICS_LISTEN_ADDR_IPV6", None)

    # prometheus scrapers whitelist
    conf_dict.setdefault("METRICS_WHITELIST", ["127.0.0.1", "::1"])

    # export proxy link to prometheus
    conf_dict.setdefault("METRICS_EXPORT_LINKS", False)

    # default prefix for metrics
    conf_dict.setdefault("METRICS_PREFIX", "mtprotoproxy_")

@kmurachev
Copy link
Author

спасибо Вам большое, что до сих пор продолжаете поддерживать проект,
несмотря на то, что офф. команда то ли вообще его забросила, то ли выжидает чего, им одним только известно

и хоть пока тема прокси и не актуальна в этой стране, но
надо быть готовым к любой подляне внезапно,
держать "порох сухим", ткскзтб

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants