LINUX.ORG.RU
ФорумAdmin

два 3G-модема одновременно + 3proxy, как отроутить подскажите

 ,


0

3

Здравствуйте уважаемые участники сообщества! Имею два usb-модема (пока разных, в последующем одинаковых, но это я думаю значения не имеет) подключены через активный usb-hub Задумка такая: поднять два прокси локально по адресу 192.168.0.105 на разные порты прокси повесить разные модемы ось: linux slax (uname -a содержит debian 4.9) система подключена к интернету по wifi установлен wvdial, настроен так что каждый модем по-отдельности подключается настроен 3proxy так что при обращении по wifi-интерфейсу (192.168.0.105) по socks-порту 3128 идет по интерфейсу первого модема, по порту 3129- второго.

если соединение на любом из модемов установлено отдельно - все работает если подключены оба одновременно - работает тот который подключили первым

понимаю что собака зарыта где-то в ip route, и видимо когда я включаю два соединения недостаточно каких-то правил, подскажите плиз, или направьте куда следует

Телепаты в отпуске. Обычным, чтобы подсказать каких правил не хватает, нужно узреть какие правила уже есть.

зарыта где-то в ip route

Подозрительно, что про ″ip rule″ у вас не слова, вы в курсе что это и зачем?

mky ★★★★★ ()

Читайте lartc, там все подробно расписано. Вам надо создать отдельные таблицы маршрутизации для каждого канала и распихать по ним трафик.

Serge10 ★★★★★ ()

Поясни, а зачем вообще два модема?

Deleted ()

Почитай про iproute2:

https://www.opennet.ru/docs/RUS/LARTC/

Тебя интересует:

Можно запускать 3proxy от разных пользователей и метить пакеты через iptables.

Например:

## run once
# echo 201 modem1 >> /etc/iproute2/rt_tables
# echo 202 modem2 >> /etc/iproute2/rt_tables

## on boot:

iptables -t mangle -A OUTPUT -m owner --uid-owner $UID1 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner $UID2 -j MARK --set-mark 2
ip rule add fwmark 1 table modem1
ip rule add fwmark 2 table modem2
ip route add default via $MODEM1_GW dev ppp0 table modem1
ip route add default via $MODEM2_GW dev ppp1 table modem2
Tanger ★★★★★ ()

я делал именно такую штуку, только модемов было 6.

Вкратце, идея в том, что да, использовались N control groups, исх. пакеты из каждой маркировались ip rule по своему , ip ro их определял и роутил на выход через N соотв. интерфейсов.

Вот на базе этого https://superuser.com/questions/271915/route-the-traffic-over-specific-interf... плюс много скриптования своего

Т.е. было создано 6 systemd юнитов, в каждом запускался этот altnetworking + 3proxy, так что 3proxy пускал исх.трафик через назначенный модем.

Bers666 ★★★★★ ()

два usb-модема ... подключены через активный usb-hub

на текущие проблемы это не влияет, но я бы рассмотрел вариант с двумя отдельными портами USB

anymouze ★★ ()
Ответ на: комментарий от mky

ip route show

default via 192.168.0.1 dev wlp2s0

10.64.64.64 dev ppp0 proto kernel scope link src 100.68.115.78

10.64.64.65 dev ppp1 proto kernel scope link src 100.101.46.125

192.168.0.0/24 dev wlp2s0 proto kernel scope link src 192.168.0.105

u123123 ()

Всем спасибо, направление, дали буду пытаться маркировать пакеты но неужели нельзя обойтись одной копией 3proxy?

u123123 ()
Ответ на: комментарий от Tanger

ввиду того что запросы приходят на разные порты, можно ли так сделать:

iptables -A INPUT -i eth0 -p TCP --dport 3128 -j MARK --set-mark 1

iptables -A INPUT -i eth0 -p TCP --dport 3129 -j MARK --set-mark 2

ip rule add fwmark 1 table modem1

ip rule add fwmark 2 table modem2

ip route add default via ppp0 dev ppp0 table modem1

ip route add default via ppp1 dev ppp1 table modem2

u123123 ()
Ответ на: комментарий от u123123

ввиду того что запросы приходят на разные порты, можно ли так сделать

Нет. Так как прокси не выполняет маршрутизацию пакетов, а отправляет новый пакет от своего имени, на который метки от входящего пакета не распроняются.

Tanger ★★★★★ ()
Ответ на: комментарий от Tanger

А если у прокси 192.168.0.105:3128 указать родительским 127.0.0.1:3128 и входящее соединение на петле помечать, заруливать и роутить?

u123123 ()
Ответ на: комментарий от u123123

Указывайте для каждого прокси свой исходящий адрес (опция -e), и для каждого такого адреса выбирайте отдельную таблицу маршрутизации (с маршрутом по умолчанию через определённый модем). Адреса для ″-e″ берите любые, допустим 10.0.0.1/32 и 10.0.0.2/32 и назначайте их на физический интерфейс (wlp2s0), только не 127.0.0.0/8, они не маршрутизируемые,

mky ★★★★★ ()
Ответ на: комментарий от mky

Так и указал первым делом когда поставил 3proxy, и обновляю ip-адреса при каждом переподключении модема(пока ручками):

socks -a -i192.168.0.105 -e100.68.115.78 -p3128
socks -a -i192.168.0.105 -e100.101.46.125 -p3129

Причем я думал, что этого достаточно, ведь явно указано что соединение на порту 3128 надо отправить в интерфейс с ip-адресом 100.68.115.78, и естественно ждать оттуда ответ...

когда я проделывал тоже самое на ВПС с 30-ю ip-адресами (правда там они были «виртуальными», если правильно выразился) все работало без лишних телодвижений

u123123 ()
Ответ на: комментарий от u123123

Потому что на впс был 1 интерфейс наверное.
Кстати сквид типа умеет маркировать исходящие соединения из коробки, но у меня не взлетело.

Bers666 ★★★★★ ()
Ответ на: комментарий от u123123

Ну теперь, надеюсь, вы прочитали про

ip rule add from IP-ADDR

Чтобы пакет шёл через определяемый приложением (программой) интерфейс, есть опция сокета SO_BINDTODEVICE, доступная только root'у, а так пакеты ходят по машрутам и в случае не p-t-p линков пихать его в интерфейс без маршрута, который указывает шлюз, смысла нет.

mky ★★★★★ ()
Ответ на: комментарий от mky

сделал так:


# ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 1  bytes 112 (112.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1  bytes 112 (112.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 100.76.180.35  netmask 255.255.255.255  destination 10.64.64.64
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 6  bytes 102 (102.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 67  bytes 10717 (10.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ppp1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 100.68.163.194  netmask 255.255.255.255  destination 10.64.64.65
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 7  bytes 166 (166.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 255  bytes 39729 (38.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.105  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::7ae4:ff:fef0:3d07  prefixlen 64  scopeid 0x20<link>
        ether 78:e4:00:f0:3d:07  txqueuelen 1000  (Ethernet)
        RX packets 92867  bytes 30896921 (29.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 22650  bytes 3393459 (3.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlp2s0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.1  netmask 0.0.0.0  broadcast 255.255.255.255
        ether 78:e4:00:f0:3d:07  txqueuelen 1000  (Ethernet)

wlp2s0:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.2  netmask 0.0.0.0  broadcast 255.255.255.255
        ether 78:e4:00:f0:3d:07  txqueuelen 1000  (Ethernet)

<<<----------------------------------------------->>>

# ip rule show
0:      from all lookup local
32762:  from 10.0.0.2 lookup modem2
32763:  from 10.0.0.1 lookup modem1
32766:  from all lookup main
32767:  from all lookup default


<<<----------------------------------------------->>>

# tail /etc/3proxy/3proxy.cfg -n 2
socks -a -i192.168.0.105 -e10.0.0.1 -p3001
socks -a -i192.168.0.105 -e10.0.0.2 -p3002

Еще было сделано:
#ip route add 10.0.0.1/32 dev ppp0 table modem1
#ip route add 10.0.0.2/32 dev ppp1 table modem2
#ip route flush cache

При попытке подключится через прокси соединение зависает:

#iptstate
                              IPTState - IPTables State Top
Version: 2.2.6        Sort: SrcIP           b: change sorting   h: help
Source                          Destination                     Prt  State       TTL
10.0.0.1:55591                  74.125.232.241:80               tcp  SYN_SENT      0:01:45
10.0.0.1:56679                  74.125.232.241:80               tcp  SYN_SENT      0:01:08
10.0.0.2:44981                  74.125.232.241:80               tcp  SYN_SENT      0:01:37
10.245.243.103                  224.0.0.22                      igmp               0:08:43
100.68.163.194                  224.0.0.22                      igmp               0:03:58
100.74.195.235                  224.0.0.22                      igmp               0:08:44
192.168.0.1                     224.0.0.1                       igmp               0:08:23
192.168.0.102:63261             192.168.0.105:22                tcp  ESTABLISHED 119:59:59
192.168.0.102                   224.0.0.251                     igmp               0:04:19
192.
u123123 ()
Ответ на: комментарий от u123123

вдогонку, кусочек вывода ip route show table all

#ip route show table all
10.0.0.1 dev ppp0 table modem1 scope link
10.0.0.2 dev ppp1 table modem2 scope link
default via 192.168.0.1 dev wlp2s0
10.64.64.64 dev ppp0 proto kernel scope link src 100.71.115.155
10.64.64.65 dev ppp1 proto kernel scope link src 10.242.22.198
192.168.0.0/24 dev wlp2s0 proto kernel scope link src 192.168.0.105
local 10.0.0.1 dev wlp2s0 table local proto kernel scope host src 10.0.0.1
local 10.0.0.2 dev wlp2s0 table local proto kernel scope host src 10.0.0.1
local 10.242.22.198 dev ppp1 table local proto kernel scope host src 10.242.22.198
local 100.71.115.155 dev ppp0 table local proto kernel scope host src 100.71.115.155

u123123 ()
Ответ на: комментарий от mky

Вы имели ввиду:
iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE

прописал, все остальное перепроверил, прокся также принимает. но дальше нет ответа

вывод iptstate по этим соединениям не изменился

ранее, днем, пробывал по маркировать пакеты по uid-owner:

iptables -t mangle -A OUTPUT -m owner --uid-owner 1001 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 2
ip rule add fwmark 1 table modem1
ip rule add fwmark 2 table modem2
ip route add default dev ppp0 table modem1
ip route add default dev ppp1 table modem2
ip route flush cache

запускал две копии прокси от пользователей socks1 и socks2, каждый был настроен на свой интерфейс - эффект такой-же

может у меня в ОСи что-то не так? (linux slax, гружусь с флешки если это имеет значение)

u123123 ()
Ответ на: комментарий от mky

-j MASQUERADE применим только к POSTROUTINGу
cделал так:

#iptables -t nat -A OUTPUT -s 10.0.0.1/32 -j DNAT --to-destination 100.73.2.102
#iptables -t nat -A OUTPUT -s 10.0.0.2/32 -j DNAT --to-destination 100.102.65.148


#iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DNAT       all  --  10.0.0.2             anywhere             to:100.102.65.148
DNAT       all  --  10.0.0.1             anywhere             to:100.73.2.102

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

соединение устанавливается и сбрасывается

Еще одна странность: при попытке прочитать правила нат (iptables -t nat -L) iptables подвисает так что политика uotput очень долго не отображается

u123123 ()
Ответ на: комментарий от u123123

Зачем DNAT?? нужен OUTPUT/SNAT.
вообще советую советую перевести модем в режим роутера , тогда --source-to всегда будет один и тот же, а не диамический

Bers666 ★★★★★ ()
Ответ на: комментарий от Bers666

Во-первых в цепочке OUTPUT невозможно применить SNAT: ip_tables: SNAT target: used from hooks OUTPUT, but only usable from INPUT/POSTROUTING

Во-вторых: Задача стоит работать именно в режиме модема, чтобы не зависеть от моделей модемов

u123123 ()
Ответ на: комментарий от u123123

Да, спутался, POSTROUTING было правильно. Ещё нужно отключить rp_filter.

Посмотрите tcpdump'ом что происходит на ppp-интерфейсе при MASQUERADE правиле. От какого адреса идут ваши пакеты и приходят ли ответные. Если ответные приходят, но соединения нет, либо где-то в iptables режутся ответные пакеты, либо rp_filter'ом.

DNAT вам точно не нужен.

iptables -t nat -L

Без ключа ″-n″ iptables резолвит ip-адреса, может из-за этого тормозит.

mky ★★★★★ ()
Ответ на: комментарий от mky
# sysctl net.ipv4.conf.ppp0.rp_filter
net.ipv4.conf.ppp0.rp_filter = 0

Без ключа ″-n″ iptables резолвит ip-адреса, может из-за этого тормозит.

 — да именно, вчера тоже сообразил

все таблицы iptables чисты, потом добавил
#iptables -t nat -A POSTROUTING -s 10.0.0.1 -j MASQUERADE пакеты стали ходить, но не через ppp0 интрефейс:

root@slax:~# tcpdump -i wlp2s0:1 -v
tcpdump: listening on wlp2s0:1, link-type EN10MB (Ethernet), capture size 262144 bytes
12:45:36.214229 IP (tos 0x10, ttl 64, id 41158, offset 0, flags [DF], proto TCP (6), length 172)
^C    192.168.0.105.ssh > 192.168.0.102.62863: Flags [P.], cksum 0xbce3 (correct), seq 4045763726:4045763858, ack 180849144, win 331, length 132

1 packet captured
383 packets received by filter
375 packets dropped by kernel

root@slax:~# tcpdump -i ppp0 -v
tcpdump: listening on ppp0, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel

u123123 ()
Ответ на: комментарий от mky

пробывал еще:

iptables -t nat -A POSTROUTING -s 10.0.0.1 -j SNAT –to-source 100.90.217.80

где 100.90.217.80 - ip полученный свистком на ppp0 интерфейсе, тоже соединение зависает

u123123 ()
Ответ на: комментарий от u123123

Если пакеты не идут через ppp-интерфейс, значит не хватает маршрутов по умолчанию:

ip route add default ppp0 table modem1

и этот маршрут нужно прописывать каждый раз при появлении интерфейса ppp0.

Если вам tcpdump не показывает пакеты на ppp0, нужно настраивать маршрутизацию, NAT на маршрутизацию пакетов не влияет.

mky ★★★★★ ()
Ответ на: комментарий от mky

Большое человеческое спасибо тебе!!!)

вот где была собака зарыта:

ip route add default ppp0 table modem1

я добавлял маршруты не дефолтные на интерфейсы поэтому и покеты не ходили как надо.

u123123 ()
Ответ на: комментарий от u123123

Это сложно. 3proxy не внутри себя не разделяет на какой запрос он ищет DNS имя, поэтому нужно запускать отдельные процессы 3proxy для каждого подключения.

И тогда возможны разные варианты:
-- маркировка пакетов в iptables на основании cgroup/UID/PID
-- запуск процессов в разных network namespace
-- указание в их конифгах фейковых ip-адресов DNS-серверов, маршрутизации по этим ip и DNAT на нужные адреса.

mky ★★★★★ ()
3 мая 2019 г.

Тоже озадачился данной темой, в Windows достаточно было убрать галочку «Использовать шлюз в удаленной рабочей сети» и при установке соединения добавить роутинг

route ADD 0.0.0.0 MASK 0.0.0.0 (внутренний IP выданный сотовым оператором) METRIC 599

3proxy config:

socks -4 -p3004 -i0.0.0.0 -e10.155.177.30

но Linux не заработало почему то...

code8525 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.