LINUX.ORG.RU
решено ФорумAdmin

Роутинг через OpenVPN подключение (socket bind).

 , , ,


0

2

На компьютере есть два сетевых интерфейса:

  • eth0 - по нему получаем интернет
  • tun0 - подключение к OpenVPN серверу
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.88.0.6  P-t-P:10.88.0.5  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tun0 не настроен как default gw, но на самом vpn сервере форвардинг настроен и пакеты принимаются если ставить его как default gw.

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.137.1   0.0.0.0         UG    0      0        0 eth0
10.88.0.1       10.88.0.5       255.255.255.255 UGH   0      0        0 tun0
10.88.0.5       0.0.0.0         255.255.255.255 UH    0      0        0 tun0
192.168.137.0   0.0.0.0         255.255.255.0   U     1      0        0 eth0

И есть скриптина-клиент для примера http://pastebin.com/pkUda7hn Там есть socket.bind(('10.88.0.6', 0)). И ожидается что подключение будет идти через vpn, но все равно происходит через default gw. Может нужно прописать еще какие-то роуты?

ну так в питоне, вроде, socket.bind говорит слушать на этом ip, а не запросы делать с этого ip
или я чего-то путаю?

ii343hbka ★★★
()
Последнее исправление: ii343hbka (всего исправлений: 1)
Ответ на: комментарий от ii343hbka

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

Но, попробуем через это: http://docs.python.org/2/library/socket.html#socket.create_connection

If supplied, source_address must be a 2-tuple (host, port) for the socket to bind to as its source address before connecting. If host or port are ‘’ or 0 respectively the OS default behavior will be used.

http://pastebin.com/jhpKypFS Тот же эффект.

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

Пайтон не знаю, но ему ничего не мешает отправлять пакеты с source адресом tun-интерфейса через default gw

Вообще, есть способы отправлять что-нибудь, минуя таблицу маршрутизации, но что для этого требуется - не знаю :(

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

Сейчас покопался тут еще, socket.create_connection вызывает тот же bind в итоге. Еще запустил через strace, питон вызывает ожидаемые системные вызовы.

bind(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("10.88.0.6")}, 16) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("54.200.182.206")}, 16) = 0
Поэтому конкретно к питону привязываться думаю не стоит.

Гугление трудно дается на эту тему, но много где советуют использовать bind для указания адреса источника или

s.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, 'tun0')
В этом случае не подключается даже, отваливается по таймауту.

но ему ничего не мешает отправлять пакеты с source адресом tun-интерфейса через default gw

Да, похоже на то.

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

Кстати, ты же можешь настроить policy routing для таких дел

echo "200 vpn" >> /etc/iproute2/rt_tables
ip rule add from 10.88.0.6 table vpn
ip rule add to 10.88.0.6 table vpn
ip route add 10.88.0.4/30 dev tun0 table vpn
ip route add default via 10.88.0.5 table vpn
После этого должно через vpn ходить

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

отправлять пакеты с source адресом tun-интерфейса через default gw

Есть идея посмотреть трафик. Если это так то может удастся создать нужные правила в iptables что бы отправлять такие пакеты куда нужно.

Похоже на костыль какой-то, в сетях так хорошо разбираюсь но выглядит так.

Завтра может займусь, если ничего нового не найду.

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