LINUX.ORG.RU
ФорумAdmin

iprout2, одновременное использование двух интернет каналов


0

2

Имеется 2 телефона с 3G. Надо сделать так, чтобы одновременно можно было использовать 2 интернет подключения. Интерфейсы поднимаю так dhcpcd wwan0 и dhcpcd wwan1.
Погуглив нашел Практическое руководство по применению iproute2, в нем приводится пример Маршрутизации через несколько каналов/провайдеров. Собственно по нему и составил следующий скрипт

IF1=wwan0
IF2=wwan1

IP1="`ip addr show $IF1 | grep 'inet ' | awk '{print $2}' | sed 's/'.29'//'`"
IP2="`ip addr show $IF2 | grep 'inet ' | awk '{print $2}' | sed 's/'.28'//'`"

P1="`ip addr show $IF1 | grep 'inet ' | awk '{print $4}'`"
P2="`ip addr show $IF2 | grep 'inet ' | awk '{print $4}'`"

P1_NET="`ifconfig $IF1 | grep 'inet ' | awk '{print $4}' | sed 's/'Mask:'//'`"
P2_NET="`ifconfig $IF2 | grep 'inet ' | awk '{print $4}' | sed 's/'Mask:'//'`"

ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2

ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2

ip route add default via $P1

ip rule add from $IP1 table T1
ip rule add from $IP2 table T2

ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \
nexthop via $P2 dev $IF2 weight 1
При запуске вываливается следующее
RTNETLINK answers: File exists
RTNETLINK answers: Invalid argument
RTNETLINK answers: File exists
RTNETLINK answers: Invalid argument
RTNETLINK answers: File exists
RTNETLINK answers: File exists
RTNETLINK answers: Invalid argument
RTNETLINK answers: Invalid argument
Что не так?


вставляй тестовые сообщения между командами, узнаешь какая конкретно выдает конкретное сообщение. А там посмотрим.

RTNETLINK answers: File exists

выдается как правило если старую настройку не снял, или повторно ввёл.

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

Перезагрузил систему и RTNETLINK answers: File exists исчезли, остались только RTNETLINK answers: Invalid argument.

IF1=wwan0
IF2=wwan1

IP1="`ip addr show $IF1 | grep 'inet ' | awk '{print $2}' | sed 's/'[/]..'//'`"
echo "IP1:$IP1"
IP2="`ip addr show $IF2 | grep 'inet ' | awk '{print $2}' | sed 's/'[/]..'//'`"
echo "IP2:$IP2"

P1="`ip addr show $IF1 | grep 'inet ' | awk '{print $4}'`"
echo "P1:$P1"
P2="`ip addr show $IF2 | grep 'inet ' | awk '{print $4}'`"
echo "P2:$P2"

P1_NET="`ifconfig $IF1 | grep 'inet ' | awk '{print $4}' | sed 's/'Mask:'//'`"
echo "P1_NET:$P1_NET"
P2_NET="`ifconfig $IF2 | grep 'inet ' | awk '{print $4}' | sed 's/'Mask:'//'`"
echo "P2_NET:$P2_NET"

echo "echo: ip route add $P1_NET dev $IF1 src $IP1 table T1"
ip route add $P1_NET dev $IF1 src $IP1 table T1
echo "echo: ip route add default via $P1 table T1"
ip route add default via $P1 table T1
echo "echo: ip route add $P2_NET dev $IF2 src $IP2 table T2"
ip route add $P2_NET dev $IF2 src $IP2 table T2
echo "echo: ip route add default via $P2 table T2"
ip route add default via $P2 table T2

echo "echo: ip route add $P1_NET dev $IF1 src $IP1"
ip route add $P1_NET dev $IF1 src $IP1
echo "echo: ip route add $P2_NET dev $IF2 src $IP2"
ip route add $P2_NET dev $IF2 src $IP2

echo "echo: ip route add default via $P1"
ip route add default via $P1

echo "echo: ip rule add from $IP1 table T1"
ip rule add from $IP1 table T1
echo "echo: ip rule add from $IP2 table T2"
ip rule add from $IP2 table T2

echo "echo: ip route add default scope..."
ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \
nexthop via $P2 dev $IF2 weight 1
Вывод:
IP1:10.237.120.238
IP2:10.209.9.208
P1:10.237.120.239
P2:10.209.9.223
P1_NET:255.255.255.248
P2_NET:255.255.255.224
echo: ip route add 255.255.255.248 dev wwan0 src 10.237.120.238 table T1
echo: ip route add default via 10.237.120.239 table T1
RTNETLINK answers: Invalid argument
echo: ip route add 255.255.255.224 dev wwan1 src 10.209.9.208 table T2
echo: ip route add default via 10.209.9.223 table T2
RTNETLINK answers: Invalid argument
echo: ip route add 255.255.255.248 dev wwan0 src 10.237.120.238
echo: ip route add 255.255.255.224 dev wwan1 src 10.209.9.208
echo: ip route add default via 10.237.120.239
RTNETLINK answers: Invalid argument
echo: ip rule add from 10.237.120.238 table T1
echo: ip rule add from 10.209.9.208 table T2
echo: ip route add default scope...
RTNETLINK answers: Invalid argument

cat /etc/iproute2/rt_tables
#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep
1 T1
2 T2
rdl ()
Ответ на: комментарий от rdl

Наверное, нужно добавить к «p route add default via $P1» строку «dev $IF1». Ещё можно делать «replace» вместо «add», чтобы не было «File exists» при повторных запусках скрипта.

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

А в ручную получается прописать default-маршруты? А маршрут с nexthop может не работать, если в ядре нет поддержки этого ( CONFIG_IP_ROUTE_MULTIPATH).

Зачем вам маршруты:

ip route add 255.255.255.248 dev wwan0 src 10.237.120.238 table T1

это же маска, вроде?

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

Вручную тоже не получается. В ядре CONFIG_IP_ROUTE_MULTIPATH=y.

это же маска, вроде?

да это маска (просто где то видел что была указана маска), сейчас еще раз перечитал руководство, там указано следующее $P1_NET это IP сеть, к которой принадлежит $P1. Откуда брать значение этого параметра?

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

>Вручную тоже не получается.

Странно это, если:

ip route add 255.255.255.248 dev wwan0 src 10.237.120.238 table T1

то и

ip route add default via 10.237.120.239 dev wwan0 table T1

должно работать. Может, вместо default попробовать 0.0.0.0/0. Посмотрите, может маршрут всё таки добавляется (ip route show table T1).

Адрес сети вычисляется из адреса интерфейса и маски, но, наверное (если интерейс уже поднят), можно взять из вывода команды «ip route», как то так:

ip route | grep «dev wwan0» | grep -v via | while read A ; do ip route add $A table T1 ; done

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