LINUX.ORG.RU
ФорумAdmin

pf с двумя локалками

 


0

1

это pf на фре, а не на опене, но конфиг очень простой, так что, по идее, без разницы.

есть сервер с двумя локальными интерфейсами:

LAN1: (re1) 192.168.5.1/24

LAN2: (nfe0) 192.168.10.1/24

хосты из LAN1 не видят хостов из LAN2 и наоборот.

фрагмент конфига:

# Incoming traffic on $int_if
block return in on $int_if1 all
block return in on $int_if2 all

# Filter LAN ---> Inet traffic
pass in on $int_if1 proto icmp from $int_if1:network to any keep state
pass in on $int_if1 proto tcp from $int_if1:network to any port $nat_tcp_ports $mod_state $sto_nat_ports
pass in on $int_if1 proto udp from $int_if1:network to any port $nat_udp_ports keep state $sto_nat_ports
pass in on $int_if2 proto icmp from $int_if2:network to any keep state
pass in on $int_if2 proto tcp from $int_if2:network to any port $nat_tcp_ports $mod_state $sto_nat_ports
pass in on $int_if2 proto udp from $int_if2:network to any port $nat_udp_ports keep state $sto_nat_ports

# Accept LAN ---> My external interface
pass in on $int_if1 proto tcp from $int_if1:network to ($ext_if) $mod_state $sto_nat_ports
pass in on $int_if1 proto udp from $int_if1:network to ($ext_if) keep state $sto_nat_ports
pass in on $int_if2 proto tcp from $int_if2:network to ($ext_if) $mod_state $sto_nat_ports
pass in on $int_if2 proto udp from $int_if2:network to ($ext_if) keep state $sto_nat_ports

# Allow broadcasts on internal interfaces
pass in on $int_if1 proto udp to 255.255.255.255 keep state
pass in on $int_if1 proto udp to $int_if1:broadcast keep state
pass in on $int_if2 proto udp to 255.255.255.255 keep state
pass in on $int_if2 proto udp to $int_if2:broadcast keep state

# Pass packets sent to me on local interfaces
pass in on $int_if1 from $int_if1:network to ($int_if1) keep state
pass in on $int_if2 from $int_if2:network to ($int_if2) keep state

# Pass LAN trafic
pass in on $int_if1 from $int_if1:network to $int_if2:network keep state
pass in on $int_if2 from $int_if2:network to $int_if1:network keep state


# Outgoing traffic on $int_if
pass out on $int_if1 all keep state
pass out on $int_if2 all keep state

причем, айпи адрес сервера из другого LANа пингуется, а хост нет:

[на 192.168.5.10]> ping -c3 192.168.10.1
PING 192.168.10.1 (192.168.10.1): 56 data bytes
64 bytes from 192.168.10.1: icmp_seq=0 ttl=64 time=1.326 ms
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.987 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.986 ms

--- 192.168.10.1 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.986/1.100/1.326/0.160 ms

[на 192.168.5.10]> ping -c3 192.168.10.100
PING 192.168.10.100 (192.168.10.100): 56 data bytes

--- 192.168.10.100 ping statistics ---
3 packets transmitted, 0 packets received, 100.0% packet loss

с сервера пингуется все. в чем может быть ошибка?

★★★★

Глупый вопрос, но у тебя net.inet.ip.forwarding включён?

PS: как-то у тебя много лишних и ретундантных правил. Чуть позже, может быть, если будет время, попробую причесать их для тебя.

beastie ★★★★★
()
Ответ на: комментарий от beastie

да, у меня тоже было такое подозрение, но перепроверил - gateway_enable таки есть в rc.conf и эта переменная включена:

> sysctl net.inet.ip.forwarding
net.inet.ip.forwarding: 1

еще на сервере запущен безголовый виртуал бокс, на нем единственная виртуалка с виндой, в которой сеть сделана бриджем с nfe0. пробовал выключать его - форвардинга все равно нет.

moot ★★★★
() автор топика
Последнее исправление: moot (всего исправлений: 1)
Ответ на: комментарий от moot

В общем, я его тебе немного подрихтовал для симетричного варианта. Поубирал лишнее, свернул и упростил немного:

int = "re1, nfe0"

# Block all in
block in 

# LAN ---> Inet traffic
pass in on {$int} inet proto {tcp, udp} to !(self)
match out on egress inet nat-to (egress)

# Pass packets sent to me on local interfaces
pass in on {$int} to (self)

# Allow ping on all interfaces
pass in inet proto icmp all icmp-type echoreq

# Let all out
pass out 
PS: awoid iptables tar-pit! ;)

beastie ★★★★★
()
Ответ на: комментарий от beastie

спасибо, но к сожалению, теперь имеет значение, что у меня не опен: ругается на строку с match по поводу syntax error.

мы бедные и pf у нас старый :) кроме того, это была только часть моего конфига, там на самом деле еще про внешний интерфейс, таблицы, трафик шейпинг и нат на 184 строк. не хочу напрягать тебя переписываением всего этого наследства моих экспериментов.

moot ★★★★
() автор топика
Ответ на: комментарий от moot

match можно заменить на pass, но суть не в этом. ;)

Педагогической целью было показать, что pf сам прекрасно умеет разворачивать правила. Это вам не iptables. :D

Наример вот эта одна строчка:

pass in on {$int} inet proto {tcp, udp} to !(self)
(сама) развернётся в 4 правила:
pass in on re1 inet proto tcp to !(self)
pass in on re1 inet proto udp to !(self)
pass in on nfe0 inet proto tcp to !(self)
pass in on nfe0 inet proto udp to !(self)

Т.о. твой конфиг можно переписать с 184-и строк в 50 (а то и меньше). И тебе это будет проще понимать/поддерживать, и места для ошибок/опечатак меньше. Да и просто это будет приятней читать.

В обем, остеригайся ненужной избыточности. :)

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)

по теме: пока включил NAT из сети 1 в сеть 2. через жопу, но хоть подключился к хосту.

moot ★★★★
() автор топика
Ответ на: комментарий от moot

В опен — это интерфейс с default route. Очень удобно, что бы не хардкодить имена интерфейсов.

beastie ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.