设置 iptables 过滤器以允许 Git

设置 iptables 过滤器以允许 Git

我正在尝试设置我的 Ubuntu 14.04.2 LTS 服务器以拥有一个可靠的 iptables 防火墙。目前我认为它非常好,但是,当 iptables 处于活动状态时,我无法在服务器上执行任何 git pull...因此解决方法是关闭防火墙,执行 pull,然后重新激活防火墙。这很烦人,并且会引入不重新打开防火墙的人为错误。

我根据一些资源创建了 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
...

答案1

您忘记允许传出 DNS 查询,因此 ssh 无法找到主机名的 IP 地址。

您需要允许到 TCP 端口 53 和 UDP 端口 53 的传出流量。

答案2

除了允许 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 而不是 state)。

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/

答案3

抱歉,我以为“OUTPUT -o”是出站连接?我是否遗漏了 UDP 的出站端口 22?还是我需要使用 -d 添加目标 ID?

我使用的是 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 配对。希望这对某些人有帮助!

相关内容