Я пытаюсь настроить свой сервер Ubuntu 14.04.2 LTS на надежный брандмауэр iptables. Сейчас я думаю, что это довольно хорошо, однако я не могу выполнять какие-либо действия git на сервере, когда iptables активен ... поэтому обходной путь - отключить брандмауэр, выполнить запрос, а затем повторно активировать брандмауэр. Это раздражает и приводит к человеческой ошибке, когда брандмауэр не включается снова.
Я сделал свои iptables из пары ресурсов и правил git отсюда: http://www.nigeldunn.com/2011/06/29/iptables-rules-to-allow-git/
Я попытался войти в систему, чтобы увидеть, какие пакеты блокируются git pull, но в /var/log/kern.log ничего не отображается (хотя другие вещи не связаны, поэтому я знаю, что это работает).
При выполнении git pull я получаю следующее:
ssh: Could not resolve hostname equity1.projectlocker.com: Name or service not known
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Вот моя конфигурация iptables:
#!/bin/sh
echo "Flushing iptable rules"
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
echo "Setting default drop rules"
# Setting default filter policy
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
echo "Enabling loopback"
# Allow unlimited traffic on loopback
#iptables -A INPUT -i lo -j ACCEPT
#iptables -A OUTPUT -o lo -j ACCEPT
echo "Allowing new and established incoming connections to port 22,80,443,3000, and 9418"
# Multiport - Allow incoming + outgoing
# SSH (22),
# Web Traffic (80, 3000),
# Secure Web Traffic (443)
# Git (9418)
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443,3000,9418 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443,3000,9418 -m state --state ESTABLISHED -j ACCEPT
echo "Port forwarding from port 3000 to 80"
# Port Forward to 3000
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000
echo "Enabling ICMP (Pings, echos)"
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
echo "Preventing DDOS attacks"
# Prevent DOS Attacks
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
echo "Enabling logging"
iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
iptables -A LOGGING -j DROP
# lastly:
# make sure nothing comes or goes out of this box
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
Обновлено:
echo "Flushing iptable rules"
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
echo "Setting default drop rules"
# Setting default filter policy
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Allow DNS Queries for Git
iptables -A OUTPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT
...
Помимо разрешения DNS-запросов, вам необходимо разрешить трафик через порт 9418.
Git использует порт 9418 для связи. Вы не хотите открывать порт извне, поэтому я использовал проверку с отслеживанием состояния, чтобы открыть порт, только если мы установили соединение.
# allow git
sudo iptables -A OUTPUT -o eth0 -p tcp --dport 9418 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --sport 9418 -m state --state ESTABLISHED -j ACCEPT
В моем случае я использовал небольшую вариацию (я использовал conntrack вместо состояния).
sudo iptables -A OUTPUT -o eth0 -p tcp --dport 9418 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --sport 9418 -m conntrack --ctstate ESTABLISHED -j ACCEPT
ССЫЛКА: http://www.nigeldunn.com/2011/06/29/iptables-rules-to-allow-git/
Вы забыли разрешить исходящие DNS-запросы, поэтому ssh не может найти IP-адрес для имени хоста.
Вам необходимо разрешить исходящий трафик на TCP-порт 53 и UDP-порт 53.
Извините, у меня сложилось впечатление, что "OUTPUT -o" - это исходящее соединение? Мне не хватает исходящего порта 22 для UDP? Или мне нужно добавить идентификатор пункта назначения с -d?
Я использую CentOS 7, поэтому мой синтаксис iptables будет немного отличаться от вашего; но это даст то же самое общее представление о том, что вам нужно написать.
Если бы я хотел открыть TCP-порт 22, я бы написал следующее:
# Open TCP port 22 for incoming traffic:
-A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# Open TCP port 22 for outgoing traffic:
-A INPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
Вы заметите, что синтаксис использует INPUT в паре с --dport 22 и OUTPUT в паре с --sport 22 для входящих. Для исходящих все наоборот; INPUT с --sport 22 и OUTPUT с --dport 22. Надеюсь, это кому-то поможет!