From: Sviatoslav Sviridov <svd@altlinux.ru>
To: ALT Devel discussion list <devel@lists.altlinux.org>
Subject: Re: [devel] Q: /etc/net 0.8 и Compact 3.0
Date: Sun, 16 Apr 2006 14:01:55 +0300
Message-ID: <44422423.1020605@altlinux.ru> (raw)
In-Reply-To: <4440D6A7.6020604@altlinux.ru>
[-- Attachment #1.1: Type: text/plain, Size: 4372 bytes --]
Sviatoslav Sviridov пишет:
> ...
>
> Какие еще существенные изменения будут в 0.8.0? Подозреваю, что "код
> лучше" может быть причиной появления новых "неисправимых преимуществ" ;)
>
> В частности, меня интересует будут ли какие-нить изенения в части
> работы с pptp и с resolv.conf?
Ну вот, сегодня опять пришлось руками лезть в ipv4route... решил по
горячим следам вспомнить давнишние свои размышления на эту тему и
попытаться воплотить их в коде...
Итого:
Имеется настроенное pptp соединение (интерфейс ppp0).
Проблема в том, что defaultroute на это соединение мне поднимать не
надо, а значит надо прописывать маршруты на подсеть (подсети). etcnet
сам этого делать не умеет, поэтому надо это делать самостоятельно в
/etc/net/ifaces/ipv4route.
Первая проблема в том, что для того, чтобы прописать правильный маршрут
надо как минимум один раз поднять pp(t)p интерфейс и посмотреть кто же
там будет peer и адрес из какой сети нам дадут.
Если с адресом сети в моем случае и нет проблемы, я его знаю и он
меняться не собирается, то вот peer является второй проблемой. Он может
менятся вермя от времени... т.е., в совершенно неожиданные моменты
времени я могу получить неработающее соединение (до тех пор, пока не
обновлю ipv4rote).. Итого, я несколько раз уже добавлял маршруты в
ipv4route (срабатывает только один, на остальные идет ругань, но зато
так меньше вероятность сломаться :))... Сегодня пришлось бы вписывать
четвертую строчку с маршрутом на одну и ту же сеть...
Однако попытался пойти другим путем :)
На данный момент имеем ситуацию, при которой нельзя настроить впн
соединение так, чтобы оно "просто работало" (головная боль писателя
конфигуратора? ;) ) Если возможность создавать требуемые маршруты не
можеть быть встроена непосредственно в etcnet (как я понимаю, pilot
этого делать не собирается), то было бы неплохо предоставить такие
возможности, чтобы требуемую конфигурацию можно было бы легко создать
имеющимися средствами. В данном случае - чтобы в ipv4route можно было бы
задавать правила, которые раскрывались бы в момент исполнения в
соостветствии с текущей конфигурацией. Например, так:
$MY_NETWORK/$MY_MASK via $PEER
Для простоты реализации я воспользовался шеллом как готовым средством,
умеющим раскрывать значения переменных ;) Тем более, что сам etcnet
вовсю этим пользуется внутри себя (здесь появляется дополнительное
ограничение: имена надо выбирать таким образом, чтобы они не
пересекались с теми, что уже используются в etcnet).
Алгоритм следующий:
- в ipv4route прописываются маршруты с использованием шелловских переменных
- перед обработкой ipv4route обрабатывается вывод "$IP addr show dev
$NAME" и устанавливаются значения необходимых переменных
- во время обработки ipv4route в каждой строчке раскрываются значения
переменных. Если какая-то переменная не раскрылась, то такая строчка
просто отбрасывается
- по окончании обработки созданные переменные удаляются
При этом такой подход можно использовать не только для ipv4route, но и в
других местах etcnet.
То, что получилось и сейчас работает, приаттачено.
Сейчас для меня важно было только подхватывать правильный peer, поэтому
только это и сделано :)
Следующим шагом хотелось вычислить адрес сети на основании заданной
маски (в случае pp(t)p адрес сети не назначется сервером, а маска
выставляется только для peer, причем там я видел только /32). Для
соединений типа link/ether маску сети можно брать прямо из
установленного адреса (вида x.x.x.x/m), для link/ppp ее надо будет
задавать извне... но в данный момент мне заниматься этим стало лень и
некогда :), так что отсылаю на суд общественности то, что есть :) Это не
готовый патч для включения в состав, а всего лишь proof of concept пока что.
У меня это работает со следующим содержимым ipv4route:
10.6.0.0/16 via $PEER_IPADDR1
172.27.0.0/16 via $PEER_IPADDR1
Для задания универсальной конфигурации, которая работала бы "из коробки"
без вмешательства пользователя, надо по полученному ip адресу задать
адрес сети, взяв маску, соответствующую классу сети.
Здесь, конечно, есть большая неприятность в том, что фалы конфигурации
становятся подвержены shell injection... Каким образом можно снизить
такой риск?
--
Best regards,
Sviatoslav Sviridov
--
Q: How many IBM CPU's does it take to execute a job?
A: Four; three to hold it down, and one to rip its head off.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: etcnet-smartroutes.patch --]
[-- Type: text/x-patch; name="etcnet-smartroutes.patch", Size: 1433 bytes --]
--- /etc/net/scripts/functions.orig 2006-04-15 01:02:00 +0300
+++ /etc/net/scripts/functions 2006-04-16 13:42:21 +0300
@@ -4,7 +4,15 @@
[ -s "$optionsfile" ] && . $optionsfile
done
-DENOISE="egrep ^[^#]"
+denoise()
+{
+ local line
+ [ -s "$1" ] && cat "$1"| while read line; do
+ eval "set -u;echo \"$line\"" 2>/dev/null
+ done|egrep -v '(^#|\$)'
+}
+
+DENOISE="denoise"
# Stolen from /etc/init.d/functions and improved.
is_yes()
--- /etc/net/scripts/config-ipv4.orig 2005-08-10 11:08:40 +0300
+++ /etc/net/scripts/config-ipv4 2006-04-16 12:50:23 +0300
@@ -75,6 +75,10 @@ config_routes_rules()
{
# setup routes
local SRCFILE=`profiled_filename $MYIFACEDIR/ipv4route`
+ # get available device information
+ DEVINFO=`$IP addr show dev $NAME`
+ DEVCONFIG=`echo $DEVINFO|tr ' ' '\n'|awk -v force_mask="$FORCE_NETMASK" -f $SCRIPTDIR/parse.awk`
+ eval "$DEVCONFIG"
[ -s "$SRCFILE" ] && $DENOISE "$SRCFILE" | \
while read FIRST REST; do
# If there is no operation, substitute default, otherwise keep.
@@ -88,6 +92,12 @@ config_routes_rules()
esac
print_progress
done
+
+ # Unset variables
+ DEVCONF_UNSET=`echo "$DEVCONFIG"|sed -e 's:^\([^=]*\)=.*:unset \1:'`
+ eval "$DEVCONF_UNSET"
+ unset DEVCONF_UNSET
+ unset DEVCONFIG
# Setup rules only after routes are Ok, so that route tables are
# already populated when rule starts routing traffic to them.
[-- Attachment #1.3: parse.awk --]
[-- Type: text/plain, Size: 898 bytes --]
BEGIN {
addr_num=0
}
function get_mask(prefix, suffix) {
if (prefix <= 0)
return 0
if (prefix >= 32)
return 0xffffffff
suffix = 32 - prefix
return lshift(rshift(0xffffffff, suffix), suffix)
}
function decode_mask(mask, m1, m2, m3, m4) {
m1 = rshift(and(mask, 0xff000000), 24)
m2 = rshift(and(mask, 0x00ff0000), 16)
m3 = rshift(and(mask, 0x0000ff00), 8)
m4 = and(mask, 0x000000ff)
return sprintf("%d.%d.%d.%d", m1, m2, m3, m4)
}
/inet/ {
getline ipaddr
split(ipaddr, a, "/")
printf "IPADDR%d=%s\n", ++addr_num, a[1]
if ( length(force_mask) > 0 ) {
printf "NETMASK%d=%s\n", addr_num, decode_mask(get_mask(force_mask))
} else if ( a[2] )
printf "NETMASK%d=%s\n", addr_num, decode_mask(get_mask(a[2]))
}
/peer/ {
getline peer
split(peer, p, "/")
mask = get_mask(p[2])
printf "PEER_IPADDR%d=%s\n", addr_num, p[1]
}
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 252 bytes --]
next prev parent reply other threads:[~2006-04-16 11:01 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-04-14 13:37 Denis Ovsienko
2006-04-14 13:45 ` Anton Farygin
2006-04-14 14:03 ` Denis Ovsienko
2006-04-14 14:29 ` Sergey Y. Afonin
2006-04-14 14:39 ` Michael Shigorin
2006-04-14 14:54 ` Sergey Y. Afonin
2006-04-14 19:43 ` Denis Ovsienko
2006-04-15 8:42 ` Michael Shigorin
2006-04-15 11:19 ` Sviatoslav Sviridov
2006-04-15 12:13 ` Valery V. Inozemtsev
2006-04-15 12:15 ` Andrey Rahmatullin
2006-04-15 12:20 ` Valery V. Inozemtsev
2006-04-15 13:09 ` Andrey Rahmatullin
2006-04-15 16:11 ` Sviatoslav Sviridov
2006-04-16 7:53 ` Denis Ovsienko
2006-04-16 11:01 ` Sviatoslav Sviridov [this message]
2006-04-16 12:21 ` Michael Shigorin
2006-04-17 18:08 ` Andrey Brindeew
2006-04-18 11:07 ` Sergey Y. Afonin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=44422423.1020605@altlinux.ru \
--to=svd@altlinux.ru \
--cc=devel@lists.altlinux.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
ALT Linux Team development discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
public-inbox-index devel
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.devel
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git