我正在尝试为我的树莓派制作防火墙。我想要的规则是
允许传入 SSH - 有效
允许传出 ssh - 这不起作用,这是我的主要问题
- 允许传入和传出 VNC - 目前此功能部分可用,我可以连接但无法执行任何操作。这不是一个优先事项
- 允许传出 https - 我可以访问一个网站,但我认为我需要为 DNS 添加另一行才能使其在启动时正常工作。
- 允许发送电子邮件 - 有效
- 允许传出 ping 并得到回复 - 这种方法有效
- 放弃其他一切 - 猜测这是可行的,因为我无法进行传出 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
前两个规则处理好了所有事情,不需要重复每条规则,现在流程的初始方向很明确:INPUT
或OUTPUT
,仅一次。因此,更清楚地表明,--sport 22
SSH 的 无法帮助传出情况(--dport 22
需要)。如果有相关错误回复的规则RELATED
,将会很有用。在这种情况下,可能不需要它。udp
icmp