Я пишу серверное приложение (своего рода VPN сервер для роутера с линуксом на борту), читающее IP пакеты от клиентов и посылающих их с помощью IPv4 RAW сокета.sockrawip = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
struct sockaddr_in sindest;
sindest.sin_family = AF_INET;
sindest.sin_addr.s_addr = ip_header->daddr;sendto(sockrawip, ip_header, ntohs(ip_header->tot_len),
0, (struct sockaddr *) &sindest, sizeof (sindest));Все работает замечательно для пакетов предназначенных для локальной сети. Но на пакеты посылаемые в интернет я никогда не получаю ответ. Ваиршарк показывает что пакет послан скажем гуглу, но source IP у такого пакета остается прежний (те локальный IP). Судя по всему данные с "сырого" сокета не попадают в цепочку MASQUERADE и следовательно роутер не делает наттинг для них. Прав ли я и как это починить? Заранее спасибо.
Если это приложение запускается на самом роутере, то почему бы не биндить его к внешнему, или вообще ко всем адресам сразу (0.0.0.0 в IPv4)? Тогда никакого маскарада ему не нужно будет.
Скорее всего в правиле ната указан протокол tcp, а вы работаете на уровень ниже. Попробуйте убрать критерий протокола -p tcp из правила, ну и специфические для этого протокола условия тоже. Также стоит проверить, что стоит в FORWARD, скорее всего опять таки пускаются только tcp пакеты и только с определенными флагами.
>Скорее всего в правиле ната указан протокол tcp, а вы работаете на уровень ниже.Да вроде бы нет, правило для маскарада только одно
iptables -t nat -A POSTROUTING -j MASQUERADE
так что по идее и tcp/udp/icmp траффик должен обрабатываться. Скорее всего проблемма в самом сокете :(
>>Скорее всего в правиле ната указан протокол tcp, а вы работаете на уровень ниже.
>
>Да вроде бы нет, правило для маскарада только одно
>
>iptables -t nat -A POSTROUTING -j MASQUERADE
>
>так что по идее и tcp/udp/icmp траффик должен обрабатываться. Скорее всего проблемма
>в самом сокете :(Для чего на машине, которая имеет public ip отправлять пакеты через nat?
>Для чего на машине, которая имеет public ip отправлять пакеты через nat?Хмм, а как по вашему роутеры работаю? К коробке с внешним ip подключены несколько компьютеров = локальная сеть. Любой пакет посланный одним из этих комптютеров натится роутером, иначе ответный пакет будет послан на локальный айпи отправителя. Я по большому счету эмулирую этот самый локально подключенный компьютер с помощью raw сокета. Но к сожалению ответ от гугла не приходит, следовательно бокс не делает нат для подобных пакетов.
>>Для чего на машине, которая имеет public ip отправлять пакеты через nat?
>
>Хмм, а как по вашему роутеры работаю? К коробке с внешним ip
>подключены несколько компьютеров = локальная сеть. Любой пакет посланный одним из
>этих комптютеров натится роутером, иначе ответный пакет будет послан на локальный
>айпи отправителя. Я по большому счету эмулирую этот самый локально подключенный
>компьютер с помощью raw сокета. Но к сожалению ответ от гугла
>не приходит, следовательно бокс не делает нат для подобных пакетов.Еще раз, если Вы отправляете пакет с машины, которая подключена непосредственно к интернету и пытаетесь запихнуть его в цепочку MASQUERADE - то это глупость.
Если Вы пытаетесь отправить пакет с локальной машины через роутер с MASQ - для других пакетов MASQ работает?
>Еще раз, если Вы отправляете пакет с машины, которая подключена непосредственно к
>интернету и пытаетесь запихнуть его в цепочку MASQUERADE - то это
>глупость.Давайте объясню еще раз. Для начала рассмотрим типичню сеть
компьютер - ЛАН - роутер - интернет - гугл
адрес Х адрес У адрес ГЕсли с компьютера сделать пинг гуглу, то он пошлет пакет ОтХдоГ который попадет на роутер. Роутер (который имеет паблик айпи - адрес У) же в свою очередь пошлет в интернет пакет с адресами вида ОтУдоГ. Гугл получит этот пакет и ответит на адрес У.
В моем случае, приложение запущенное на роутере получает(как именно и зачем, не суть вопроса) пакет ОтХдоГ и посылает его в сеть с помощю сырого сокета. НО, роутер не заменяет адресХ на адрес У и поэтому в интернет уходит пакет для гугла, но с обратным адресом Х. То есть когда гугл ответит на посланный пинг, ответ удет на адрес типа 192.168.1.10.
>Если Вы пытаетесь отправить пакет с локальной машины через роутер с MASQ
>- для других пакетов MASQ работает?Да, работает.
Есть идеи?
В POSRTOUTING попадают только транзитные пакеты. Локально сгенерированый трафик отправляется в nat.OUTPUTНе уверен что для этой цепочки применим SNAT/MASQUERADE, но это и не нужно. Будучи запущеным на роутере, приложение в состоянии отправлять пакеты с адреса реального интерфейса и без всяких шаманств с iptables.
> Будучи запущеным на роутере, приложение в состоянии отправлять пакеты с
>адреса реального интерфейса и без всяких шаманств с iptables.Так я и не говорю что пакеты не отправляются. Очень даже отправляются, только вот исходящий адрес там не совсем верный. Я чуть выше http://www.opennet.me/openforum/vsluhforumID9/7319.html#7
более подробно описал что происходит.
>Есть идеи?В этом случае NAT должен выполняться средствами приложения. См. natd из FreeBSD например.