LINUX.ORG.RU

Необходима помощь по настройке iptables

 , ,


0

1

Добрый день знатокам! Настроил iptables, все работает, но хотелось бы услышать мнение специалистов в области безопасности. Имеется система Centos, на ней развернута телефония Asterisk. Хотел бы попросить проверить правила, и если есть замечания, поправить. Правила составлены: что не разрешено, запрещено:


#!/bin/bash
CMD=/sbin/iptables
LAN_IP=10.1.19.0/24
LAN_IF=eth0
WAN1_IP=***.***.***.***/32
VPN_IP=192.168.100.0/24
VPN_IF=tun0
BOGON=192.168.0.0/16,172.16.0.0/12,0.0.0.0/8,100.64.0.0/10,127.0.0.0/8,169.254.0.0/16,192.0.0.0/24,192.0.2.0/24,198.18.0.0/15,198.51.100.0/24,203.0.113.0/24,224.0.0.0/4,240.0.0.0/4,255.255.255.255
IP_ALLOWED=10.1.19.222/32
$CMD -t filter -P INPUT DROP
$CMD -t filter -P FORWARD DROP
$CMD -t filter -P OUTPUT ACCEPT
$CMD -t filter -F INPUT
$CMD -t filter -F FORWARD
$CMD -t filter -F OUTPUT
$CMD -t filter -F
$CMD -t filter -X
$CMD -t filter -A INPUT -m conntrack --ctstate INVALID -j DROP
$CMD -t filter -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$CMD -t filter -A INPUT -i lo -j ACCEPT
$CMD -t filter -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
$CMD -t filter -A INPUT -m psd -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc A1,A2,AD,AE,AF,AG,AI,AL,AM,AO -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc AP,AQ,AR,AS,AT,AU,AW,AX,AZ,BA -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc BB,BD,BE,BF,BG,BH,BI,BJ,BL,BM -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc BN,BO,BQ,BR,BS,BT,BW,BY,BZ,ZW -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc CA,CC,CD,CF,CG,CH,CI,CK,CL,CM -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc CN,CO,CR,CU,CV,CW,CX,CY,CZ,DE -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc DJ,DK,DM,DO,DZ,EC,EE,EG,EH,ER -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc ES,ET,EU,FI,FJ,FK,FM,FO,FR,GA -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc GB,GD,GE,GF,GG,GH,GI,GL,GM,GN -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc GP,GQ,GR,GS,GT,GU,GW,GY,HK,HM -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc HN,HR,HT,HU,ID,IE,IL,IM,IN,IO -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc IQ,IR,IS,IT,JE,JM,JO,JP,KE,KG -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc KH,KI,KM,KN,KP,KR,KW,KY,LA,LB -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc LC,LI,LK,LR,LS,LT,LU,LV,LY,MA -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc MC,MD,ME,MF,MG,MH,MK,ML,MM,MN -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc MO,MP,MQ,MR,MS,MT,MU,MV,MW,MX -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc MY,MZ,NA,NC,NE,NF,NG,NI,NL,NO -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc NP,NR,NU,NZ,OM,PA,PE,PF,PG,PH -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc PK,PL,PM,PN,PR,PS,PT,PW,PY,QA -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc RE,RO,RS,RU,RW,SA,SB,SC,SD,SE -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc SG,SH,SI,SJ,SK,SL,SM,SN,SO,SR -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc SS,ST,SV,SX,SY,SZ,TC,TD,TF,TG -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc TH,TJ,TK,TL,TM,TN,TO,TR,TT,TV -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc TW,TZ,UA,UG,UM,US,UY,UZ,VA,VC -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc VE,VG,VI,VN,VU,WF,WS,YE,YT,ZA -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc ZM -j DROP
for ip in $BOGON; do
$CMD -t filter -A INPUT -i $LAN_IF -s $ip -j DROP
done
$CMD -t filter -A INPUT -p tcp -m conntrack --ctstate NEW --tcp-flags ALL ALL -j DROP
$CMD -t filter -A INPUT -p tcp -m conntrack --ctstate NEW --tcp-flags ALL NONE -j DROP
$CMD -t filter -A INPUT -p tcp -m conntrack --ctstate NEW ! --syn -j DROP
$CMD -t filter -A INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset
$CMD -t filter -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$CMD -t filter -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$CMD -t filter -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$CMD -t filter -A INPUT -p udp -m string --string «sipcli» --algo bm --to 65535 -m recent --set --name scan-attack
$CMD -t filter -A INPUT -p udp -m string --string «sip-scan» --algo bm --to 65535 -m recent --set --name scan-attack
$CMD -t filter -A INPUT -p udp -m string --string «sundayddr» --algo bm --to 65535 -m recent --set --name scan-attack
$CMD -t filter -A INPUT -p udp -m string --string «iWar» --algo bm --to 65535 -m recent --set --name scan-attack
$CMD -t filter -A INPUT -p udp -m string --string «sipsak» --algo bm --to 65535 -m recent --set --name scan-attack
$CMD -t filter -A INPUT -p udp -m string --string «sipvicious» --algo bm --to 65535 -m recent --set --name scan-attack
$CMD -t filter -A INPUT -p udp -m string --string «VaxSIPUserAgent» --algo bm --to 65535 -m recent --set --name scan-attack
$CMD -t filter -A INPUT -p udp -m string --string «friendly-scanner» --algo bm --to 65535 -m recent --set --name scan-attack
$CMD -t filter -A INPUT -p udp -m string --string «eyeBeam» --algo bm --to 65535 -m recent --set --name scan-attack
$CMD -t filter -A INPUT -p udp -m recent --update --seconds 60 --hitcount 1 --name scan-attack -j LOG --log-level 4 --log-prefix «Scanner flood detected: »
$CMD -t filter -A INPUT -p tcp -m multiport --dports 21,22,80,137,138,139,443,445 -m conntrack --ctstate NEW -m recent --set
$CMD -t filter -A INPUT -p tcp -m multiport --dports 21,22,80,137,138,139,443,445 -m conntrack --ctstate NEW -m recent --update --seconds 2 --hitcount 20 -j DROP
$CMD -t filter -A INPUT -p udp -m multiport --dports 53,69 -m conntrack --ctstate NEW -m recent --set
$CMD -t filter -A INPUT -p udp -m multiport --dports 53,69 -m conntrack --ctstate NEW -m recent --update --seconds 2 --hitcount 20 -j DROP
$CMD -t filter -A INPUT -p udp --dport 5060 -m conntrack --ctstate NEW -m recent --set --name SIP
$CMD -t filter -A INPUT -p udp --dport 5060 -m conntrack --ctstate NEW -m recent --update --seconds 2 --hitcount 20 --name SIP -j LOG --log-level 4 --log-prefix «SIP flood detected: »
$CMD -t filter -A INPUT -s $LAN_IP -i $LAN_IF -p icmp -j ACCEPT
$CMD -t filter -A INPUT -s $LAN_IP -i $LAN_IF -p udp --dport 10000:20000 -j ACCEPT
$CMD -t filter -A INPUT -s $LAN_IP -i $LAN_IF -p udp --dport 5060 -j ACCEPT
$CMD -t filter -A INPUT -s $WAN1_IP -i $LAN_IF -p udp --dport 10000:20000 -j ACCEPT
$CMD -t filter -A INPUT -s $WAN1_IP -i $LAN_IF -p udp --dport 5060 -j ACCEPT
for ip in $IP_ALLOWED; do
$CMD -t filter -A INPUT -s $ip -i $LAN_IF -j ACCEPT
done
$CMD -t filter -A INPUT -s $VPN_IP -i $VPN_IF -j ACCEPT
$CMD -t filter -A INPUT -j REJECT --reject-with icmp-port-unreachable
$CMD -t filter -A FORWARD -j REJECT --reject-with icmp-port-unreachable

$CMD -t filter -A INPUT -p udp -m string --string «sipcli» --algo bm --to 65535 -m recent --set --name scan-attack
$CMD -t filter -A INPUT -p udp -m string --string «sip-scan» --algo bm --to 65535 -m recent --set --name scan-attack
$CMD -t filter -A INPUT -p udp -m string --string «sundayddr» --algo bm --to 65535 -m recent --set --name scan-attack
$CMD -t filter -A INPUT -p udp -m string --string «iWar» --algo bm --to 65535 -m recent --set --name scan-attack
$CMD -t filter -A INPUT -p udp -m string --string «sipsak» --algo bm --to 65535 -m recent --set --name scan-attack 

Вот этим говном должен заниматься сам астериск и fail2ban

anonymous ()
Ответ на: комментарий от AndreyDake

подумай к чему приведет, если приложение астериск будет самовольно делать вызовы, у тебя в цепочке OUTPUT политика разрешено. лучше либо политика запрешено, либо по uid отслеживать процесс и завернуть ее в отдельную цепочку.

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

Добавил правила по вашему совету.
$CMD -t filter -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$CMD -t filter -A OUTPUT -d $LAN_IP -o $LAN_IF -p icmp -j ACCEPT
$CMD -t filter -A OUTPUT -o lo -j ACCEPT
$CMD -t filter -A OUTPUT -d $LAN_IP -o $LAN_IF -p icmp -j ACCEPT
$CMD -t filter -A OUTPUT -d $LAN_IP -o $LAN_IF -p udp --dport 10000:20000 -j ACCEPT
$CMD -t filter -A OUTPUT -d $LAN_IP -o $LAN_IF -p udp --dport 69 -j ACCEPT
$CMD -t filter -A OUTPUT -d $LAN_IP -o $LAN_IF -p udp --dport 5060 -j ACCEPT
$CMD -t filter -A OUTPUT -d $WAN1_IP -o $LAN_IF -p udp --dport 10000:20000 -j ACCEPT
$CMD -t filter -A OUTPUT -d $WAN1_IP -o $LAN_IF -p udp --dport 5060 -j ACCEPT
$CMD -t filter -A OUTPUT -d $WAN2_IP -o $WAN2_IF -p udp --dport 10000:20000 -j ACCEPT
$CMD -t filter -A OUTPUT -d $WAN2_IP -o $WAN2_IF -p udp --dport 5060 -j ACCEPT
for ip in $IP_ALLOWED; do
$CMD -t filter -A OUTPUT -d $ip -o $LAN_IF -j ACCEPT
done
$CMD -t filter -A OUTPUT -d 192.168.0.1/32 -o $LAN_IF -p udp --dport 4595 -j ACCEPT
$CMD -t filter -A OUTPUT -d ***.***.***.***/32 -o eth1 -p udp --dport 22 -j ACCEPT
$CMD -t filter -A OUTPUT -j REJECT --reject-with icmp-port-unreachable

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

и все же нужно отслеживать соединения по процессам.

iptables -t mangle ${IPTABLES_ACTION} OUTPUT -m owner --uid-owner ${ASTERISKOWNER} -j MARK --set-mark ${MAILMARK}

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

зачем вам 10000 портов для rtp????

хватит не больше 100. ограничение в /etc/asterisk/rtp.conf. это обычно на 30 телефонов хватает.

Nurmukh ★★ ()
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc A1,A2,AD,AE,AF,AG,AI,AL,AM,AO -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc AP,AQ,AR,AS,AT,AU,AW,AX,AZ,BA -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc BB,BD,BE,BF,BG,BH,BI,BJ,BL,BM -j DROP
$CMD -t filter -A INPUT ! -i lo -m geoip --src-cc BN,BO,BQ,BR,BS,BT,BW,BY,BZ,ZW -j DROP 

Может сразу белый список AS?

for ip in $BOGON; do
$CMD -t filter -A INPUT -i $LAN_IF -s $ip -j DROP
done

man ipset

$CMD -t filter -A INPUT -s $VPN_IP -i $VPN_IF -j ACCEPT

VPN подразумевает какой-то специфичный тип трафика. Это или AH+ESP (ipsec), или GRE/IPIP/IPENCAP, или PPTP, или UDP/1701 (l2tp) или UDP/1194 (openvpn). Вот по этим признакам и надо его отличать.

И несколько замечаний общего характера.

-t filter каждый раз писать не надо, это и так дефолт. В глазах рябит.

# для внешнего трафика
$IPT -N INET
$IPT -A INET -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INET -p udp --dport 5060 -j ACCEPT
<...>
# вот это всё, что должно быть в INPUT :
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT -i $LAN_IF -j ACCEPT
$IPT -A INPUT -i $EXT_IF -g INET # переход в цепочку INET, без возврата
$IPT -A INPUT -j REJECT --reject-with icmp-port-unreachable
$IPT -P INPUT DROP

Такая «поинтерфейсная» организация правил позволяет уменьшить количество лапши. Если появляется ещё один «внешний» интерфейс - просто добавляется ещё одно правило в INPUT с переходом в нужную цепочку.

От локалки отгораживаться нет смысла, если там бардак, то фаервол на роутере тебе не поможет. Публичный вайфай или подобное проще выселить в отдельный vlan.

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

Я думал над тем, что необходимо перенести по своим цепочкам, но пока опыта маловато в этом. Буду очень признателен, если направите в нужное русло, советом как сделать или на ресурс емкий и понятный

AndreyDake ()
Ответ на: комментарий от anonymous

Может сразу белый список AS?

Не выходит сделать так, если я делаю исключения для своей страны, то пропадает локалка и не могу найти как добавить в исключение ее. Если у вас есть такой опыт, готов выслушать

AndreyDake ()