Advanced IPFW rules
Полное описание
Примеры правил
С помощью данной конструкции можно запретить соединение по протоколу telnet (порт 23) с хоста evilhost.org на хост baby.ua:
ipfw add deny tcp from cracker.evil.org to wolf.kiev.ua telnet
Данные правила отвергают все входящие соединения с компьютеров, имеющих IP-адреса 192.168.168.1 по 192.168.168.254 При этом выдается соответствующее ICMP-сообщение:
ipfw add reject tcp from any to 192.168.168.0/26 out
ipfw add reject tcp from 192.168.168.0/26 to me in
Данные правила ограничивают число соединений, которое может быть открыто пользователем. Брандмауэр (предполагается, что он запущен на шлюзе) разрешает каждому хосту в сети 10.10.10.0/24 открыть максимум 10 соединений. Кроме того, брандмауэр может может быть настроен на сервер так, чтобы убедиться, что один клиентский компьютер совершает не более четырех одновременных соединений.
pfw add allow tcp from 10.10.10.0/24 to any via fxp1 setup limit src-addr 10
ipfw add allow tcp from any to me limit src-addr 4
ВНИМАНИЕ: Такое правило может быть использовано для атак типа DoS (отказ в обслуживании) путем “SYN-затопления”, которое открывает огромное число динамических правил. Ущерб от таких атак может быть значительно ограничен путем варьирования установок переменно sysctl, которые контролируют действие брандмауэра.
Следующее правило вводит ограничение скорости для хоста 192.168.0.9. Скорость ограничивается 64Кбит/с
ipfw add pipe 31 ip from any to 192.168.0.9 out via fxp1
ipfw pipe 31 config 31 bw 64Kbit/s
А это правило может быть полезно для “проштрафившихся” пользователей, например, которые не оплачивают работу долгое время. Работать-то можно, но теряется большая часть пакетов (75%) и задержка оставшихся составляет 100 мс, следовательно, страницы будут открываться очень медленно.
ipfw add pipe 101 ip from any to 192.168.168.0:255.255.255.246 via ed0
ipfw pipe config 101 delay 100ms plr 0.75
В следующем примере скорость ограничивается значением 128Кбит/с, но при этом задержка каждого пакета составляет 120 мс:
ipfw add pipe 1025 tcp from me to any 25 out via fxp0
ipfw pipe 1025 config bw 128Kbit/s delay 120ms
Эмуляция полнодуплексного канала, более похожая на работу по протоколу V.90. Здесь трафик имеет асимметричных характер: относительно пользователя 192.168.0.87 трафик имеет асимметричный характер - скорость входящего трафика 57600 бит/с, а скорость исходящего трафика - 33600 бит/с.
ipfw add pipe 23 ip from any to 192.168.0.87 out
ipfw add pipe 24 ip from 192.168.0.87 to any in
ipfw pipe 23 config 57600bit/s
ipfw pipe 24 config 33600bit/s
А это эмуляция полудуплексного канала:
ipfw add pipe 6 ip from any to 192.168.0.100 out via ed0
ipfw add pipe 6 ip from 192.168.0.100 to any in via ed0
Одной из положительных особенностей новой версии dummynet является способность имитировать множество путей между отправителем и получателем. Это делается с использованием вероятностей величины prob. При условии, что пакет является правильным (т. е. он циркулирует от хоста А к хосту В), первое правило будет выполняться с вероятностью 1/3; в оставшихся 2/3 случаях будет происходить переход ко 2-му правилу, которое будет выполняться с вероятностью 1/2 (0.5) (так что 1/2*2/3=1/3); в оставшихся 1/3 случаев будет происходить переход к третьему правилу, которое имеет вероятность 1. Мы можем конфигурировать эти 3 канала по желанию, чтобы эмулировать, например, такие явления, как повторный запрос пакета и т. д.
ipfw add prob 0.33 pipe 1 ip from A to B
ipfw add prob 0.5 pipe 2 ip from A to B
ipfw add pipe 3 ip from A to B
ipfw pipe 1 config ...
ipfw pipe 2 comfig ...
ipfw pipe 3 config ...
Несколько более сложный пример эмуляции полудуплексного канала, когда трафик, направляемый компьютеру с адресом 192.168.0.110 имеет более высокий приоритет, чем получаемый от него. Это может иметь смысл, чтобы, например, отправляемая почта больших размеров не мешала ходить по сайтам.
ipfw add queue 16 tcp from any to 192.168.0.110 out via ed0
ipfw add queue 17 tcp from 192.168.0.110 to any in via ed0
ipfw queue 16 config weight 10 pipe 160
ipfw queue 17 config weight 7 pipe 160
ipfw pipe 160 config bw 128Kbit/s
Для приоретизации трафика можно применять следующую конструкцию:
ipfw add queue 10 tcp from any 20,21 to any 1024-65535 in via fxp0
ipfw add queue 20 tcp from any 1024-65535 to any 20,21 out via fxp0
ipfw add queue 10 tcp from any 1024-65535 to any 1024-65535 in via fxp0
ipfw add queue 10 tcp from any 1024-65535 to any 1024-65535 out via fxp0
ipfw queue 10 config weight 1 pipe 10
ipfw queue 20 config weight 1 pipe 20
ssh
ipfw add queue 50 tcp from any 22 to any 1024-65535 in via fxp0
ipfw add queue 60 tcp from any 1024-65535 to any 22 out via fxp0
ipfw queue 50 config pipe 10 weight 100
ipfw queue 60 config pipe 20 weight 100
pipes
ipfw add pipe 10 tcp from any to any in via fxp0
ipfw pipe 10 config
ipfw add pipe 20 tcp from any to any out via fxp0
ipfw pipe 20 config
all traffic (весь остальной трафик):
ipfw add check-state
ipfw deny tcp from any to any established
ipfw allow tcp from 192.168.0.0/24 to any setup keep-state
Это пример динамического правила.
При помощи конструкции probe можно использовать разделение трафика по двум различным каналам. Например:
ipfw add prob 0.34 forward 212.1.1.254 ip from 212.1.2.0/24 to any
Здесь часть пакетов (примерно 34%), поступающих из сети 212.1.2.0:255.255.255.0, будет перенаправлено на “альтернативный” шлюз - хост 212.1.1.254.
Про роутинг
Подробное описание IPFW