Всем доброго времени суток!
Есть маршрутизатор на Ubuntu Server 16.04 LTS, обслуживает локальную сеть 192.168.2.0/24, на нём есть всё необходимое для маршрутизатора (dhcp/dns серверы - dnsmasq). Основной интернет получаю через PPPoE соединение. К этому маршрутизатору я дополнительно подключаю 3G модем ZTE MF667, который в Ubuntu виден как ещё одна сетевая карта. На этом модеме есть свой dhcp (и видимо dns) сервер, который имеет ip 192.168.0.1 (его можно менять из веб интерфейса модема). Подключаюсь (пока временно) к модему через консоль командой dhclient -v enx, где enx сетевой интерфейс этого модема. Клиент dhclient получает ip 192.168.0.20. Задача, нужно чтоб локальная сеть 192.168.2.0/24 получала интернет и от этого модема, но не весь, а только для определённых сайтов. Основным каналом для получение интернета по прежнему будет PPPoE. Не нужно ничего агрегатировать, балансировать и т.п. Т.е. допустим мне нужно на клиенте в локальной сети открыть страницу google.ru через этот модем, другие страницы должны получать доступ исключительно через PPPoE. Сейчас у меня из локальной сети (192.168.2.0/24) есть доступ только к веб интерфейсу (192.168.0.1) этого модема. На клиентах (очень) желательно ничего не прописывать.
Доступ в некоторым сайтам только с определённого провайдера
*SCRATCH* А в настройках файерволла никак не прописать?
Дело в том что я пока сам не пойму. Файерволл имеется ввиду iptables? Мне сказали (мягко говоря) что это не верный способ и что нужно настраивать маршрутизацию. Как я тоже не знаю. Вот спрашиваю, есть ли решения и какие, хотя бы направление и желательно с примером для понимания.
Как вообще с таких модемов раздают интернет в локальную сеть, если у этого модема есть свой dhcp-сервер, и маршрутизатор (тот что на ubuntu server), в который устанавливают этот модем, тоже имеет свой dhcp-сервер? Если просто раздать интернет с такого модема, то клиенты цепляются использую его dhcp, верно?
vlad, нет не верно, на этом модеме ложим dhcp сервер, и используем ubuntu, настраиваем интерфейс с модемом, а так же настраиваем маршрутизацию на основе политик iproute2. Разрешаем форвардинг пакетов на шлюзе, ubuntu ну и конечно же в конце настраиваем нат на шлюзе с выходом через модем. В этом направлении и копать.
З.ы. вот тут можно почитать про policy-routing iproute2
Все (ну или многие) в инете советуют именно так использовать модем, когда он виден как сетевая карта. Как на модеме положить сервер dhcp я не знаю, кроме как перевести его в диагностический режим, опять же это не советуют делать. Тогда модем нужно настраивать как-то так? https://habrahabr.ru/post/188886/
vlad, :) там скрипты для настройки мобильного интернета на компе/буке.
Вам же нужно копать в сторону настроек 2-х внешних сетевых карт.
Пока пытаюсь просто сделать интернет через модем. "Отключил" в модеме сервер dhcp, подключаюсь через NDIS. Получаю данные провайдера на этом интерфейсе:
wwx001e101f0000 Link encap:Ethernet HWaddr 00:1e:10:1f:00:00
inet addr:10.141.148.142 Bcast:10.141.148.143 Mask:255.255.255.252
inet6 addr: fe80::21e:10ff:fe1f:0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:194 errors:0 dropped:0 overruns:0 frame:0
TX packets:63477 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12884 (12.8 KB) TX bytes:2676086 (2.6 MB)
Маршруты до изменений:
ip ro show
default dev ppp0 scope link
10.91.255.126 dev ppp0 proto kernel scope link src xxx.xxx.xxx.xxx
10.141.148.140/30 dev wwx001e101f0000 proto kernel scope link src 10.141.148.142
192.168.2.0/24 dev br0 proto kernel scope link src 192.168.2.1
После выполняю ip ro replace to default dev wwx001e101f0000
Получаю:
ip ro show
default dev wwx001e101f0000 scope link
10.91.255.126 dev ppp0 proto kernel scope link src xxx.xxx.xxx.xxx
10.141.148.140/30 dev wwx001e101f0000 proto kernel scope link src 10.141.148.142
192.168.2.0/24 dev br0 proto kernel scope link src 192.168.2.1
ppp0 - рабочее соединение через pppoe.
wwx001e101f0000 - через которое в данный момент пытаюсь подключиться.
Пытаюсь открыть что-то в интернете, но ничего не работает, притом значение TX bytes и TX packets для wwx001e101f0000 (модем) каждый раз растёт при попытке открыть сайты, а RX bytes и RX packets остаётся неизменным. Как только я меняю маршрут default по ip ro replace to default dev ppp0, то всё работает как положено. Что я ещё забыл?
Что я ещё забыл?
NAT iptables настроил на модемное соединение?
Маскарадинг? Что с ним что без него одинаково не работает, симптомы те же. У меня сейчас два модема, один работает в режиме NDIS, другой как роутер. С каждым из них я пробовал (не вместе), дефальтовые маршруты прописывал, pppoe разъединял маршрут сразу сам меняется. И оба не работают, хотя тот который как роутер трафик передаёт (rx tx увеличивается). Думаю что я что-то не доделываю, а что пока не знаю, ибо не могут они оба не работать.
Добавлено: 07.01.2018 20:09:44
Я разобрался в чём была проблема, нужен был не такой маршрут, в немного другой:
ip route replace to default via GW dev wwx001e101f0000где GW - шлюз провайдера, узнать можно посмотрев строку "option routers", в /var/lib/dhcp/dhclient.lease, если подключаться через dhclient.
Сразу же всё заработало через модем. Теперь вот осталась основная задача, через этот модем заходить только на некоторые сайты. В таком виде всё идет через модем. За основу взял эту http://ruunix.ru/1331-rabota-s-dvumya-provajderami-internet-odnovremenno.html статью. Пока не очень понятно как сделать то что мне нужно.
Добавлено: 07.01.2018 22:58:14
Наткнулся на другую статью https://www.opennet.ru/docs/RUS/LARTC/c1430.html в которой практически так как мне нужно. Только изменяю правило прероутинга на подходящее для меня "iptables -A PREROUTING -i eth0 -d site.ru -t mangle -p tcp -m multiport --dport 80,443 -j MARK --set-mark 2".
ip rule ls
0: from all lookup local
32765: from all fwmark 0x2 lookup modem
32766: from all lookup main
32767: from all lookup default
cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
#101 ppp
102 modemip route show table modem
default via 10.181.84.81 dev wwx001e101f0000Пакеты при заходе на site.ru идут, смотрю так "iptables -t mangle -L PREROUTING -v --line-numbers", но сайт не открывается.
vlad, а при "неоткрытии сайта" что пишет?
Скрипт nslookup до имени адреса. Вычисляем ип и делаем маршрут через нужный интерфейс. Это первое что взбрело в голову.
P.S. Давно меня тут небыло =)
Добавлено: 11.01.2018 18:58:32
NAT на оба интерфейса по дефолту жирный. Сайты через маршруты через нужный интерфейс.
В общем, я как бы реализовал эту схему (на самом деле помог один человек), но она почему-то не работает. Затык происходит в том что ОС не принимает из таблицы соответствующий маршрут по умолчанию, только тот что задаётся как "ip route replace to default via $GW dev $IF_M", где переменные заранее определены. Вот что делаю:
#!/bin/sh
IF1=ppp0
IF2=wwx001e101f0000
ip rule add from $IP_P table ppp
ip rule add fwmark 1 table ppp
ip rule add from $IP_M table modem
ip rule add fwmark 2 table modem
ip route add $GW_P dev $IF1 src $IP_P table ppp
ip route add default dev $IF1 table ppp
ip route add $IP_NET_M dev $IF2 src $IP_M table modem
ip route add default via $GW_M table modem
Переменные IP_P и IP_M заранее определяются.
iptables, br0 - внутренний интерфейс для 192.168.2.0/24
iptables -F
iptables -F -t nat
iptables -t mangle -F
iptables -F FORWARD
iptables -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t mangle -A PREROUTING -s 192.168.2.0/24 ! -d 192.168.2.0/24 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s 192.168.2.0/24 ! -d 2ip.ru -j MARK --set-mark 1
iptables -t mangle -A INPUT -i br0 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m connmark --mark 1 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s 192.168.2.0/24 -d 2ip.ru -j MARK --set-mark 2
iptables -t mangle -A INPUT -i br0 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -m connmark --mark 2 -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -m mark --mark 1 -j MASQUERADE
iptables -t nat -A POSTROUTING -m mark --mark 2 -j MASQUERADE
iptables -t mangle -A FORWARD -o ppp0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:65495 -j TCPMSS --clamp-mss-to-pmtu
root@home-router:/usr/local/sbin# ip ro sh
default dev ppp0 scope link
10.91.255.126 dev ppp0 proto kernel scope link src xx.xx.xx.xx
100.76.242.164/30 dev wwx001e101f0000 proto kernel scope link src 100.76.242.165
192.168.2.0/24 dev br0 proto kernel scope link src 192.168.2.1root@home-router:/usr/local/sbin# ip ro sh table ppp
default dev ppp0 scope link
10.91.255.126 dev ppp0 scope link src xx.xx.xx.xx
192.168.2.0/24 dev br0 scope link src 192.168.2.1root@home-router:/usr/local/sbin# ip ro sh table modem
default via 100.76.242.166 dev wwx001e101f0000
100.76.242.164/30 dev wwx001e101f0000 scope link src 100.76.242.165root@home-router:/usr/local/sbin# iptables-save
# Generated by iptables-save v1.6.0 on Thu Jan 18 23:27:13 2018
*raw
:PREROUTING ACCEPT [10572:7667928]
:OUTPUT ACCEPT [4092:2177762]
COMMIT
# Completed on Thu Jan 18 23:27:13 2018
# Generated by iptables-save v1.6.0 on Thu Jan 18 23:27:13 2018
*nat
:PREROUTING ACCEPT [673:60592]
:INPUT ACCEPT [283:17274]
:OUTPUT ACCEPT [59:6215]
:POSTROUTING ACCEPT [59:6215]
-A POSTROUTING -m mark --mark 0x1 -j MASQUERADE
-A POSTROUTING -m mark --mark 0x2 -j MASQUERADE
COMMIT
# Completed on Thu Jan 18 23:27:13 2018
# Generated by iptables-save v1.6.0 on Thu Jan 18 23:27:13 2018
*filter
:INPUT ACCEPT [3861:2168931]
:FORWARD ACCEPT [6695:5484193]
:OUTPUT ACCEPT [4090:2179131]
COMMIT
# Completed on Thu Jan 18 23:27:13 2018
# Generated by iptables-save v1.6.0 on Thu Jan 18 23:27:13 2018
*mangle
:PREROUTING ACCEPT [10486:7602172]
:INPUT ACCEPT [3841:2160565]
:FORWARD ACCEPT [6645:5441607]
:OUTPUT ACCEPT [4064:2171835]
:POSTROUTING ACCEPT [10709:7613442]
-A PREROUTING -s 192.168.2.0/24 ! -d 192.168.2.0/24 -j MARK --set-xmark 0x1/0xffffffff
-A PREROUTING -s 192.168.2.0/24 ! -d 178.63.151.224/32 -j MARK --set-xmark 0x1/0xffffffff
-A PREROUTING -s 192.168.2.0/24 -d 178.63.151.224/32 -j MARK --set-xmark 0x2/0xffffffff
-A INPUT -i br0 -j MARK --set-xmark 0x1/0xffffffff
-A INPUT -i br0 -j MARK --set-xmark 0x2/0xffffffff
-A OUTPUT -m connmark --mark 0x1 -j MARK --set-xmark 0x1/0xffffffff
-A OUTPUT -m connmark --mark 0x2 -j MARK --set-xmark 0x2/0xffffffff
-A FORWARD -o ppp0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:65495 -j TCPMSS --clamp-mss-to-pmtu
COMMIT
# Completed on Thu Jan 18 23:27:13 2018root@home-router:/usr/local/sbin# ip ru sh
0: from all lookup local
32762: from all fwmark 0x2 lookup modem
32763: from 100.76.242.165 lookup modem
32764: from all fwmark 0x1 lookup ppp
32765: from xx.xx.xx.xx lookup ppp
32766: from all lookup main
32767: from all lookup defaultВот в такой схеме, всё должно работать через PPPoE (таблица ppp), а 2ip.ru должен открываться только через модем (таблица modem). Всё работает, кроме того что сайт 2ip.ru не открывается. На интерфейсе модема rx/tx bytes меняются, команда "iptables -vL -t nat" показывает что счётчики обоих MASQUERADE тоже растут. Начинает работать только если выполняю команду "ip route replace to default via $GW dev $IF_M", т.е. дефолтным делаю модем, но тогда всё остальное через ppp не работает.
Хочу сделать логическое завершение. Удалось мне решить поставленную задачу, но другим способом, через дополнительный прокси-сервер tinyproxy. По описанию у него есть соответствующий функционал:
# Listen: If you have multiple interfaces this allows you to bind to
# only one. If this is commented out, tinyproxy will bind to all
# interfaces present.
# Bind: This allows you to specify which interface will be used for
# outgoing connections. This is useful for multi-home'd machines where
# you want all traffic to appear outgoing from one particular interface.
Перепрошил модем прошивкой hilink, так его проще настраивать. В этом режиме у него работает сервер dhcp (тот от которого мне рекомендовали избавиться :)). Модем нужно перевести в нужную композицию через usb_modeswitch, т.к. при его подключении он находится "не в том состоянии". Я делал для модема Huawei E3372H-153. Нужно создать файл, например 70-huawei_e3372h-153.rules в /etc/udev/rules.d/ и вписать туда следующее:
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1f01", RUN+="/usr/sbin/usb_modeswitch -v 12d1 -p 1f01 -M '55534243123456780000000000000a11062000000000000100000000000000'"Теперь при каждой инициализации модема он будет переводится в "правильный режим". Подключаемся к модему командой dhclient enx0c5b8f279a64 (предварительно проверив имя интерфейса через ifconfig -a или ip a). Судя по описаниям в интернете, mac-адрес у него не меняется и на всех экземплярах этого модема одинаковый, в имени интерфейса указан mac-адрес. После подключения к модему, нам он присвоит ip 192.168.8.100 (если не менялись заводские настройки), ip шлюза модема 192.168.8.1. Остаётся указать маршрут и правило:
/usr/local/sbin/add-route
#!/bin/sh
ip rule add from 192.168.8.100 table modem
ip route add 192.168.8.0/24 dev enx0c5b8f279a64 src 192.168.8.100 table modem
ip route add default via 192.168.8.1 table modem
ip route flush cacheУдалить, то что натворили (можно не делать):
/usr/local/sbin/del-route
#!/bin/sh
ip route flush table modem
ip rule delete table modem
ip route flush cacheПредварительно в /etc/iproute2/rt_tables нужно добавить 101 modem (число должно быть 1<х<253). Всё, с модемом покончено. Теперь нужно настроить прокси. Тут есть засада, из пакета он не работает при нужной нам конфигурации. Я перекомпилировал пакет на виртуалке (исходник брал тут https://packages.ubuntu.com/bionic/tinyproxy-bin), т.к. этот маленький прокси (меньше 100 КБ), тянет зависимостей под 1,5 ГБ. Меняем (удаляем) там одну строку, какую догадаться легко по логу ошибки на исходном пакете (не перекомпилированном) вот она "--enable-transparent". В Ubuntu/Debian для этого в исходниках правиться файл rules (именно там удаляется строка). Полученные пакеты устанавливаем. В tinyproxy.conf меняем:
Listen 192.168.8.100
Bind 192.168.8.1
BindSame yesВсё, перезапускаем. Дальше, т.к. я в конечном итоге подгонял под свою конфигурацию, то к этому прокси я подключаюсь из другого прокси, т.е. tinyproxy как бы является уже вышестоящим. Я подключаюсь из privoxy в прозрачном режиме (через squid), в файле user.action (или в любом другом action) должна быть такая строчка:
{+forward-override{forward 192.168.8.100:8888} \
}
.site.com/
.site.ru/Как только пользователь запрашивает что-то типа *.site.com или *.site.ru, то они уже загружаются через модем. Всё остальное идёт как обычно, у меня это pppoe.
Ещё есть такой момент, tinyproxy нужно запускать после поднятия модема, иначе он завершится с ошибкой. В Ubuntu systemd, по этому что-то типа такого:
/etc/systemd/modem.service
[Unit]
Description=Connection to USB modem
After=network.target
[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/usr/local/sbin/modem-start
ExecStop=/usr/local/sbin/modem-stop
[Install]
WantedBy=multi-user.target
/usr/local/sbin/modem-start
#!/bin/sh
dhclient enx0c5b8f279a64
/usr/local/sbin/modem-stop
#!/bin/sh
dhclient -r enx0c5b8f279a64Маршруты и правила:
[Unit]
Description=Add route and rules for USB modem
Requires=modem.service
After=modem.service
[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/usr/local/sbin/add-route
ExecStop=/usr/local/sbin/del-route
[Install]
WantedBy=multi-user.target
Запуск tinyproxy:
/etc/systemd/tinyproxy.service
[Unit]
Description=Tinyproxy lightweight HTTP Proxy
After=modem.service
Requires=modem.service
Documentation=man:tinyproxy(8) man:tinyproxy.conf(5)
[Service]
Type=forking
ExecStartPre=/bin/sleep 15
ExecStart=/usr/sbin/tinyproxy
PIDFile=/run/tinyproxy/tinyproxy.pid
PrivateDevices=yes
Restart=always
[Install]
WantedBy=multi-user.target
Плюс данной схемы, не нужны дополнительные правила iptables, работает те что уже настроены, легко указываются домены для проксирования (не нужны правила iptables, ipset и т.п.)
Минус, дополнительный прокси и некоторая возня с ним. Зато опыт :).
На оригинальность не претендую, напротив, возможно что-то криво сделано.