LinuxForum.Fans
Тема

Доступ в некоторым сайтам только с определённого провайдера

Автор: vlad 13 сообщений 1053 просмотров
31.12.2017 13:58 · отредактировано #427199

Всем доброго времени суток!
Есть маршрутизатор на 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) этого модема. На клиентах (очень) желательно ничего не прописывать.

31.12.2017 21:32 #427212

*SCRATCH* А в настройках файерволла никак не прописать?

31.12.2017 22:36 · отредактировано #427213

Дело в том что я пока сам не пойму. Файерволл имеется ввиду iptables? Мне сказали (мягко говоря) что это не верный способ и что нужно настраивать маршрутизацию. Как я тоже не знаю. Вот спрашиваю, есть ли решения и какие, хотя бы направление и желательно с примером для понимания.
Как вообще с таких модемов раздают интернет в локальную сеть, если у этого модема есть свой dhcp-сервер, и маршрутизатор (тот что на ubuntu server), в который устанавливают этот модем, тоже имеет свой dhcp-сервер? Если просто раздать интернет с такого модема, то клиенты цепляются использую его dhcp, верно?

31.12.2017 23:28 · отредактировано #427214

vlad, нет не верно, на этом модеме ложим dhcp сервер, и используем ubuntu, настраиваем интерфейс с модемом, а так же настраиваем маршрутизацию на основе политик iproute2. Разрешаем форвардинг пакетов на шлюзе, ubuntu ну и конечно же в конце настраиваем нат на шлюзе с выходом через модем. В этом направлении и копать.

З.ы. вот тут можно почитать про policy-routing iproute2

01.01.2018 01:53 · отредактировано #427215

Все (ну или многие) в инете советуют именно так использовать модем, когда он виден как сетевая карта. Как на модеме положить сервер dhcp я не знаю, кроме как перевести его в диагностический режим, опять же это не советуют делать. Тогда модем нужно настраивать как-то так? https://habrahabr.ru/post/188886/

02.01.2018 16:13 #427225

vlad, :) там скрипты для настройки мобильного интернета на компе/буке.
Вам же нужно копать в сторону настроек 2-х внешних сетевых карт.

05.01.2018 13:50 · отредактировано #427288

Пока пытаюсь просто сделать интернет через модем. "Отключил" в модеме сервер dhcp, подключаюсь через NDIS. Получаю данные провайдера на этом интерфейсе:

text
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)

Маршруты до изменений:

text
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
Получаю:

text
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, то всё работает как положено. Что я ещё забыл?

06.01.2018 14:18 #427298
"vlad" написал:
Что я ещё забыл?

NAT iptables настроил на модемное соединение?

07.01.2018 22:58 · отредактировано #427299

Маскарадинг? Что с ним что без него одинаково не работает, симптомы те же. У меня сейчас два модема, один работает в режиме NDIS, другой как роутер. С каждым из них я пробовал (не вместе), дефальтовые маршруты прописывал, pppoe разъединял маршрут сразу сам меняется. И оба не работают, хотя тот который как роутер трафик передаёт (rx tx увеличивается). Думаю что я что-то не доделываю, а что пока не знаю, ибо не могут они оба не работать.
Добавлено: 07.01.2018 20:09:44

Я разобрался в чём была проблема, нужен был не такой маршрут, в немного другой:

text
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

text
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

text
#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep
#101 ppp
102 modem

ip route show table modem

text
default via 10.181.84.81 dev wwx001e101f0000

Пакеты при заходе на site.ru идут, смотрю так "iptables -t mangle -L PREROUTING -v --line-numbers", но сайт не открывается.

11.01.2018 07:43 #427315

vlad, а при "неоткрытии сайта" что пишет?

11.01.2018 18:58 #427334

Скрипт nslookup до имени адреса. Вычисляем ип и делаем маршрут через нужный интерфейс. Это первое что взбрело в голову.
P.S. Давно меня тут небыло =)
Добавлено: 11.01.2018 18:58:32

NAT на оба интерфейса по дефолту жирный. Сайты через маршруты через нужный интерфейс.

02.02.2018 20:49 #427724

В общем, я как бы реализовал эту схему (на самом деле помог один человек), но она почему-то не работает. Затык происходит в том что ОС не принимает из таблицы соответствующий маршрут по умолчанию, только тот что задаётся как "ip route replace to default via $GW dev $IF_M", где переменные заранее определены. Вот что делаю:

text

#!/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

text

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

text
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.1
text
root@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.1
text
root@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.165
text
root@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 2018
text
root@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 не работает.

26.02.2018 23:02 · отредактировано #428308

Хочу сделать логическое завершение. Удалось мне решить поставленную задачу, но другим способом, через дополнительный прокси-сервер 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/ и вписать туда следующее:

text
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

text
#!/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

text
#!/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 меняем:

text
Listen 192.168.8.100
Bind 192.168.8.1
BindSame yes

Всё, перезапускаем. Дальше, т.к. я в конечном итоге подгонял под свою конфигурацию, то к этому прокси я подключаюсь из другого прокси, т.е. tinyproxy как бы является уже вышестоящим. Я подключаюсь из privoxy в прозрачном режиме (через squid), в файле user.action (или в любом другом action) должна быть такая строчка:

text
{+forward-override{forward 192.168.8.100:8888} \
}
.site.com/
.site.ru/

Как только пользователь запрашивает что-то типа *.site.com или *.site.ru, то они уже загружаются через модем. Всё остальное идёт как обычно, у меня это pppoe.
Ещё есть такой момент, tinyproxy нужно запускать после поднятия модема, иначе он завершится с ошибкой. В Ubuntu systemd, по этому что-то типа такого:

/etc/systemd/modem.service

text
[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

text
#!/bin/sh
dhclient enx0c5b8f279a64

/usr/local/sbin/modem-stop

text
#!/bin/sh
dhclient -r enx0c5b8f279a64

Маршруты и правила:

text
[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

text
[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 и т.п.)

Минус, дополнительный прокси и некоторая возня с ним. Зато опыт :).
На оригинальность не претендую, напротив, возможно что-то криво сделано.

Войдите или зарегистрируйтесь, чтобы ответить.