LINUX.ORG.RU

Сообщения apollonx

 

1 комп, 2 cоединения с инетом

Здравствуйте.
У меня на одном компе работает много пользователей. На этом компе
есть два сетевых интерфейса с интернетом eth0 (192.168.7.7/24 gw 192.168.7.1)
и tap0 (10.1.0.2/24 gw 10.1.0.1). Интернет от разных провайдеров.
Если ставить поочередно default route через 192.168.7.1 и 10.1.0.1 - интернет работает, канал меняется.
Но задача такая: нужно чтобы некоторые пользователи ходили через eth0,
а некоторые через tap0. Я расскажу что я сделал для достижения своей цели. Во первых для начала я решил
пустить пользователя user через tap0, а всез остальных через eth0. Тут то и начались проблемы.

1. Пометил все пакеты от пользователя user в iptables:
iptables -t mangle -A OUTPUT -m owner --uid-owner user -j MARK --set-mark 0x1

2. Добавил в табличку маршрутизации 'adsl' default route через одного
провайдера:
ip ro add default via 10.1.0.1 ta adsl

3. Добавил в табличку маршрутизации 'knet' default route через другого
провайдера:
ip ro add default via 192.168.7.1 ta knet

4. Удалил из таблички 'main' default route:
ip ro del default ta main

5. Привел ip ru sh к такому виду:
0: from all lookup local
10: from all lookup main
32764: from all fwmark 0x1 lookup adsl
32765: from all lookup knet
32766: from all lookup main
32767: from all lookup default

Сейчас у всех кроме пользователя user есть интернет.
А я хочу чтобы у всех был интернет через 192.168.7.1, а у user через 10.1.0.1.

Вот что есть в табличках main, adsl и knet:

cafe ~ # ip ro sh ta main
192.168.7.0/24 dev eth0 proto kernel scope link src 192.168.7.7
192.168.50.0/24 dev eth1 proto kernel scope link src 192.168.50.1
10.1.0.0/24 dev tap0 proto kernel scope link src 10.1.0.2
127.0.0.0/8 dev lo scope link

cafe ~ # ip ro sh ta adsl
default via 10.1.0.1 dev tap0

cafe ~ # ip ro sh ta knet
default via 192.168.7.1 dev eth0



Вот что показывает сниффер на tap0, когда я от имени user выполняю
соединение с каким-нибудь компом из инета
(я делаю user@cafe ~ $ telnet 94.100.176.20 25):

Это когда в arp нет информации о 10.1.0.1
----------------------------------------------------------------
cafe ~ # tshark -i tap0
Running as user "root" and group "root". This could be dangerous.
Capturing on tap0
0.000000 00:ff:28:82:a1:ac -> Broadcast ARP Who has 10.1.0.1? Tell 192.168.7.7
0.999483 00:ff:28:82:a1:ac -> Broadcast ARP Who has 10.1.0.1? Tell 192.168.7.7
1.999155 00:ff:28:82:a1:ac -> Broadcast ARP Who has 10.1.0.1? Tell 192.168.7.7
----------------------------------------------------------------

А это когда есть:
----------------------------------------------------------------
cafe ~ # tshark -i tap0
Running as user "root" and group "root". This could be dangerous.
Capturing on tap0
0.000000 192.168.7.7 -> 94.100.176.20 TCP 51318 > smtp [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=57466008 TSER=0 WS=7
3.000071 192.168.7.7 -> 94.100.176.20 TCP 51318 > smtp [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=57466909 TSER=0 WS=7
4.996708 00:ff:28:82:a1:ac -> 00:ff:79:83:6b:e4 ARP Who has 10.1.0.1? Tell 10.1.0.2
4.997122 00:ff:79:83:6b:e4 -> 00:ff:28:82:a1:ac ARP 10.1.0.1 is at 00:ff:79:83:6b:e4
9.003380 192.168.7.7 -> 94.100.176.20 TCP 51318 > smtp [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=57468709 TSER=0 WS=7
21.000047 192.168.7.7 -> 94.100.176.20 TCP 51318 > smtp [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=57472309 TSER=0 WS=7
----------------------------------------------------------------

Как видно, пакеты посланные user'ом попадают в tap0, но адрес источника
почемуто стоит 192.168.7.7. При этом сниффер запущенный на eth0 вот так:
tshark -i eth0 host 94.100.176.20 вообще молчит.

Если из таблички knet удалить default route, то интернет пропадает у
всех, включая user'а.
Что я делаю не так?
Спасибо. Пожалуйста. Ок.

apollonx
()

cutter для локальных соединений. или TCPCTL_DROP ioctl для linux

всем привет
нужно дропать некоторые локальные tcp соединения.
при такой схеме: <internet> --- <linux-router> --- <client-machine>, очень удобно рубать соединения на <linux-router> с помощью cutter
но вот нету <linux-router>, только линуксовый десктоп подключенный к интернету
и нужно на нем закрывать некоторые соединения в некоторый момент времени.
я пробовал использовать технику FIN-ACK-RST, как в пакете cutter ( http://www.lowth.com/cutter/ ), но она не работает на локальных соединениях.
вот во фре есть такой ioctl - TCPCTL_DROP.
думаю сделать так: http://www.mail-archive.com/netdev@vger.kernel.org/msg34803.html (тут один коллега сделал патч для линукса, добавляющий аналогичный ioctl)
отговорите? :)
или посоветуйте красивое решение.

apollonx
()

Реализация pthread в linux

Всем привет. Читаю книгу "Advanced Linux Programming" (http://www.advancedlinuxprogramming.com/alp-folder)

В ней в конце четвертой части описывается реализация потоков в linux: "GNU/Linux Thread Implementation". Написано что потоки в linux реализованы как процессы. И приведена программа, которая печатает getpid() из функции main() и из порожденного ей потока:

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void* thread_function (void* arg)
{
  fprintf (stderr, &#8220;child thread pid is %d\n&#8221;, (int) getpid ());
  /* Spin forever. */
  while (1);
  return NULL;
}
int main ()
{
  pthread_t thread;
  fprintf (stderr, &#8220;main thread pid is %d\n&#8221;, (int) getpid ());
  pthread_create (&thread, NULL, &thread_function, NULL);
  /* Spin forever. */
  while (1);
  return 0;
}

В примере вывод этой программы - два разных PID'а, а у меня почемуто она выводит один и тотже PID:

kit@kit ~/src/tmp $ ./thread-pid
main thread pid is 10639
child thread pid is 10639

Также там показано что 'ps x' должна показать три процесса, и что типа один процесс - это поток выполняющий функцию main(), второй - это так называемый manager thread, а третий - это порожденный поток, но у меня 'ps x' показывает только один процесс:

kit@kit ~/src/tmp $ ps x | grep thread-pid
10639 pts/4    Rl    15:30 ./thread-pid

Однако ps -efL показывает два процесса с одинаковым PID, но с разными LWP:

kit@kit ~/src/tmp $ ps -efL | grep thread-pid
kit      10639 23896 10639 95    2 09:58 pts/4    00:08:08 ./thread-pid
kit      10639 23896 10640 95    2 09:58 pts/4    00:08:09 ./thread-pid

В связи с этом возникло два вопроса:
1. Реализация потоков обновленна с момента написания этой книги?
2. что такое LWP в выводе 'ps -efL'?
apollonx
()

RSS подписка на новые темы