IPtables 问题 - 感谢帮助

IPtables 问题 - 感谢帮助

我正在尝试为我的树莓派制作防火墙。我想要的规则是

  1. 允许传入 SSH - 有效

  2. 允许传出 ssh - 这不起作用,这是我的主要问题

  3. 允许传入和传出 VNC - 目前此功能部分可用,我可以连接但无法执行任何操作。这不是一个优先事项
  4. 允许传出 https - 我可以访问一个网站,但我认为我需要为 DNS 添加另一行才能使其在启动时正常工作。
  5. 允许发送电子邮件 - 有效
  6. 允许传出 ping 并得到回复 - 这种方法有效
  7. 放弃其他一切 - 猜测这是可行的,因为我无法进行传出 SSH,所以我相信问题出在我的规则中。

我知道我的 ssh 可以正常工作,因为没有加载防火墙,我就可以从一个 pi 向另一个 pi 建立传出 SSH。

    #!/bin/sh

    #Flush all rules
    iptables -F

    #Allow incoming and outgoing SSH
    sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
    sudo iptables -A OUTPUT  -p tcp --sport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

    #Allow VNC sessions
    sudo iptables -A INPUT -s 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -j ACCEPT
    sudo iptables -A OUTPUT -d 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --sports 5900:5905,6000:6005 -j ACCEPT

    #Accept only incoming etstablished and allow new or established outgoing
    sudo iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
    sudo iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

    #Accept port 587 for email
    sudo iptables -A INPUT -p tcp --sport 587 -j ACCEPT
    sudo iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT

    #Allow ping requests to go out and get a reply
    sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
    sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

    #Drop all other packets and protocols
    sudo iptables -P INPUT DROP
    sudo iptables -P FORWARD DROP
    sudo iptables -P OUTPUT DROP

答案1

SSH 行的问题在于您尝试允许22来自本地计算机的源端口。但是,当您连接到远程 SSH 服务器时,您的计算机不会为此使用端口 22。它使用随机端口,通常在较高的端口范围内。这是有道理的,因为如果它使用端口 22 进行传出 SSH 连接,您一次只能连接到一个 SSH 服务器。

为了解决这个问题,最简单的方法是使用--dport而不是--sport,允许每个具有目标端口22(ssh) 的连接。

sudo iptables -A OUTPUT  -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

请注意,你必须添加这一行而不是替换它,正如@bcs78 在评论中指出的那样。

阻止内部环回连接的流量通常也不是一个好主意。有些程序依赖此连接,如果没有它,它们将无法正常工作。将以下内容添加到脚本的开头:

sudo iptables -A INPUT -i lo -j ACCEPT

答案2

每条链添加一次万能接头有状态的可以简化大多数其他规则的规则:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -F

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

加上通常的lo接口规则以允许所有本地服务,如果您认为确实不需要,请将其删除:

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

现在您不必重复其他规则(NEW当它存在时我会离开它,即使它不是很有用并且不是一直存在):

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 10.10.10.1 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 192.168.0.150 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT

iptables -A OUTPUT  -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

前两个规则处理好了所有事情,不需要重复每条规则,现在流程的初始方向很明确:INPUTOUTPUT,仅一次。因此,更清楚地表明,--sport 22SSH 的 无法帮助传出情况(--dport 22需要)。如果有相关错误回复的规则RELATED,将会很有用。在这种情况下,可能不需要它。udpicmp

相关内容