这是我在新安装的 Debian 8 上加载的文件iptables-restore
: 我唯一更改的是在文件中使用 SSH 端口 22022 /etc/ssh/sshd_config
。
----- 请参阅下面的更新-----
一旦我加载这个文件,我就无法以任何方式访问这个 debian;甚至 ping 也不起作用。 /var/log/messages 文件中没有任何有关任何错误的信息。这是我第一次尝试配置 iptables。我读过很多有关它的文档,但我在某个地方做错了。你能指出这里发生了什么吗?
*filter
#----------
# Local loop
#----------
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
#----------
# Connexions already established
#----------
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#----------
# PING
#----------
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
#----------
# SSH
#----------
-A INPUT -p tcp --dport 22022 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --dport 22022 -m state --state NEW,ESTABLISHED -j ACCEPT
#----------
# HTTP
#----------
-A INPUT -p tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp --dport 80 -j ACCEPT
#----------
# HTTPS
#----------
-A INPUT -p tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp --dport 443 -j ACCEPT
#----------
# FTP
#----------
-A INPUT -p tcp --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
#----------
# Logs
#----------
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 4
#----------
# DROP everything else
#----------
-A INPUT -j DROP
-A OUTPUT -j DROP
-A FORWARD -j DROP
COMMIT
- - - 更新 - - -
现在我可以使用 NTP、Ping、DNS、Whois、SSH、HTTP(S) 和 FTP。胡拉。这是新文件,如果您发现任何奇怪的内容,请告诉我。我还了解到,将 FTP(TLS/SSL) 与 vsftp(我使用的)一起使用需要一些好的配置技巧,但目前我还没有找到任何好的解决方案。我真的希望我能解决这个问题,因为我不会像这样保持“清晰”的 FTP。如果你有什么想法。再次感谢您的帮助,两个答案都很好,我无法选择一个;)
(顺便说一句,我现在使用 sh 脚本来加载模块)
#!/bin/sh
#----------
# Load needed modules
#----------
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
#----------
# Local loop
#----------
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
#----------
# Connexions already established
#----------
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#----------
# NTP
#----------
iptables -A INPUT -p udp --sport 123 -j ACCEPT
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
#----------
# PING
#----------
iptables -A INPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#----------
# DNS
#----------
# UDP
iptables -A INPUT -i eth0 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
# TCP
iptables -A INPUT -i eth0 -p tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
#----------
# WHOIS
#----------
iptables -A INPUT -p tcp --sport 43 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 43 -j ACCEPT
#----------
# SSH
#----------
# Incoming
iptables -A INPUT -i eth0 -p tcp --dport 22022 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22022 -m state --state ESTABLISHED -j ACCEPT
# Outgoing
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
#----------
# HTTP
#----------
# Incoming
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
# Outgoing
iptables -A INPUT -i eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
#----------
# HTTPS
#----------
# Incoming
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
# Outgoing
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
#----------
# FTP
#----------
#incoming
iptables -A INPUT -i eth0 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
#----------
# Logs
#----------
#-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 4
#----------
# DROP everything else
#----------
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP
exit 0
答案1
在这些规则之后:
-A OUTPUT -p tcp --dport 22022 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -j DROP
您可以从计算机发送的所有内容是 HTTP(S) 请求、一些发往端口 22022 的 FTP 连接和 SSH 连接。但例如来自 SSH 服务器的响应则不然,因为它们的目的地将是客户端选择的某个随机端口(可能不是 22022,除非是偶然)。同样,来自 HTTP 服务器的响应也不会发出,并且也不允许 ICMP 回显回复。
如果您只想允许 SSH 服务器发送的数据包,则需要允许数据包发送来自端口 22022,因此--sport 22022
.
尽管即使您允许 SSH 服务器响应,您很快就会发现您无法发出许多传出请求。您确实允许 HTTP 请求,但例如传出 DNS 查询将不会出去。考虑一下您愿意制定多严格的输出规则。我建议至少首先在链中添加-m state --state ESTABLISHED -j ACCEPT
一条规则。-j LOG
OUTPUT
答案2
正如 ilkkachu 在他的回答中所说,你的输出规则并不想要(我猜)你想要它们。
一些忠告:
- 不要用
DROP
规则显式结束链,DROP
而是使用iptables -P INPUT DROP
( 和 类似OUTPUT
,FORWARD
然后您可以使用 向链添加规则iptables -A <chain>
,该策略会自动应用于到达链末尾的任何数据包。 - 向链中添加一条规则
OUTPUT
,允许已建立的相关连接上的流量,并带有iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
.与您INPUT
链中的完全相似。然后,对您允许传入的任何内容的响应都将被允许,无需考虑特定协议如何工作。 - 考虑添加规则,允许您的服务器发出传出 DNS 请求(记住两个都UDP 和 TCP)。