Как оставить через nat только один icmp, чтобы пинги ходили, а все остальное запретить?Вопросы, замечания, комментарии?
прошу помощи со скриптом iptables для шлюза
В моём примере выше:Как оставить через nat только один icmp, чтобы пинги ходили, а все остальное запретить?
на gw
# iptables -P FORWARD DROP
# iptables -A FORWARD -p icmp -j ACCEPT
SNAT/MASQUERADE остаётся на месте.
ps. На самом деле то был весь icmp, а пинги -- это только echo-request/echo-reply. Можно оставить только их (--icmp-type 0 и 8 ), плюс другое необходимое для управления передачей (ICMP -- Internet Control Message Protocol -- протокол межсетевых управляющих сообщений):
Inbound can't fragment, among other messages: icmp type 3
ttl exceeded: icmp type 11
general parameter problem: icmp type 12
Список типов можно получить по
# iptables -p icmp -h
ТС Возьмите трафик профильтруйте на шлюзе через tcpdump и увидите где затык.
bormant, то есть надо сделать FORWARD такого вида:
# iptables -A FORWARD -p icmp --icmp-type 0 -j ACCEPT
# iptables -A FORWARD -p icmp --icmp-type 3 -j ACCEPT
# iptables -A FORWARD -p icmp --icmp-type 8 -j ACCEPT
# iptables -A FORWARD -p icmp --icmp-type 11 -j ACCEPT
# iptables -A FORWARD -p icmp --icmp-type 12 -j ACCEPTили все это можно объединить в одну строку, типа
# iptables -A FORWARD -p icmp --icmp-type 0,3,8,11,12 -j ACCEPTurfin,
список документацией не предусмотрен и командой отвергается. Вообще говоря, видел запрет на ping с разрешением прочего icmp, но вот наоборот не приходилось. Поэтому или весь icmp оставить, или запретить только ping:
# iptables -A FORWARD -p icmp ! --icmp-type echo-request -j ACCEPT
при политике FORWARD DROP, или сначала вдумчиво прочитать документацию по icmp (RFC 792, 950, 4884, 6633), а потом уже решать про нужность/ненужность остального.
Примерные причины, по которым хотелось бы запрещать icmp: http://www.sans.org/security-resources/idfaq/icmp_misuse.php
bormant, Спасибо! Надеюсь, что ТС прочитает нашу переписку (и доки), и уже сам решит, что ему нужно разрешить, а что запретить из icmp. Ну, а я у себя попробую еще раз сделать по теории, может на этот раз она у меня не разойдется с практикой :)
и решит что его вряд-ли за ДДоСят и ему можно не указывать кучу типов а просто -p icmp --icmp-type any чем он всем не угодил, пусть будет весь для невебсервера такое не критично, если особенно учесть что доступ снаружи будет только у 2х белых ip. до чтения RFC не дорос я еще.. Спасибо всем за детальные пояснения, коменты и примеры. Надеюсь в скором все это разляжется по полочкам мога, сформировав 1 целостную картину управления этой воистину гибкой системы iptables :) *THUMBSUP*ТС прочитает нашу переписку
и решит что его вряд-ли за ДДоСят и ему можно не указывать кучу типов а просто -p icmp --icmp-type any чем он всем не угодил, пусть будет весь для невебсервера такое не критично, если особенно учесть что доступ снаружи будет только у 2х белых ip. до чтения RFC не дорос я еще.. Спасибо всем за детальные пояснения, коменты и примеры. Надеюсь в скором все это разляжется по полочкам мога, сформировав 1 целостную картину управления этой воистину гибкой системы iptables :) *THUMBSUP*[/quote]Ждем отчета :)[quote="urfin⇓"] ТС прочитает нашу переписку
urfin, остановился на ковырянии каждой подозрительной мелочи, в частности: в чем отличае
$IPT -A FORWARD -p icmp -j ACCEPT от $IPT -A FORWARD -p icmp --icmp-type any -j ACCEPT ?
Должно же быть логическое объяснение этому: # cat /root/gw5.fw
Показать
SRV_IP="192.168.0.254" # provider white IP (now gebug - ip is gray)
IPT="/sbin/iptables" # iptables path
EXT_IF="eth0" # WAN
INT_IF="eth1" # LAN
# 1. flash all user rules.
$IPT -t mangle -F && $IPT -t filter -F && $IPT -t nat -F && $IPT -F && $IPT -X
# 2. enable ipv4 routing.
echo 1 > /proc/sys/net/ipv4/ip_forward
# 3. deny all.
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
# 4. allow loopback.
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# 5. allow ssh.
$IPT -A INPUT -p tcp --dport 22 -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 22 -j ACCEPT
# 6. allow any icmp FWD.
# $IPT -A FORWARD -p icmp -j ACCEPT # doesn't work 1 ((
# $IPT -A FORWARD -p icmp --icmp-type any -j ACCEPT # doesn't work 2 ((
# $IPT -A FORWARD -p icmp --icmp-type 8 -j ACCEPT # doesn't work 3 ((
# $IPT -A FORWARD -p icmp --icmp-type 0 -j ACCEPT
# $IPT -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT # doesn't work 4 ((
# $IPT -A FORWARD -p icmp --icmp-type echo-reply -j ACCEPT
# $IPT -P FORWARD ACCEPT # doesn't work 5 ((
# $IPT -A FORWARD ! -p icmp -j DROP
$IPT -A FORWARD -j ACCEPT # work well ! ))
# 7. masquerade.
$IPT -t nat -A POSTROUTING -o $EXT_IF -j MASQUERADE
[/console]
Могут работать, а могут не работать. Смотря, как определять работоспособность.ну скажите мне что я кривой и все 5 способов не должны работать
Вам нужно разрешить только проход icmp при запрете прохода остальных протоколов, ведь так?
Правило
$IPT -A FORWARD -j ACCEPTразрешает проход всему транзитному потоку.
Правила
$IPT -P FORWARD ACCEPT
$IPT -A FORWARD ! -p icmp -j DROPхотя лучше это будет выглядеть так:
$IPT -P FORWARD DROP
$IPT -A FORWARD -p icmp -j ACCEPTразрешают проход только транзитному icmp. При этом правиле пинги должны ходить. Вы утверждаете, что это не работает. Как Вы проверяете работоспособность?
пока только его, позже еще будут обычные tcp и udp порты.Вам нужно разрешить только проход icmp при запрете прохода остальных протоколов, ведь так?
так я делал, есть в одной из закомментированных попыток 1..5хотя лучше это будет выглядеть так:
проверяю с windows-машины, зацепленной в сеть $INT_IF (eth1), делаю ping ya.ru - не уходит, убираю уточняющий параметр: -p icmp - пинги пошли, ставлю на место - все колом!разрешают проход только транзитному icmp. При этом правиле пинги должны ходить. Вы утверждаете, что это не работает. Как Вы проверяете работоспособность?
Вот здесь и Ваша ошибка при проверке. Проверяйтеделаю ping ya.ru
ping 77.88.21.3я эпический лесной Олень!!! *WALL* *ROFL*Вот здесь и Ваша ошибка при проверке. Проверяйте
ping 77.88.21.3
Спасибо огромное Вам))) вряд ли DNS запросы у меня пойдут когда-нибудь через icmp, грею тут зря людям голову!
возможно ли упростить правила разрешающие DNS? :
# 5. alow DNS.
$IPT -A INPUT -p udp -s 0/0 --sport 53 -d $SRV_IP --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p udp -s $SRV_IP --sport 53 -d 0/0 --dport 53 -m state --state ESTABLISHED -j ACCEPT
# 6. DNS FWD
$IPT -A FORWARD -p udp --sport 53 -j ACCEPT
$IPT -A FORWARD -p udp --dport 53 -j ACCEPT
А что такое SRV_IP? Адрес какого-то внешнего DNS-сервера?
нее, этого. SRV_IP="192.168.0.254" потом оно станет реальным белым, вобщем это ip адрес gw5 в сети WAN(eth0 192.168.1.0/24)А что такое SRV_IP? Адрес какого-то внешнего DNS-сервера?
УМВР, просто громоздко.)
Вот это
$IPT -A INPUT -p udp -s 0/0 --sport 53 -d $SRV_IP --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPTзамените на это
$IPT -A INPUT -p udp -s 0/0 --sport 53 -d $SRV_IP --dport 53 -m state --state ESTABLISHED,RELATED -j ACCEPTNEW здесь совершенно лишнее, для протокола udp ответы будут с состоянием ESTABLISHED
А лучше все же так
$IPT -A INPUT -p udp -s 0/0 --sport 53 -d $SRV_IP --dport 53 -j ACCEPT
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTЕсли будете в дальнейшем вставлять правила для других портов, то не нужно будет повторять в каждом правиле проверку состояния.
urfin, Спасибо)
зы: по готовности, скрипт будет выложен тут
Допил 50% готовности: gw5.fwПоказать
#!/bin/bash
# provider WAN interface
TH="192.168.0.65" # trusted hosts
# SRV_IP="79.122.XXX.XX" # white
SRV_IP="192.168.0.254"
IPT="/sbin/iptables"
EXT_IF="eth0"
INT_IF="eth1"
NET_WAN="192.168.0.0/24"
NET_LAN="192.168.1.0/24"
###### PORTS ######
FTP="21"
SSH="22"
DNS="53"
MAIL="25,110"
HTTP="80"
HTTPS="443"
SQUID="3128"
EXT_RDP="3333,3335,3336,3389,5555,6666" # *delete 3389
INT_RDP="3389"
ESCOM="8080"
echo "[+] Flashing all usr rules..."
# 1. flash all user rules.
$IPT -t mangle -F && $IPT -t filter -F && $IPT -t nat -F && $IPT -F && $IPT -X
echo "[+] Enabling ipv4 routing feauture..."
# 2. enable ipv4 routing.
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "[+] Seting global policy to DROP ALL..."
# 3. deny 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 " --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
# -----------------------------------------------------------------------------
###### OUTPUT chain ######
#
echo "[+] Setting up OUTPUT chain..."
### 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
# -----------------------------------------------------------------------------
###### FORWARD chain ######
#
echo "[+] Setting up FORWARD chain..."
### state tracking rules
$IPT -A FORWARD -m conntrack --ctstate INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options
$IPT -A FORWARD -m conntrack --ctstate INVALID -j DROP
$IPT -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
### anti-spoofing rules
$IPT -A FORWARD -i $INT_IF ! -s $NET_LAN -j LOG --log-prefix "SPOOFED PKT "
$IPT -A FORWARD -i $INT_IF ! -s $NET_LAN -j DROP
### ACCEPT rules
# $IPT -A FORWARD -p tcp -i $INT_IF -s $NET_LAN --dport $FTP -m conntrack --ctstate NEW -j ACCEPT
# $IPT -A FORWARD -p tcp -i $INT_IF -s $NET_LAN --dport $SSH -m conntrack --ctstate NEW -j ACCEPT # worked by squid3
# $IPT -A FORWARD -p tcp -i $INT_IF -s $NET_LAN --dports $MAIL -m conntrack --ctstate NEW -j ACCEPT
# $IPT -A FORWARD -p tcp --dport $HTTPS -m conntrack --ctstate NEW -j ACCEPT
$IPT -A FORWARD -p tcp --dport $DNS -m conntrack --ctstate NEW -j ACCEPT
$IPT -A FORWARD -p udp --dport $DNS -m conntrack --ctstate NEW -j ACCEPT
$IPT -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT
### default LOG rule
$IPT -A FORWARD ! -i lo -j LOG --log-prefix "DROP " --log-ip-options --log-tcp-options
# -----------------------------------------------------------------------------
###### NAT rules ######
#
echo "[+] Setting up NAT rules..."
$IPT -t nat -A PREROUTING -p tcp --dport 3333 -i $EXT_IF -j DNAT --to 192.168.1.250:$INT_RDP
$IPT -t nat -A PREROUTING -p tcp --dport 3335 -i $EXT_IF -j DNAT --to 192.168.1.4:$INT_RDP
$IPT -t nat -A PREROUTING -p tcp --dport 3336 -i $EXT_IF -j DNAT --to 192.168.1.2:$INT_RDP # ADDC RDC1
$IPT -t nat -A PREROUTING -p tcp --dport 5555 -i $EXT_IF -j DNAT --to 192.168.1.232:$INT_RDP
$IPT -t nat -A PREROUTING -p tcp --dport 6666 -i $EXT_IF -j DNAT --to 192.168.1.2:$ESCOM # ESCOM remote company1 -> comp.2
# -----------------------------------------------------------------------------
echo "[+] Mascarade require traffic..."
$IPT -t nat -A POSTROUTING -s $NET_LAN -o $EXT_IF -j MASQUERADE
#
[/console]