Следующее является моими iptable правилами об облачном сервере человечности:
кошка/etc/iptables.rules:
*filter
:INPUT DROP [598:41912]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [456:35354]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state -i eth0 --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -s mycompany.dyndns.com -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s mycompany.dyndns.com -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s mycompany.dyndns.com -p tcp -m tcp --dport 10000 -j ACCEPT
-A INPUT -j DROP
COMMIT
Я не открыл порт ftp 21 в вышеупомянутых iptable правилах, но мне разрешают соединиться с сервером через ftp. Как?
IP сервера nmap
Not shown: 987 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
53/tcp open domain
80/tcp open http
111/tcp open rpcbind
135/tcp filtered msrpc
139/tcp filtered netbios-ssn
389/tcp open ldap
445/tcp filtered microsoft-ds
10000/tcp open java-or-OTGfileshare
2401/tcp open cvspserver
3306/tcp open mysql
Nmap done: 1 IP address (1 host up) scanned in 17.46 seconds
почему эти много портов показывают как открытые. Я ясен, что эти сервисы работают на сервере, но как он мог перечислить или соединить (ftp) эти порты, когда он не включен в iptable правила?.
нужна помощь...
The following script will be running at every 5 mins on cloud servers to update their iptables for the dyndns domain name:
#!/bin/bash
#
# A script to update iptable records for dynamic dns hosts.
# Written by: Dave Horner (http://dave.thehorners.com)
# Released into public domain.
#
# Run this script in your cron table to update ips.
#
# You might want to put all your dynamic hosts in a sep. chain.
# That way you can easily see what dynamic hosts are trusted.
#
# create the chain in iptables.
/sbin/iptables -N dynamichosts
# insert the chain into the input chain @ the head of the list.
/sbin/iptables -I INPUT 1 -j dynamichosts
# flush all the rules in the chain
/sbin/iptables -F dynamichosts
HOST=$1
HOSTFILE="/root/host-$HOST"
CHAIN="dynamichosts" # change this to whatever chain you want.
IPTABLES="/sbin/iptables"
# check to make sure we have enough args passed.
if [ "${#@}" -ne "1" ]; then
echo "$0 hostname"
echo "You must supply a hostname to update in iptables."
exit
fi
# lookup host name from dns tables
IP=`/usr/bin/dig +short $HOST | /usr/bin/tail -n 1`
if [ "${#IP}" = "0" ]; then
echo "Couldn't lookup hostname for $HOST, failed."
exit
fi
OLDIP=""
if [ -a $HOSTFILE ]; then
OLDIP=`cat $HOSTFILE`
# echo "CAT returned: $?"
fi
# save off new ip.
echo $IP>$HOSTFILE
echo "Updating $HOST in iptables."
if [ "${#OLDIP}" != "0" ]; then
echo "Removing old rule ($OLDIP)"
`$IPTABLES -D $CHAIN -s $OLDIP/32 -j ACCEPT`
fi
echo "Inserting new rule ($IP)"
`$IPTABLES -A $CHAIN -s $IP/32 -j ACCEPT`
Это - вывод "ipables-L" на облачном сервере.
dynamichosts all -- anywhere anywhere
dynamichosts all -- anywhere anywhere
dynamichosts all -- anywhere anywhere
dynamichosts all -- anywhere anywhere
dynamichosts all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:www
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- APKGS-AP-dynamic-145.136.165.59.airtelbroadband.in anywhere tcp dpt:ssh
ACCEPT tcp -- APKGS-AP-dynamic-145.136.165.59.airtelbroadband.in anywhere tcp dpt:10000
ACCEPT tcp -- APKGS-AP-dynamic-145.136.165.59.airtelbroadband.in anywhere tcp dpt:mysql
DROP all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain dynamichosts (937 references)
target prot opt source destination
ACCEPT all -- Telemedia-AP-dynamic-145.86.175.59.airtelbroadband.in anywhere
Здесь airtelbroadband является моим (dyndns доменное имя). Я думаю, что ранее отправленный сценарий создает новую цепочку, и от этого домена все позволяется - это так?. Могут быть разрешенные порты ssh, webmin, mysql, и www являются бесполезными записями. Но я хочу этот домен, должен быть позволен только этим портам, и у меня может быть список nmap только разрешенных портов на облачном сервере, когда я проверяю от своих dyndns доменных систем. Еще справка...?
Это - тот же вопрос как https://serverfault.com/questions/188550/iptables-nmap-on-ubuntu
Как люди там предполагают, Ваши правила брандмауэра имеют специальные исключения для самого облачного сервера (-A INPUT -i lo -j ACCEPT
) или Ваша "airtelbroadband" машина (скрипт, который Вы запускаете, позволяет весь трафик от выбранного dyndns IP).
Так, необходимо работать nmap
от другого IP-адреса (например, просто используйте другую машину в облаке),
Если Вы хотите ограничить доступ в своем хосте "airtelbroadband" (например, для тестирования), то можно заменить последнюю строку в сценарии со списком правил, которые Вы хотите применить. Например, следующие строки только позволят SSH, HTTP/HTTPS и Подключения mysql от Вашего домашнего хоста:
$IPTABLES -A $CHAIN -s $IP/32 -p tcp --dport 22 -j ACCEPT
$IPTABLES -A $CHAIN -s $IP/32 -p tcp --dport 80 -j ACCEPT
$IPTABLES -A $CHAIN -s $IP/32 -p tcp --dport 443 -j ACCEPT
$IPTABLES -A $CHAIN -s $IP/32 -p tcp --dport 3306 -j ACCEPT
Предупреждение: очень, очень, очень легко заблокировать себя из рабочего хоста путем питания с правилами брандмауэра, особенно с автоматизированными сценариями. Рассмотрите тестирование от 3-го хоста вместо этого.
Судя по выводу вашего iptables -L
, кажется, что ваш файл /etc/iptables.rules
ничего не читает. Обратите внимание, что совпадение ACCEPT all -- anywhere anywhere
позволит что-нибудь войти.
Возможно, вы захотите добавить что-нибудь в /etc/rc.local
для вызова iptables-restore < /etc/iptables.rules
. Будьте осторожны, вы не заблокируете себя из своей системы, хотя. :)