### state tracking rules
$IPT -A INPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
$IPT -A INPUT -m conntrack --ctstate INVALID -j DROP
$IPT -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
### anti-spoofing rules
$IPT -A INPUT -i $INT_IF ! -s $NET_LAN -j LOG --log-prefix "SPOOFED PKT "
$IPT -A INPUT -i $INT_IF ! -s $NET_LAN -j DROP
### ACCEPT rules [ssh,rdp,escom,ping ..]
$IPT -A INPUT -i $EXT_IF -p tcp -s $TH --dport $HTTP -m conntrack --ctstate NEW -j ACCEPT # WAN >> APACHE
#
$IPT -A INPUT -i $INT_IF -p tcp --dport $SQUID -m conntrack --ctstate NEW -j ACCEPT # CLIENTS >> SQUID3
$IPT -A INPUT -i $EXT_IF -p tcp -s $TH --dport $SSH -m conntrack --ctstate NEW -j ACCEPT # ssh
$IPT -A INPUT -i $EXT_IF -p tcp -m multiport -s $TH --dport $EXT_RDP -m conntrack --ctstate NEW -j ACCEPT # rdp ports list
$IPT -A INPUT -i $EXT_IF -p tcp -s $TH --dport $ESCOM -m conntrack --ctstate NEW -j ACCEPT # ESCOM
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # ping
### default INPUT LOG rule
$IPT -A INPUT ! -i lo -j LOG --log-prefix "DROP " --log-ip-options --log-tcp-options
### make sure that loopback traffic is accepted
$IPT -A INPUT -i lo -j ACCEPT
# -----------------------------------------------------------------------------
### state tracking rules
$IPT -A OUTPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
$IPT -A OUTPUT -m conntrack --ctstate INVALID -j DROP
$IPT -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
### ACCEPT rules for allowing connections out
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport $HTTP -m conntrack --ctstate NEW -j ACCEPT # >> 80
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport $FTP -m conntrack --ctstate NEW -j ACCEPT # >> 21
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport $SSH -m conntrack --ctstate NEW -j ACCEPT # >> 22
$IPT -A OUTPUT -o $EXT_IF -p tcp -m multiport --dport $MAIL -m conntrack --ctstate NEW -j ACCEPT # >> 25,110
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport $HTTPS -m conntrack --ctstate NEW -j ACCEPT # >> 443
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport $INT_RDP -m conntrack --ctstate NEW -j ACCEPT # >> 3389
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport $ESCOM -m conntrack --ctstate NEW -j ACCEPT # >> 8080
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport $DNS -m conntrack --ctstate NEW -j ACCEPT # >> 53 tcp
$IPT -A OUTPUT -o $EXT_IF -p udp --dport $DNS -m conntrack --ctstate NEW -j ACCEPT # >> 53 udp
$IPT -A OUTPUT -o $EXT_IF -p icmp --icmp-type echo-request -j ACCEPT # >> icmp
### default OUTPUT LOG rule
$IPT -A OUTPUT ! -o lo -j LOG --log-prefix "DROP " --log-ip-options --log-tcp-options
### make sure that loopback traffic is accepted
$IPT -A OUTPUT -o lo -j ACCEPT
# -----------------------------------------------------------------------------
### state tracking rules
$IPT -A INPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
$IPT -A INPUT -m conntrack --ctstate INVALID -j DROP
$IPT -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
### anti-spoofing rules
$IPT -A INPUT -i $INT_IF ! -s $NET_LAN -j LOG --log-prefix "SPOOFED PKT "
$IPT -A INPUT -i $INT_IF ! -s $NET_LAN -j DROP
### ACCEPT rules [ssh,rdp,escom,ping ..]
$IPT -A INPUT -i $EXT_IF -p tcp -s $TH --dport $HTTP -m conntrack --ctstate NEW -j ACCEPT # WAN >> APACHE
#
$IPT -A INPUT -i $INT_IF -p tcp --dport $SQUID -m conntrack --ctstate NEW -j ACCEPT # CLIENTS >> SQUID3
$IPT -A INPUT -i $EXT_IF -p tcp -s $TH --dport $SSH -m conntrack --ctstate NEW -j ACCEPT # ssh
$IPT -A INPUT -i $EXT_IF -p tcp -m multiport -s $TH --dport $EXT_RDP -m conntrack --ctstate NEW -j ACCEPT # rdp ports list
$IPT -A INPUT -i $EXT_IF -p tcp -s $TH --dport $ESCOM -m conntrack --ctstate NEW -j ACCEPT # ESCOM
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # ping
### default INPUT LOG rule
$IPT -A INPUT ! -i lo -j LOG --log-prefix "DROP " --log-ip-options --log-tcp-options
### make sure that loopback traffic is accepted
$IPT -A INPUT -i lo -j ACCEPT
# -----------------------------------------------------------------------------
### state tracking rules
$IPT -A OUTPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
$IPT -A OUTPUT -m conntrack --ctstate INVALID -j DROP
$IPT -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
### ACCEPT rules for allowing connections out
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport $HTTP -m conntrack --ctstate NEW -j ACCEPT # >> 80
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport $FTP -m conntrack --ctstate NEW -j ACCEPT # >> 21
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport $SSH -m conntrack --ctstate NEW -j ACCEPT # >> 22
$IPT -A OUTPUT -o $EXT_IF -p tcp -m multiport --dport $MAIL -m conntrack --ctstate NEW -j ACCEPT # >> 25,110
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport $HTTPS -m conntrack --ctstate NEW -j ACCEPT # >> 443
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport $INT_RDP -m conntrack --ctstate NEW -j ACCEPT # >> 3389
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport $ESCOM -m conntrack --ctstate NEW -j ACCEPT # >> 8080
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport $DNS -m conntrack --ctstate NEW -j ACCEPT # >> 53 tcp
$IPT -A OUTPUT -o $EXT_IF -p udp --dport $DNS -m conntrack --ctstate NEW -j ACCEPT # >> 53 udp
$IPT -A OUTPUT -o $EXT_IF -p icmp --icmp-type echo-request -j ACCEPT # >> icmp
### default OUTPUT LOG rule
$IPT -A OUTPUT ! -o lo -j LOG --log-prefix "DROP " --log-ip-options --log-tcp-options
### make sure that loopback traffic is accepted
$IPT -A OUTPUT -o lo -j ACCEPT
# -----------------------------------------------------------------------------
Вы имеете в виду наименование портов по списку соответствия? :)
Так точно. Немного смысла в описывали стандартных портов через переменные, когда можно с тем же успехом пользоваться их именами из /etc/services:
вместо
text
$HTTP=80
$IPT -A INPUT -p tcp --dport $HTTP ...
почему бы не писать просто
text
$IPT -A INPUT -p tcp --dport http ...
?
В конце концов, вы же не пишете вместо "-p tcp", где вместо tcp берется номер протокола из /etc/protocols, подобного
[quote=urfin]Вы имеете в виду наименование портов по списку соответствия? :)
Так точно. Немного смысла в описывали стандартных портов через переменные, когда можно с тем же успехом пользоваться их именами из /etc/services:
вместо
text
$HTTP=80
$IPT -A INPUT -p tcp --dport $HTTP ...
почему бы не писать просто
text
$IPT -A INPUT -p tcp --dport http ...
?[/quote]Ну, да, так оно, конечно, идеологически верней будет:). Но я сначала создаю скрипт( или набор правил), проверяю, а уж потом идеологически причесываю :) ТС решил пойти своим путем, через переменные, так ему показалось проще, чем сверять каждый порт со списком services :)
ТС решил пойти своим путем, через переменные, так ему показалось проще, чем сверять каждый порт со списком services
Угу, можно многое упростить (жаль не в пользу понятности) в т.ч. пользовать --multiport и циклы в кот. менять цепочки, чтобы не разводить мильён писанины. Просто в определенный момент осознал что не все влазиет в голову, поэтому на дебаге пока так. СПС за "SYN", покане осознал, но пойму.)
Немного подредактировал INPUT
+ секция INPUT
и добавил проверку на наличие флага SYN при состоянии NEW (запрос на установление соединения).
"SYN-SENT Клиент отправил запрос серверу на установление соединения и ожидает ответа
SYN-RECEIVED Сервер получил запрос на соединение, отправил ответный запрос и ожидает подтверждения"
Интересно.. Это полезно для высоко нагруженных соединений, или для всех. Было бы любопытно понять как (по-идее) должна изменится скорость обработки запросов от клиентов, как-то приходит человеко-понятная аналогия типо проскси станет более лоялен с клиентами.. правильно ли до меня дошла суть использования флага SYN?
Интересно.. Это полезно для высоко нагруженных соединений, или для всех
Для всех, но в плане защищенности от спуфинг-атак, типа "предсказание номера tcp-последовательности". Однако, могут возникнуть проблемы с виндовс-клиентами, не знаю, как сейчас, но раньше микрософтовская реализация tcp-протокола, была несколько кривовата, и при некоторых условиях, пакеты, сгенерированные программами от Микрософт маркировались как NEW, но со сброшенным флагом SYN.
echo "[+] Seting global policy to DROP ALL..."
$IPT -P INPUT DROP && $IPT -P OUTPUT DROP && $IPT -P FORWARD DROP
# -----------------------------------------------------------------------------
###### INPUT chain ######
echo "[+] Setting up INPUT chain..."
### state tracking rules
$IPT -A INPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "DROP INVALID INPUT PKT " --log-ip-options --log-tcp-options
$IPT -A INPUT -m conntrack --ctstate INVALID -j DROP
$IPT -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
### anti-spoofing rules
$IPT -A INPUT -i $INT_IF1 ! -s $NET_LAN1 -j LOG --log-prefix "DROP SPOOFED INPUT[1] PKT " # FG company
$IPT -A INPUT -i $INT_IF1 ! -s $NET_LAN1 -j DROP
$IPT -A INPUT -i $INT_IF2 ! -s $NET_LAN2 -j LOG --log-prefix "DROP SPOOFED INPUT[2] PKT " # AF company
$IPT -A INPUT -i $INT_IF2 ! -s $NET_LAN2 -j DROP
$IPT -A INPUT -i $INT_IF3 ! -s $NET_LAN3 -j LOG --log-prefix "DROP SPOOFED INPUT[3] PKT " # free company
$IPT -A INPUT -i $INT_IF3 ! -s $NET_LAN3 -j DROP
### ACCEPT rules [ssh,www,erdp,escom,ping]
$IPT -A INPUT -i $INT_IF1 -p tcp --dport $squid3 -m conntrack --ctstate NEW -j ACCEPT # allow to connetc to proxy from LAN1
$IPT -A INPUT -i $INT_IF2 -p tcp --dport $squid3 -m conntrack --ctstate NEW -j ACCEPT # allow to connetc to proxy from LAN2
$IPT -A INPUT -i $INT_IF3 -p tcp --dport $squid3 -m conntrack --ctstate NEW -j ACCEPT # allow to connetc to proxy from LAN3
#
$IPT -A INPUT -i $EXT_IF -s $TH -p tcp -m multiport --dport ssh,www,$EXT_RDP,$escom -m tcp --syn -m conntrack --ctstate NEW -j ACCEPT # allow tr-ed in-g.
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
### make sure that loopback traffic is accepted
$IPT -A INPUT -i lo -j ACCEPT
# -----------------------------------------------------------------------------
###### OUTPUT chain ######
echo "[+] Setting up OUTPUT chain..."
### state tracking rules
$IPT -A OUTPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "DROP INVALID OUTPUT PKT " --log-ip-options --log-tcp-options
$IPT -A OUTPUT -m conntrack --ctstate INVALID -j DROP
$IPT -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
### ACCEPT rules for allowing connections out [ftp,ssh,smtp,www,ntp,pop3,https,rdp,icq,escom]
$IPT -A OUTPUT -o $EXT_IF -p tcp -m multiport --dport ftp,ssh,smtp,www,ntp,pop3,https,$INT_RDP,aol,$escom -m conntrack --ctstate NEW -j ACCEPT
$IPT -A OUTPUT -o $EXT_IF -p udp -m multiport --dport ssh,www,ntp,pop3,https,$INT_RDP,aol,$escom -m conntrack --ctstate NEW -j ACCEPT
#
$IPT -A OUTPUT -o $EXT_IF -p tcp --dport domain -m conntrack --ctstate NEW -j ACCEPT # DNS tcp/udp
$IPT -A OUTPUT -o $EXT_IF -p udp --dport domain -m conntrack --ctstate NEW -j ACCEPT
$IPT -A OUTPUT -o $EXT_IF -p icmp --icmp-type echo-request -j ACCEPT
### make sure that loopback traffic is accepted
$IPT -A OUTPUT -o lo -j ACCEPT
# -----------------------------------------------------------------------------
Все работает? Тогда очень подробненько задокументируйте все это где-нибудь у себя, иначе, через полгода или позже, начнете ломать себе голову: "а что это я за хрень нагородил?" :)
Тогда очень подробненько задокументируйте все это где-нибудь у себя, иначе, через полгода или позже, начнете ломать себе голову: "а что это я за хрень нагородил?"
гугл докс уже ни раз спасал мир от гибели! немного офтоп: сделал сквида прозрачным (intercept) и добавил прероутингом редирект 80-го на 3128. В итоге имеем: все шляпные web-установщики на клиенте отрабатывают без проблем свои загрузки, фурычет и не настроенный на прокси браузер, который не поймет 443 https:// ну да и норм, клиент позвонит, ТП - настроит на исп. прокси. Насчет ssl-bump - боюсь пока лезть.. а и в скрипте теперь 3 ЛС))
Чет не пойму как отклонить от кл. ЛС обращение http secure.. (Чтобы когда клиентский браузер не настроен на использование прокси сервера, сразу приходило "соединение было сброшено", а не отвал по таймауту, который долго ждать)
делал так, не помогло - все равно браузер долго тупит:
text
$IPT -A INPUT ! -i $EXT_IF -p tcp --dport https -m conntrack --ctstate NEW -j REJECT
может это по тому что icmp закрыто все кроме эхо? (насколько я понял любые перенаправления https не имеют смысла..)
Чет не пойму как отклонить от кл. ЛС обращение http secure.. (Чтобы когда клиентский браузер не настроен на использование прокси сервера, сразу приходило "соединение было сброшено", а не отвал по таймауту, который долго ждать)
делал так, не помогло - все равно браузер долго тупит:
text
$IPT -A INPUT ! -i $EXT_IF -p tcp --dport https -m conntrack --ctstate NEW -j REJECT
может это по тому что icmp закрыто все кроме эхо? (насколько я понял любые перенаправления https не имеют смысла..)
Попробуйте
text
$IPT -A INPUT ! -i $EXT_IF -p tcp --dport https -m conntrack --ctstate NEW -j REJECT --reject-with tcp-reset