Задать вопрос
  • Как настроить NGINX forward proxy в docker c несколькими public IP адресами c опцией round-robin?

    @YuriyTigiev Автор вопроса
    Для firewalld такая комманда должна быть ? Firewalld поддерживает fqdn ?

    firewall-cmd --direct --add-rule ipv4 nat POSTROUTING -p tcp -d ident.me --dport 443 -m statistic --mode nth --every 3 --packet 0 -j SNAT --to 151.23.54.101
    firewall-cmd --direct --add-rule ipv4 nat POSTROUTING -p tcp -d ident.me --dport 443 -m statistic --mode nth --every 2 --packet 0 -j SNAT --to 151.23.54.102
    firewall-cmd --direct --add-rule ipv4 nat POSTROUTING -p tcp -d ident.me --dport 443 -m statistic --mode nth --every 1 --packet 0 -j SNAT --to 151.23.54.101
  • Как настроить NGINX forward proxy в docker c несколькими public IP адресами c опцией round-robin?

    @YuriyTigiev Автор вопроса
    а почему nginx - не отправляет запрос с не дефаулт ip?
  • Как настроить NGINX forward proxy в docker c несколькими public IP адресами c опцией round-robin?

    @YuriyTigiev Автор вопроса
    Можно ли все то что сделанно на iptables переделать на firewalld ?
    Правильно ли было решать эту задачу на nginx ?
  • Как настроить NGINX forward proxy в docker c несколькими public IP адресами c опцией round-robin?

    @YuriyTigiev Автор вопроса
    Настроил все через iptables. Все работает без nginx, но есть три вопроса вопроса.

    1) Как сделать чтобы Iptables поддерживал fqdn? Удаленный сервис может находится в облаке.
    2) Как логировать POSTROUTING в отдельный файл для траблшутинга и мониторинга
    3) Можно ли эту конфигурацию добавить в docker и docker-composer.yml для сервисов работающих в докере? По умолчанию докер не видит ip адреса хост машины и не понятно, как их привязать к докеру.

    iptables -A POSTROUTING -t nat -p tcp -d api.ipify.org --dport 443 -m statistic --mode nth --every 3 --packet 0 -j SNAT --to-source 45.148.28.67
    iptables -A POSTROUTING -t nat -p tcp -d api.ipify.org --dport 443 -m statistic --mode nth --every 2 --packet 0 -j SNAT --to-source 45.148.31.170
    iptables -A POSTROUTING -t nat -p tcp -d api.ipify.org --dport 443 -m statistic --mode nth --every 1 --packet 0 -j SNAT --to-source 45.148.31.172
  • Как настроить NGINX forward proxy в docker c несколькими public IP адресами c опцией round-robin?

    @YuriyTigiev Автор вопроса
    Попробовал
    [root@screener conf]# curl --interface 45.148.31.170 'https://api.ipify.org?format=json'
    {"ip":"45.148.31.170"}

    [root@screener conf]# curl 'https://api.ipify.org?format=json' -x 45.148.31.170:3129
    {"ip":"45.148.28.67"}

    Конфигурация и сетевые настройки на момент тестирования приведены ниже.

    #user nobody;
    worker_processes 1;

    error_log logs/error.log;
    #error_log logs/error.log notice;
    #error_log logs/error.log info;

    #pid logs/nginx.pid;

    events {
    worker_connections 1024;
    }

    http {
    include mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr:$remote_port - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log logs/access.log main;

    sendfile on;
    #tcp_nopush on;

    #keepalive_timeout 0;
    keepalive_timeout 65;

    #gzip on;

    server {
    listen 3129;
    resolver 8.8.8.8;

    proxy_connect;
    proxy_connect_allow 443 563;
    proxy_connect_connect_timeout 10s;
    proxy_connect_read_timeout 10s;
    proxy_connect_send_timeout 10s;

    location / {
    proxy_pass http://$host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_bind 45.148.31.170;
    }
    }

    server {
    listen 3130;
    resolver 8.8.8.8;

    proxy_connect;
    proxy_connect_allow 443 563;
    proxy_connect_connect_timeout 10s;
    proxy_connect_read_timeout 10s;
    proxy_connect_send_timeout 10s;

    location / {
    proxy_pass http://$host;
    proxy_set_header Host $host;
    proxy_bind 45.148.31.172 transparent;
    }
    }

    server {
    listen 3131;
    resolver 8.8.8.8;

    proxy_connect;
    proxy_connect_allow 443 563;
    proxy_connect_connect_timeout 10s;
    proxy_connect_read_timeout 10s;
    proxy_connect_send_timeout 10s;

    location / {
    proxy_pass http://$host;
    proxy_set_header Host $host;

    proxy_bind 45.148.28.67 transparent;
    }
    }

    upstream dynamic{
    server 45.148.31.170:3129;
    server 45.148.31.172:3130;
    server 45.148.28.67:3131;
    }

    server {
    listen 127.0.0.1:3128;

    # dns resolver used by forward proxying
    resolver 8.8.8.8;

    # forward proxy for CONNECT request
    proxy_connect;
    proxy_connect_allow 443 563;
    proxy_connect_connect_timeout 10s;
    proxy_connect_read_timeout 10s;
    proxy_connect_send_timeout 10s;

    # forward proxy for non-CONNECT request
    location / {
    proxy_pass dynamic;
    proxy_set_header Host $host;
    }
    }


    }

    -------

    iptables

    # Generated by iptables-save v1.8.4 on Sat Mar 26 04:16:09 2022
    *filter
    :INPUT ACCEPT [6587:1645346]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [5562:2088467]
    :DOCKER - [0:0]
    :DOCKER-ISOLATION-STAGE-1 - [0:0]
    :DOCKER-ISOLATION-STAGE-2 - [0:0]
    :DOCKER-USER - [0:0]
    -A FORWARD -j DOCKER-USER
    -A FORWARD -j DOCKER-ISOLATION-STAGE-1
    -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -o docker0 -j DOCKER
    -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
    -A FORWARD -i docker0 -o docker0 -j ACCEPT
    -A FORWARD -o br-aa1b007e6aed -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -o br-aa1b007e6aed -j DOCKER
    -A FORWARD -i br-aa1b007e6aed ! -o br-aa1b007e6aed -j ACCEPT
    -A FORWARD -i br-aa1b007e6aed -o br-aa1b007e6aed -j ACCEPT
    -A FORWARD -o br-5e68534f6f9a -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -o br-5e68534f6f9a -j DOCKER
    -A FORWARD -i br-5e68534f6f9a ! -o br-5e68534f6f9a -j ACCEPT
    -A FORWARD -i br-5e68534f6f9a -o br-5e68534f6f9a -j ACCEPT
    -A FORWARD -o br-579c572a3ea3 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -o br-579c572a3ea3 -j DOCKER
    -A FORWARD -i br-579c572a3ea3 ! -o br-579c572a3ea3 -j ACCEPT
    -A FORWARD -i br-579c572a3ea3 -o br-579c572a3ea3 -j ACCEPT
    -A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
    -A DOCKER-ISOLATION-STAGE-1 -i br-aa1b007e6aed ! -o br-aa1b007e6aed -j DOCKER-ISOLATION-STAGE-2
    -A DOCKER-ISOLATION-STAGE-1 -i br-5e68534f6f9a ! -o br-5e68534f6f9a -j DOCKER-ISOLATION-STAGE-2
    -A DOCKER-ISOLATION-STAGE-1 -i br-579c572a3ea3 ! -o br-579c572a3ea3 -j DOCKER-ISOLATION-STAGE-2
    -A DOCKER-ISOLATION-STAGE-1 -j RETURN
    -A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
    -A DOCKER-ISOLATION-STAGE-2 -o br-aa1b007e6aed -j DROP
    -A DOCKER-ISOLATION-STAGE-2 -o br-5e68534f6f9a -j DROP
    -A DOCKER-ISOLATION-STAGE-2 -o br-579c572a3ea3 -j DROP
    -A DOCKER-ISOLATION-STAGE-2 -j RETURN
    -A DOCKER-USER -j RETURN
    COMMIT
    # Completed on Sat Mar 26 04:16:09 2022
    # Generated by iptables-save v1.8.4 on Sat Mar 26 04:16:09 2022
    *security
    :INPUT ACCEPT [5696:1558993]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [5562:2088467]
    COMMIT
    # Completed on Sat Mar 26 04:16:09 2022
    # Generated by iptables-save v1.8.4 on Sat Mar 26 04:16:09 2022
    *raw
    :PREROUTING ACCEPT [8188:1821724]
    :OUTPUT ACCEPT [5562:2088467]
    COMMIT
    # Completed on Sat Mar 26 04:16:09 2022
    # Generated by iptables-save v1.8.4 on Sat Mar 26 04:16:09 2022
    *mangle
    :PREROUTING ACCEPT [8188:1821724]
    :INPUT ACCEPT [6587:1645346]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [5562:2088467]
    :POSTROUTING ACCEPT [5562:2088467]
    COMMIT
    # Completed on Sat Mar 26 04:16:09 2022
    # Generated by iptables-save v1.8.4 on Sat Mar 26 04:16:09 2022
    *nat
    :PREROUTING ACCEPT [2519:264064]
    :INPUT ACCEPT [32:1632]
    :POSTROUTING ACCEPT [43:2588]
    :OUTPUT ACCEPT [43:2588]
    :DOCKER - [0:0]
    -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
    -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
    -A POSTROUTING -s 172.24.0.0/16 ! -o br-aa1b007e6aed -j MASQUERADE
    -A POSTROUTING -s 172.18.0.0/16 ! -o br-5e68534f6f9a -j MASQUERADE
    -A POSTROUTING -s 172.21.0.0/16 ! -o br-579c572a3ea3 -j MASQUERADE
    -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
    -A DOCKER -i docker0 -j RETURN
    -A DOCKER -i br-aa1b007e6aed -j RETURN
    -A DOCKER -i br-5e68534f6f9a -j RETURN
    -A DOCKER -i br-579c572a3ea3 -j RETURN
    COMMIT
    # Completed on Sat Mar 26 04:16:09 2022

    ---

    br-579c572a3ea3: flags=4099 mtu 1500
    inet 172.21.0.1 netmask 255.255.0.0 broadcast 172.21.255.255
    ether 02:42:e8:17:0e:4c txqueuelen 0 (Ethernet)
    RX packets 1553 bytes 890589 (869.7 KiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 1553 bytes 890589 (869.7 KiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    br-5e68534f6f9a: flags=4099 mtu 1500
    inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
    ether 02:42:b2:ca:74:0b txqueuelen 0 (Ethernet)
    RX packets 1553 bytes 890589 (869.7 KiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 1553 bytes 890589 (869.7 KiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    br-aa1b007e6aed: flags=4099 mtu 1500
    inet 172.24.0.1 netmask 255.255.0.0 broadcast 172.24.255.255
    ether 02:42:d2:4d:05:3e txqueuelen 0 (Ethernet)
    RX packets 1553 bytes 890589 (869.7 KiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 1553 bytes 890589 (869.7 KiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    docker0: flags=4099 mtu 1500
    inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
    ether 02:42:b2:2a:1d:68 txqueuelen 0 (Ethernet)
    RX packets 0 bytes 0 (0.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 0 bytes 0 (0.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    eth0: flags=4163 mtu 1500
    inet 45.148.28.67 netmask 255.224.0.0 broadcast 45.159.255.255
    inet6 2a06:1301:4050:45:148:31:172:0 prefixlen 56 scopeid 0x0
    inet6 2a06:1301:4050:45:148:28:67:0 prefixlen 56 scopeid 0x0
    inet6 2a06:1301:4050:45:148:31:170:0 prefixlen 56 scopeid 0x0
    inet6 fe80::216:3eff:fe3a:4bee prefixlen 64 scopeid 0x20
    ether 00:16:3e:3a:4b:ee txqueuelen 1000 (Ethernet)
    RX packets 68431 bytes 4899297 (4.6 MiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 4364 bytes 1305690 (1.2 MiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    eth0:1: flags=4163 mtu 1500
    inet 45.148.31.170 netmask 255.224.0.0 broadcast 45.159.255.255
    ether 00:16:3e:3a:4b:ee txqueuelen 1000 (Ethernet)

    eth0:2: flags=4163 mtu 1500
    inet 45.148.31.172 netmask 255.224.0.0 broadcast 45.159.255.255
    ether 00:16:3e:3a:4b:ee txqueuelen 1000 (Ethernet)

    lo: flags=73 mtu 65536
    inet 127.0.0.1 netmask 255.0.0.0
    inet6 ::1 prefixlen 128 scopeid 0x10
    loop txqueuelen 1000 (Local Loopback)
    RX packets 1553 bytes 890589 (869.7 KiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 1553 bytes 890589 (869.7 KiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  • Как настроить NGINX forward proxy в docker c несколькими public IP адресами c опцией round-robin?

    @YuriyTigiev Автор вопроса
    Александр Карабанов, спасибо за внимание и поддержку! Я тоже продолжаю эксперименты и набираюсь опыта. Очень хочется сделать не просто чтобы работало, а чтобы работало правильно и решение было оптимальным для данной задачи и было понимание почему именно оно лучшее.
  • Как настроить NGINX forward proxy в docker c несколькими public IP адресами c опцией round-robin?

    @YuriyTigiev Автор вопроса
    Александр Карабанов,

    Можно попросить вас показать промежуточный конфиг? Не совсем понятны последние комментарии.

    Я хочу чтобы в nginx работало как вы описали для iptables (первое решение). К сожалению не смог настроить iptables log чтобы все работает корректно :(. По описанию первое решение мне больше нравится и если его можно будет использовать в докер и докер компоузере то было бы отличным решением
  • Как настроить NGINX forward proxy в docker c несколькими public IP адресами c опцией round-robin?

    @YuriyTigiev Автор вопроса
    Спасибо за ответы. Я только начал разбираться с nginx.
    В server_name необходимо прописать api.site1.com ?

    И можете подсказать почему запрос все время отправляется с default ip 45.148.28.67? даже в том случае когда явно обращаешься к кокретному прокси на другом айпи

    Запрос:
    curl 'https://api.ipify.org?format=json' -x 45.148.31.170:3129
    Ответ
    {"ip":"45.148.28.67"}
  • Как настроить NGINX forward proxy в docker c несколькими public IP адресами c опцией round-robin?

    @YuriyTigiev Автор вопроса
    Александр Карабанов,

    Промежуточные прокси прописаны в приведенной конфигурации. Только не работают правильно.
    Основноый прокси по задумке
    127.0.0.1:3128 (upstream -> dynamic)
    Промежуточные прокси
    45.148.31.170:3129
    45.148.31.172:3130
    45.148.28.67:3131

    При использовании curl опцией -x и указании любого из списка адреса и порта прокси - запросы отправляются с default IP сервера 45.148.28.67. Вопрос почему и как это исправить?
  • Как настроить NGINX forward proxy в docker c несколькими public IP адресами c опцией round-robin?

    @YuriyTigiev Автор вопроса
    proxy_bind не работает. Даже при явном обращении к прокси с привязнаным не дефолтным айпи, запрос идет все равно с дефолтного айпи. Ниже привел конфиг.

    [root@screener conf]# curl 'https://api.ipify.org?format=json' -x 45.148.31.170:3129
    {"ip":"45.148.28.67"}

    user nobody;
    worker_processes 1;

    error_log logs/error.log;
    #error_log logs/error.log notice;
    #error_log logs/error.log info;

    #pid logs/nginx.pid;

    events {
    worker_connections 1024;
    }

    http {
    include mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr:$remote_port - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log logs/access.log main;

    sendfile on;
    #tcp_nopush on;

    #keepalive_timeout 0;
    keepalive_timeout 65;

    #gzip on;

    server {
    listen 3129;
    resolver 8.8.8.8;

    proxy_connect;
    proxy_connect_allow 443 563;
    proxy_connect_connect_timeout 10s;
    proxy_connect_read_timeout 10s;
    proxy_connect_send_timeout 10s;

    location / {
    proxy_pass http://$host;
    proxy_set_header Host $host;
    proxy_bind 45.148.31.170 transparent;
    }
    }

    server {
    listen 3130;
    resolver 8.8.8.8;

    proxy_connect;
    proxy_connect_allow 443 563;
    proxy_connect_connect_timeout 10s;
    proxy_connect_read_timeout 10s;
    proxy_connect_send_timeout 10s;

    location / {
    proxy_pass http://$host;
    proxy_set_header Host $host;
    proxy_bind 45.148.31.172 transparent;
    }
    }

    server {
    listen 3131;
    resolver 8.8.8.8;

    proxy_connect;
    proxy_connect_allow 443 563;
    proxy_connect_connect_timeout 10s;
    proxy_connect_read_timeout 10s;
    proxy_connect_send_timeout 10s;

    location / {
    proxy_pass http://$host;
    proxy_set_header Host $host;
    proxy_bind 45.148.28.67 transparent;
    }
    }

    upstream dynamic{
    server 45.148.31.170:3129;
    server 45.148.31.172:3130;
    server 45.148.28.67:3131;
    }

    server {
    listen 127.0.0.1:3128;

    # dns resolver used by forward proxying
    resolver 8.8.8.8;

    # forward proxy for CONNECT request
    proxy_connect;
    proxy_connect_allow 443 563;
    proxy_connect_connect_timeout 10s;
    proxy_connect_read_timeout 10s;
    proxy_connect_send_timeout 10s;

    # forward proxy for non-CONNECT request
    location / {
    proxy_pass dynamic;
    proxy_set_header Host $host;
    }
    }


    }