Доброго дня!Был бы очень признателен, если бы кто-то прояснил ситуацию с прохождением
пакетов через сетевой стёк - добавление мета-информации о recv, xmit интерфейсах
и со сменой направления in/out. Особенно после выхода из ipfw nat и pipe/queue.
На каком-то примере думаю будет проще.
Может такой случай:
Шлюз с двумя сетевыми картами int_if и ext_if.
Задача шлюза - выпускать локальную сеть localnet в мир и разграничивать скорость -
каждому по потребностям.
Будем использовать для этих целей:
FreeBSD 7.2
ipfw
ipfw nat
dummynet
net.inet.ip.fw.one_pass=0
То есть, имеем:
## /etc/sysctl.conf
## net.inet.ip.fw.one_pass=0
ipfw_cmd="/sbin/ipfw -q"
## Внешний интерфейс
ext_if="vr0"
## ip адрес сервера на внешнем интерфейсе
ext_ip="1.2.3.4"
## Внутренний интерфейс
int_if="vr1"
## Внутренняя сеть
localnet="10.10.10.0/24"
## NAT
${ipfw_cmd} nat 1 config log if ${ext_if} reset same_ports deny_in
## Входящий канал -> pipe 1
${ipfw_cmd} pipe 1 config bw 3950Kbit/s
## Исходящий канал -> pipe 2
${ipfw_cmd} pipe 2 config bw 950Kbit/s
## Очереди на входящий канал (pipe 1) -> 1x
# Важный трафик: TCP RST, TCP PSH, TCP SYN, TCP FIN
${ipfw_cmd} queue 10 config pipe 1 weight 100
# Сотрудники
${ipfw_cmd} queue 11 config pipe 1 weight 30 mask dst-ip 0xffffffff
## Очереди на исходящий канал (pipe 2) -> 2x
# Важный трафик: TCP RST, TCP PSH, TCP SYN, TCP FIN
${ipfw_cmd} queue 20 config pipe 2 weight 100
# Сотрудники
${ipfw_cmd} queue 21 config pipe 2 weight 30 mask src-ip 0xffffffff
Шейпить трафик будем до входа в ipfw nat, и после выхода из него.
Дальше, чтобы продолжить составление правил, нужно понимание процесса :)
Возьмём компьютер любого сотрудника. Сотрудник пытается зайти на сайт yandex.ru.
Пакет попадает в проход in через сетевую int_if, то есть языком ipfw
in recv ${int_if}
Значит пишем следующее:
${ipfw_cmd} add 100 skipto 1000 ip from ${localnet} to any in recv ${int_if}
## in recv ${int_if}
${ipfw_cmd} add 1010 queue 20 ip from ${localnet} to any { tcpflags syn or tcpflags fin or tcpflags rst or tcpflags psh } in recv ${int_if}
${ipfw_cmd} add 1020 queue 21 ip from ${localnet} to any in recv ${int_if}
Дальше после выхода из очереди пакет, если верить документации :), проверяется напротив следующего правила, а не
с самого начала ruleset-а и, я так понимаю, мета-информация пакета осталась прежней, то есть
in recv ${int_if}
Поэтому пишем правило для NAT-а:
${ipfw_cmd} add 1030 nat 1 ip from ${localnet} to any in recv ${int_if}
NAT подменил ip сотрудника из localnet на ip интерфейса ext_if и, снова-таки если верить документации :), пакет идёт
в следующее правило, а не в начало ruleset-а, но мета-информация теперь какая???
ip from ext_ip to any in recv ${int_if} теперь как-то неправильно,
так как у пакета теперь ip интерфейса ext_if :)
ip from 1.2.3.4 to any in recv ${int_if}
???
Как оно на самом деле? После ipfw nat какая мета-информация в пакета? Как она меняется?
Заранее всем спасибо!