Во-первых, проверьте если net.inet.ip.fw.one_pass
установлен.
Во-вторых, я не думаю, что Вам нужен тот параметр маски на Вас конфигурация канала. Вы не можете всегда быть уверены, что пакеты прибывают из порта 80, например, если пользователь связывается из-за NAT и т.д.
В-третьих, я попробовал бы его без правил 200 и 300. Я не совсем уверен, как это обрабатывает передачу по каналу внутренне, но Раздел Формирования трафика ipfw(8)
включили в список эти подсказки:
КОНТРОЛЬНЫЙ СПИСОК Здесь является некоторыми важными моментами для рассмотрения при разработке правил:
+o Remember that you filter both packets going in and out. Most connec-
tions нужны пакеты, входящие в оба направления.
+o Remember to test very carefully. It is a good idea to be near the
консоль при выполнении этого. Если Вы не можете быть около консоли, используйте сценарий автовосстановления, такой как тот в/usr/share/examples/ipfw/change_rules.sh.
+o **Do not forget the loopback interface.**
И в-четвертых, я изменил бы правило по умолчанию (= последнее правило 65000) для отклонения всех. Это - хороший дизайн брандмауэра и без него, все, что они другой позволять правила просто потрачены впустую ;)
После ветвления у Вас есть две копии той же программы. Ядро может или скопировать все адресное пространство или копию на записи. В последнем случае текст и разделы данных будут, вероятно, всегда совместно использоваться обоими процессами, и стек будет скопирован, ЕСЛИ ребенок должен изменить его, таким образом, на и так далее.
Поскольку каждому процессу присваивают его собственное адресное пространство ("виртуальная память"), адреса будут, вероятно, оставаться тем же, но относиться к различным адресам памяти в таблице преобразования (при изменении). С точки зрения процесса ничего не происходит с адресами, которые она использует и видит.
Когда процесс разветвлен, Linux делает очень минимальный объем копирования и использует копию на методе записи. Эта копия на записи означает, что, если оба процесса (родитель и ребенок) делают чтения, они будут читать из тех же самых блоков памяти. После того как один из них пишет в ту память, он копируется и больше не совместно используется.
Теперь программы не знают, что это происходит. Это вызвано тем, что ядро поддерживает таблицу страниц для каждого процесса. Когда процесс говорит, что 'Я хочу получить доступ к памяти 0xbeef' перекарты ядра это в фактическое местоположение в физической памяти. Это необходимо, потому что программа сохранит эти адреса в переменных, поэтому когда программа будет разветвлена, она, наклон знает, если или куда данные в его памяти перемещены в (все те адреса, сохраненные в переменных, должны продолжить быть допустимыми).
Это также, что позволяет подкачке работать. Ядро может взять физическую память, содержащую данные, и сохранить его к диску, но программа все еще сошлется на адрес 0xbeef, и ядро переведет это.
Таким образом, абсолютный минимум, который ядро заканчивает тем, что копировало, является таблицей страниц, которая делает это отображение адресов и структуру задачи (покрытия открытые файлы, состояние процесса, незаконченные сигналы, и т.д.).
Целое адресное пространство клонировано. Другими словами, то изображение описывает оба процесса после ветвления. После этого процессы отличаются друг от друга, поскольку каждый из них изменяет вещи по-разному.
man 2 fork
– Patrick
11.02.2012, 04:32