Привет знатокам PF!Пытаюсь глубже понять механику работы pf
Как будет работать следующее правило?anchor active_ftp out on $ext_if proto tcp to port ftp
anchor "active_ftp" {
pass in on $ext_if proto tcp from any port ftp-data to any port > 1024
}Интересует, если во время сеанса ftp открывается доступ ко всем портам > 1024 со всех хостов с 20 порта или только с того с кем установлен сеанс ftp?
т.е. будет-ли уязвима машина с любого хоста 20 порта во время сеанса ftp?Спасибо.
>[оверквотинг удален]
> anchor "active_ftp" {
> pass in on $ext_if proto tcp from any
> port ftp-data to any port > 1024
> }
> Интересует, если во время сеанса ftp открывается доступ ко всем портам >
> 1024 со всех хостов с 20 порта или только с того
> с кем установлен сеанс ftp?
> т.е. будет-ли уязвима машина с любого хоста 20 порта во время сеанса
> ftp?
> Спасибо.по моему правила в якоре никогда не сработает, потому что в фильтре одни условия а в anchor "active_ftp" другие
> по моему правила в якоре никогда не сработает, потому что в фильтре
> одни условия а в anchor "active_ftp" другиеКак раз в этом и фокус.
Правило в якоре должно сработать лишь когда идет соединение на порт 21
И, похоже оно срабатывает
Вот лог:
~# pfctl -ss |grep 193.162.146.4
all tcp XXX.XXX.XXX.XXX:20858 -> 193.162.146.4:21 ESTABLISHED:ESTABLISHED
all tcp XXX.XXX.XXX.XXX:34157 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
all tcp XXX.XXX.XXX.XXX:62719 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
all tcp XXX.XXX.XXX.XXX:50760 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
all tcp XXX.XXX.XXX.XXX:46470 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
all tcp XXX.XXX.XXX.XXX:56813 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
all tcp XXX.XXX.XXX.XXX:47993 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2без якоря ftp не работает, в логах только:
# pfctl -ss |grep 193.162.146.4
all tcp XXX.XXX.XXX.XXX:20858 -> 193.162.146.4:21 TIME_WAIT:TIME_WAITБеспокоит другое.
Может кто-либо посторонний проникнуть на хост во время сеанса ftp если порт источника: 20?
>[оверквотинг удален]
> Правило в якоре должно сработать лишь когда идет соединение на порт 21
> И, похоже оно срабатывает
> Вот лог:
> ~# pfctl -ss |grep 193.162.146.4
> all tcp XXX.XXX.XXX.XXX:20858 -> 193.162.146.4:21 ESTABLISHED:ESTABLISHED
> all tcp XXX.XXX.XXX.XXX:34157 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
> all tcp XXX.XXX.XXX.XXX:62719 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
> all tcp XXX.XXX.XXX.XXX:50760 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
> all tcp XXX.XXX.XXX.XXX:46470 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
> all tcp XXX.XXX.XXX.XXX:56813 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2Нет.
> all tcp XXX.XXX.XXX.XXX:47993 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
> без якоря ftp не работает, в логах только:
> # pfctl -ss |grep 193.162.146.4
> all tcp XXX.XXX.XXX.XXX:20858 -> 193.162.146.4:21 TIME_WAIT:TIME_WAIT
> Беспокоит другое.
> Может кто-либо посторонний проникнуть на хост во время сеанса ftp если порт
> источника: 20?
>[оверквотинг удален]
>> all tcp XXX.XXX.XXX.XXX:46470 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
>> all tcp XXX.XXX.XXX.XXX:56813 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
> Нет.
>> all tcp XXX.XXX.XXX.XXX:47993 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
>> без якоря ftp не работает, в логах только:
>> # pfctl -ss |grep 193.162.146.4
>> all tcp XXX.XXX.XXX.XXX:20858 -> 193.162.146.4:21 TIME_WAIT:TIME_WAIT
>> Беспокоит другое.
>> Может кто-либо посторонний проникнуть на хост во время сеанса ftp если порт
>> источника: 20?Понял,
Спасибо.
что-то вы не допаказываете, вот счетчики после короткого сеанса по ftproot@freebsd84_100:/etc # pfctl -ss -v
No ALTQ support in kernel
ALTQ related functions disabled
all tcp 10.10.0.49:46622 -> 10.10.0.254:21 FIN_WAIT_2:FIN_WAIT_2
[2859643363 + 5792] wscale 3 [2420072735 + 66144] wscale 5
age 00:02:04, expires in 00:01:23, 32:31 pkts, 1818:3181 bytes, anchor 2, rule 2
all tcp 10.10.0.49:23822 -> 10.10.0.254:35126 FIN_WAIT_2:FIN_WAIT_2
[2018321773 + 5792] wscale 3 [2408701215 + 66144] wscale 5
age 00:00:56, expires in 00:00:34, 4:4 pkts, 216:1589 bytes, anchor 3, rule 3
all tcp 10.10.0.49:63133 -> 10.10.0.254:46086 FIN_WAIT_2:FIN_WAIT_2
[4144546923 + 5792] wscale 3 [2394323450 + 66144] wscale 5
age 00:00:11, expires in 00:01:19, 9:12 pkts, 476:13933 bytes, anchor 3, rule 3
root@freebsd84_100:/etc # pfctl -sr -v
No ALTQ support in kernel
ALTQ related functions disabled
pass in quick on net0 inet proto tcp from any to any port = ssh flags S/SA keep state
[ Evaluations: 10 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 1394 ]
pass out quick on net0 inet proto tcp from any port = ssh to any flags S/SA keep state
[ Evaluations: 4 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 1394 ]
anchor "active_ftp" out quick on net0 proto tcp from any to any port = ftp
[ Evaluations: 4 Packets: 63 Bytes: 4999 States: 1 ]
[ Inserted: uid 0 pid 1394 ]
anchor "active_ftp" all
[ Evaluations: 9 Packets: 37 Bytes: 16897 States: 2 ]
[ Inserted: uid 0 pid 1394 ]
pass out quick on net0 proto tcp from any to any port > 1024 flags S/SA keep state
[ Evaluations: 6 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 1394 ]
pass in quick on net0 proto tcp from any port = ftp-data to any port > 1024 flags S/SA keep state
[ Evaluations: 6 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 1394 ]
pass in quick on net0 proto tcp from any to any port > 1024 flags S/SA keep state
[ Evaluations: 0 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 1394 ]
pass in quick on net0 proto tcp all flags S/SA keep state
[ Evaluations: 0 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 1394 ]
block drop log all
[ Evaluations: 6 Packets: 6 Bytes: 949 States: 0 ]
[ Inserted: uid 0 pid 1394 ]
root@freebsd84_100:/etc #
root@freebsd84_100:/etc # pfctl -a "active_ftp" -sr -v
No ALTQ support in kernel
ALTQ related functions disabled
pass in quick on net0 proto tcp from any port = ftp-data to any port > 1024 flags S/SA keep state
[ Evaluations: 10 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 1394 ]
pass in quick on net0 proto tcp from any to any port > 1024 flags S/SA keep state
[ Evaluations: 0 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 1394 ]
pass out quick on net0 proto tcp from any to any port = ftp flags S/SA keep state
[ Evaluations: 4 Packets: 63 Bytes: 4999 States: 1 ]
[ Inserted: uid 0 pid 1394 ]
pass out quick on net0 proto tcp from any to any port > 1024 flags S/SA keep state
[ Evaluations: 3 Packets: 37 Bytes: 16897 States: 2 ]
[ Inserted: uid 0 pid 1394 ]
root@freebsd84_100:/etc #правила в якоре у которых отличается направления от фильтра не срабатывают.
поэтому вопрос ниже не корректен.
> Беспокоит другое.
> Может кто-либо посторонний проникнуть на хост во время сеанса ftp если порт
> источника: 20?
> что-то вы не допаказываете, вот счетчики после короткого сеанса по ftpСпрашивайте, допакажу.
>[оверквотинг удален]
> all tcp 10.10.0.49:23822 -> 10.10.0.254:35126 FIN_WAIT_2:FIN_WAIT_2
> [2018321773 + 5792] wscale 3 [2408701215 + 66144]
> wscale 5
> age 00:00:56, expires in 00:00:34, 4:4 pkts, 216:1589 bytes,
> anchor 3, rule 3
> all tcp 10.10.0.49:63133 -> 10.10.0.254:46086 FIN_WAIT_2:FIN_WAIT_2
> [4144546923 + 5792] wscale 3 [2394323450 + 66144]
> wscale 5
> age 00:00:11, expires in 00:01:19, 9:12 pkts, 476:13933 bytes,
> anchor 3, rule 3Очень похоже что у Вас пассивное соединение
> ...
> правила в якоре у которых отличается направления от фильтра не срабатывают.
> поэтому вопрос ниже не корректен.Почему?
Ведь ftp работал, а без якоря - нет.
Можно подробнее.
Я совсем запутался...>> Беспокоит другое.
>> Может кто-либо посторонний проникнуть на хост во время сеанса ftp если порт
>> источника: 20?С PF только начинаю ознакамливаться.
>[оверквотинг удален]
>> [2018321773 + 5792] wscale 3 [2408701215 + 66144]
>> wscale 5
>> age 00:00:56, expires in 00:00:34, 4:4 pkts, 216:1589 bytes,
>> anchor 3, rule 3
>> all tcp 10.10.0.49:63133 -> 10.10.0.254:46086 FIN_WAIT_2:FIN_WAIT_2
>> [4144546923 + 5792] wscale 3 [2394323450 + 66144]
>> wscale 5
>> age 00:00:11, expires in 00:01:19, 9:12 pkts, 476:13933 bytes,
>> anchor 3, rule 3
> Очень похоже что у Вас пассивное соединениеда, но помоему pf не просматривает пакеты как iptables, поэтому это не особо важно, но есть keep state, что может внести не ясность как прошло соединение
>> ...
>> правила в якоре у которых отличается направления от фильтра не срабатывают.
>> поэтому вопрос ниже не корректен.
> Почему?
> Ведь ftp работал, а без якоря - нет.
> Можно подробнее.
> Я совсем запутался...если действительно хотите понять , то перед ftp сессией pfctl -f /etc/pf.conf , это сбросит счетчики ( правда по все еще активному соединению счетчики могут и не реагировать ), а после сессии смотрите счетчики на правилах pfctl -sr -v , pfctl -a "active_ftp" -sr -v , во время сессии и после смотрите pfctl -ss -v
>>> Беспокоит другое.
>>> Может кто-либо посторонний проникнуть на хост во время сеанса ftp если порт
>>> источника: 20?
> С PF только начинаю ознакамливаться.
>[оверквотинг удален]
>>> anchor 3, rule 3
>>> all tcp 10.10.0.49:63133 -> 10.10.0.254:46086 FIN_WAIT_2:FIN_WAIT_2
>>> [4144546923 + 5792] wscale 3 [2394323450 + 66144]
>>> wscale 5
>>> age 00:00:11, expires in 00:01:19, 9:12 pkts, 476:13933 bytes,
>>> anchor 3, rule 3
>> Очень похоже что у Вас пассивное соединение
> да, но помоему pf не просматривает пакеты как iptables, поэтому это не
> особо важно, но есть keep state, что может внести не ясность
> как прошло соединениеНе совсем понятно :(
>[оверквотинг удален]
>>> поэтому вопрос ниже не корректен.
>> Почему?
>> Ведь ftp работал, а без якоря - нет.
>> Можно подробнее.
>> Я совсем запутался...
> если действительно хотите понять , то перед ftp сессией pfctl -f /etc/pf.conf
> , это сбросит счетчики ( правда по все еще активному соединению
> счетчики могут и не реагировать ), а после сессии смотрите счетчики
> на правилах pfctl -sr -v , pfctl -a "active_ftp" -sr
> -v , во время сессии и после смотрите pfctl -ss -vВот логи (перед ftp сессией pfctl -f /etc/pf.conf):
~# pfctl -vsr
scrub in all fragment reassemble
[ Evaluations: 57935 Packets: 29022 Bytes: 9584460 States: 0 ]
[ Inserted: uid 0 pid 22120 State Creations: 0 ]
block return all
[ Evaluations: 788 Packets: 64 Bytes: 21428 States: 0 ]
[ Inserted: uid 0 pid 22120 State Creations: 0 ]
pass out all flags S/SA keep state
[ Evaluations: 788 Packets: 11157 Bytes: 7928657 States: 166 ]
[ Inserted: uid 0 pid 22120 State Creations: 355 ]
pass on re0 all flags S/SA keep state
[ Evaluations: 788 Packets: 11058 Bytes: 7913019 States: 157 ]
[ Inserted: uid 0 pid 22120 State Creations: 342 ]
pass in quick on rl0 inet from <good_hosts> to any flags S/SA keep state
[ Evaluations: 788 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 22120 State Creations: 0 ]
block return in quick on rl0 inet from <bad_hosts> to any
[ Evaluations: 91 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 22120 State Creations: 0 ]
pass in on rl0 inet proto icmp all icmp-type echoreq keep state
[ Evaluations: 91 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 22120 State Creations: 0 ]
pass in on rl0 inet proto icmp all icmp-type unreach keep state
[ Evaluations: 0 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 22120 State Creations: 0 ]
pass in on rl0 proto tcp from any to any port = smtp flags S/SA keep state (source-track rule, max-src-conn-rate 2/3, overload <bad_hosts> flush, src.track 3)
[ Evaluations: 91 Packets: 44 Bytes: 1976 States: 2 ]
[ Inserted: uid 0 pid 22120 State Creations: 22 ]
pass in on rl0 proto tcp from any to any port = http flags S/SA keep state (source-track rule, max-src-conn-rate 2/3, overload <bad_hosts> flush, src.track 3)
[ Evaluations: 27 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 22120 State Creations: 0 ]
anchor "active_ftp" out on rl0 proto tcp from any to any port = ftp
[ Evaluations: 382 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 22120 State Creations: 0 ]
anchor "active_ftp" all
[ Evaluations: 788 Packets: 108 Bytes: 61758 States: 5 ]
[ Inserted: uid 0 pid 22120 State Creations: 5 ]
~# pfctl -a active_ftp -vsr
pass in on rl0 proto tcp from any port = ftp-data to any port > 1024 flags S/SA keep state
[ Evaluations: 832 Packets: 108 Bytes: 61758 States: 5 ]
[ Inserted: uid 0 pid 22120 State Creations: 5 ]
~# pfctl -vss
all tcp XXX.XXX.XXX.XXX:24349 -> 193.162.146.4:21 ESTABLISHED:ESTABLISHED
[607427003 + 66560] wscale 6 [3834345963 + 66560] wscale 6
age 00:00:07, expires in 23:59:58, 29:29 pkts, 1874:2540 bytes, rule 1
all tcp XXX.XXX.XXX.XXX:39761 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
[3678589424 + 66560] wscale 6 [1016305140 + 66560] wscale 6
age 00:00:06, expires in 00:01:24, 5:3 pkts, 2292:164 bytes, anchor 10, rule 0
all tcp XXX.XXX.XXX.XXX:17229 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
[1643637105 + 66560] wscale 6 [2057588700 + 66560] wscale 6
age 00:00:06, expires in 00:01:24, 5:3 pkts, 2076:164 bytes, anchor 10, rule 0
all tcp XXX.XXX.XXX.XXX:29822 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
[2520433775 + 66560] wscale 6 [4002562068 + 66560] wscale 6
age 00:00:06, expires in 00:01:24, 4:3 pkts, 470:164 bytes, anchor 10, rule 0
all tcp XXX.XXX.XXX.XXX:48445 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
[1197791854 + 66560] wscale 6 [3552489798 + 65472] wscale 6
age 00:00:03, expires in 00:01:28, 37:24 pkts, 50851:1256 bytes, anchor 10, rule 0
all tcp XXX.XXX.XXX.XXX:44650 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
[2344339440 + 66560] wscale 6 [779037930 + 66560] wscale 6
age 00:00:02, expires in 00:01:28, 5:3 pkts, 2292:164 bytes, anchor 10, rule 0
all tcp XXX.XXX.XXX.XXX:26710 <- 193.162.146.4:20 FIN_WAIT_2:FIN_WAIT_2
[3325706474 + 66560] wscale 6 [1793406437 + 66560] wscale 6
age 00:00:02, expires in 00:01:28, 5:3 pkts, 2076:164 bytes, anchor 10, rule 0
через этот якорь ничего не прошло
anchor "active_ftp" out on rl0 proto tcp from any to any port = ftp
[ Evaluations: 382 Packets: 0 Bytes: 0 States: 0 ]
[ Inserted: uid 0 pid 22120 State Creations: 0 ]
XXX.XXX.XXX.XXX:* <- 193.162.146.4:20 пошли через этот якорь
anchor "active_ftp" all
[ Evaluations: 788 Packets: 108 Bytes: 61758 States: 5 ]
[ Inserted: uid 0 pid 22120 State Creations: 5 ]
> ~# pfctl -vss
> all tcp XXX.XXX.XXX.XXX:24349 -> 193.162.146.4:21 ESTABLISHED:ESTABLISHED
> [607427003 + 66560] wscale 6 [3834345963 + 66560]
> wscale 6
> age 00:00:07, expires in 23:59:58, 29:29 pkts, 1874:2540 bytes,
> rule 1при соединении с 21 портом использовалось rule 1 ваших правил
>[оверквотинг удален]
> States: 5 ]
> [ Inserted: uid 0 pid 22120 State Creations: 5
> ]
>> ~# pfctl -vss
>> all tcp XXX.XXX.XXX.XXX:24349 -> 193.162.146.4:21 ESTABLISHED:ESTABLISHED
>> [607427003 + 66560] wscale 6 [3834345963 + 66560]
>> wscale 6
>> age 00:00:07, expires in 23:59:58, 29:29 pkts, 1874:2540 bytes,
>> rule 1
> при соединении с 21 портом использовалось rule 1 ваших правилчто за rule 1?
почему тогда без якоря ftp не работает а с якорем работает?
>[оверквотинг удален]
>> [ Inserted: uid 0 pid 22120 State Creations: 5
>> ]
>>> ~# pfctl -vss
>>> all tcp XXX.XXX.XXX.XXX:24349 -> 193.162.146.4:21 ESTABLISHED:ESTABLISHED
>>> [607427003 + 66560] wscale 6 [3834345963 + 66560]
>>> wscale 6
>>> age 00:00:07, expires in 23:59:58, 29:29 pkts, 1874:2540 bytes,
>>> rule 1
>> при соединении с 21 портом использовалось rule 1 ваших правил
> что за rule 1?номер вашего правила в pfctl -vsr
pass out all flags S/SA keep state> почему тогда без якоря ftp не работает а с якорем работает?
без какого? первый не срабатывает и так , а срабатывает только на втором , если оба не грузите то с 20 порта пакеты и не будут пропущены
>[оверквотинг удален]
>>>> ~# pfctl -vss
>>>> all tcp XXX.XXX.XXX.XXX:24349 -> 193.162.146.4:21 ESTABLISHED:ESTABLISHED
>>>> [607427003 + 66560] wscale 6 [3834345963 + 66560]
>>>> wscale 6
>>>> age 00:00:07, expires in 23:59:58, 29:29 pkts, 1874:2540 bytes,
>>>> rule 1
>>> при соединении с 21 портом использовалось rule 1 ваших правил
>> что за rule 1?
> номер вашего правила в pfctl -vsr
> pass out all flags S/SA keep stateКак Вы определили правило, ведь выводе pfctl -vsr нет никакого упоминания о rule 1?
>> почему тогда без якоря ftp не работает а с якорем работает?
> без какого? первый не срабатывает и так , а срабатывает только на
> втором , если оба не грузите то с 20 порта пакеты
> и не будут пропущеныСкажу как я понял якоря (вот дока http://www.g0l.ru/blog/htmls/BSDA-course/apcs02.html)
# эта строка должна выступать как шаблон
anchor active_ftp out on $ext_if proto tcp to port ftp
# если есть совпадение, тогда добавляется следующее правило в pf
anchor "active_ftp" {
pass in on $ext_if proto tcp from any port ftp-data to any port > 1024
}Похоже я так и не разобрался с якорями.
Помогите понять их, плиз.
>[оверквотинг удален]
>>>>> [607427003 + 66560] wscale 6 [3834345963 + 66560]
>>>>> wscale 6
>>>>> age 00:00:07, expires in 23:59:58, 29:29 pkts, 1874:2540 bytes,
>>>>> rule 1
>>>> при соединении с 21 портом использовалось rule 1 ваших правил
>>> что за rule 1?
>> номер вашего правила в pfctl -vsr
>> pass out all flags S/SA keep state
> Как Вы определили правило, ведь выводе pfctl -vsr нет никакого упоминания о
> rule 1?а посчитать начиная с 0, так же смотрите pftop
>[оверквотинг удален]
> Скажу как я понял якоря (вот дока http://www.g0l.ru/blog/htmls/BSDA-course/apcs02.html)
> # эта строка должна выступать как шаблон
> anchor active_ftp out on $ext_if proto tcp to port ftp
> # если есть совпадение, тогда добавляется следующее правило в pf
> anchor "active_ftp" {
> pass in on $ext_if proto tcp from any
> port ftp-data to any port > 1024
> }
> Похоже я так и не разобрался с якорями.
> Помогите понять их, плиз.у вас один набор правил active_ftp вызывается из двух мест
anchor active_ftp out on $ext_if proto tcp to port ftp
если пакет добрался до этой строки и подпадает под фильтр (out on $ext_if proto tcp to port ftp), то этот пакет пропустить по правилам в active_ftpanchor "active_ftp"
если пакет добрался до этой строки и подпадает под фильтр ( нет фильтра значит all - то есть все )то этот пакет пропустить по правилам в active_ftp.отдельно и не зависимо от фильтра загружаем правила для active_ftp
{
pass in on $ext_if proto tcp from any
port ftp-data to any port > 1024
}то есть все что идет с 20 порта на > 1024 будет разрешено и не важно есть у вас соединение по ftp или нет