Код: Выделить всё
#!/bin/sh
# v.01.00.00 13.03.2014 First working version of firewall
# для начала вводим переменные - для нашего же удобства, чтобы не
# вводить по сотне раз одно и то же, а потом искать почему не работает,
# и в итоге выяснять, что ошибся IP адресом в одном из правил
FwCMD="/sbin/ipfw -q" # собственно где лежит бинарник ipfw
LanOut="vr0" # внешний интерфейс
LanIn="re0" # внутренний интерфейс
IpOut="192.168.0.4" # внешний IP адрес машины
IpIn="10.0.0.1" # внутренний IP машины
NetMask="24" # маска сети
NetIn="10.0.0.0" # Внутренняя сеть
# Сбрасываем все правила:
${FwCMD} -f -q flush
# Проверяем - соответствует ли пакет динамическим правилам:
${FwCMD} add 110 check-state
# Разрешаем весь траффик по внутреннему интерфейсу (петле)
${FwCMD} add 111 allow ip from any to any via lo0
# рубим попытки lo0 куда-то лезть и откуда-то лезть на lo0
${FwCMD} add 112 deny ip from any to 127.0.0.0/8
${FwCMD} add 113 deny ip from 127.0.0.0/8 to any
# Вводим запреты:
# режем частные сети на внешнем интерфейсе - по легенде он у нас
# смотрит в интернет, а значит пакетам этим браться неоткуда на нём.
# рубим частные сeти
${FwCMD} add 114 deny ip from any to 10.0.0.0/8 in via ${LanOut}
${FwCMD} add 115 deny ip from any to 172.16.0.0/12 in via ${LanOut}
${FwCMD} add 116 deny ip from any to 0.0.0.0/8 in via ${LanOut}
# рубим автоконфигуреную частную сеть
${FwCMD} add 117 deny ip from any to 169.254.0.0/16 in via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add 118 deny ip from any to 240.0.0.0/4 in via ${LanOut}
# рубим фрагментированные icmp
${FwCMD} add 119 deny icmp from any to any frag
# рубим широковещательные icmp на внешнем интерфейсе
${FwCMD} add 120 deny log icmp from any to 255.255.255.255 in via ${LanOut}
${FwCMD} add 121 deny log icmp from any to 255.255.255.255 out via ${LanOut}
# а тут собственно файрволл и начался:
# С 20.06.2014 интегрирован ядерный NAT
${FwCMD} nat 1 config log if ${LanOut} same_ports
${FwCMD} add 122 nat 1 ip from 10.0.0.17 to any via ${LanOut}
# Перенаправляю всех на внутренний веб сервер
${FwCMD} add 1000 fwd 10.0.0.1,80 tcp from ${NetIn}/${NetMask} to any 80 via ${LanOut}
# рубим траффик к частным сетям через внешний интерфейс
${FwCMD} add 1001 deny ip from 10.0.0.0/8 to any out via ${LanOut}
${FwCMD} add 1002 deny ip from 172.16.0.0/12 to any out via ${LanOut}
${FwCMD} add 1003 deny ip from 0.0.0.0/8 to any out via ${LanOut}
# рубим автоконфигуреную частную сеть
${FwCMD} add 1004 deny ip from 169.254.0.0/16 to any out via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add 1005 deny ip from 224.0.0.0/4 to any out via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add 1006 deny ip from 240.0.0.0/4 to any out via ${LanOut}
# разрешаем все установленные соединения (если они установились -
# значит по каким-то правилам они проходили.)
${FwCMD} add 1007 allow tcp from any to any established
# разрешаем весь исходящий траффик
${FwCMD} add 1008 allow ip from ${IpOut} to any out xmit ${LanOut}
# DNS
${FwCMD} add 1009 allow udp from any 53 to any via ${LanOut}
${FwCMD} add 1010 allow udp from any to any 53 via ${LanOut}
# разрешаем UDP (для синхронизации времени - 123 порт)
${FwCMD} add 1011 allow udp from any to any 123 via ${LanOut}
# разрешаем ftp снаружи (оба правила - для пасивного режима)
${FwCMD} add 1012 allow tcp from any to ${IpOut} 21 via ${LanOut}
${FwCMD} add 1013 allow tcp from any to ${IpOut} 10000-65535 via ${LanOut}
# разрешаем некоторые типы ICMP траффика - эхо-запрос,
# эхо-ответ и время жизни пакета истекло
${FwCMD} add 1014 allow icmp from any to any icmptypes 0,8,11
# открываем снаружи 80 порт - есть WWW сервер на машине
${FwCMD} add 1015 allow tcp from any to ${IpOut} 80 via ${LanOut}
# открываем снаружи 2200 порт - надо будет ходить на машину по ssh
${FwCMD} add 1016 allow tcp from any to ${IpOut} 2200 via ${LanOut}
# открываем снаружи 27015 порт для CS сервера
${FwCMD} add 1018 allow udp from any to ${IpOut} 27015 via ${LanOut}
# открываем снаружи 27910 порт для Quake2 сервера
${FwCMD} add 1019 allow udp from any to ${IpOut} 27910 via ${LanOut}
# разрешаем весь tcp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add 1020 allow tcp from any to any via ${LanIn}
# разрешаем весь udp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add 1021 allow udp from any to any via ${LanIn}
# разрешаем весь icmp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add 1022 allow icmp from any to any via ${LanIn}
# запрещаем всё и всем
${FwCMD} add deny log ip from any to any
Если написать: ${FwCMD} add 122 nat 1 ip from any to any via ${LanOut} - все ОК
Пробовал так: ${FwCMD} add 122 nat 1 ip from "table(1)" to any via ${LanOut}
Затем руками: ipfw table 1 add 10.0.0.17 перечитываю правила и все равно нет результата.
Помогите плиз, как сделать чтобы для одного ип был доступ?