请帮助我理解我做错了什么iptables在 ubuntu 14.04 上。
iptables -F
ip6tables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT DROP
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP
# allows the outgoing traffic of established connections, necessary if the OUTPUT policy is not set to ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -j DROP
iptables-nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
10574 17M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
2 88 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
260 14124 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
10317 623K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate NEW,ESTABLISHED
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
在上面我尝试阻止除 ssh 之外的所有内容。因此,我预计 wget 将无法下载任何内容,但它可以工作,而 apt-get update 则不起作用(如预期)。请解释一下如何阻止所有(传入/传出),或者如果此配置没问题,为什么 wget 仍然有效?
编辑:我还尝试将 2 行更改为 1 行,但这没有帮助。
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
结果:wget 正在工作,apt-get 更新没有。有人可以澄清为什么吗?谢谢。
答案1
让我们逐块查看您的规则和要求。您有一个默认策略,DROP
因此您不需要最终规则。 (不过,这并不是一个坏主意。)
我尝试阻止除 ssh 之外的所有内容。所以,我预计将
wget
无法下载任何内容,但它可以工作,也apt-get update
可以不工作(如预期)
输入规则:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP
也就是说,与传出连接相关的任何流量都将被允许。任何入站到 tcp/22(即ssh
)的内容也是被允许的。其他一切都应该被放弃。请注意,这里没有任何东西会阻止您的外出wget
和apt-get update
请求。
输出规则:
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -j DROP
这意味着与先前允许的入站连接相关的任何流量都将被允许。任何出站到目标 tcp/22(即ssh
)的内容也是被允许的。最后,其他一切都应该被放弃。
观察结果:
出站部分中没有任何内容允许您wget
或apt-get update
请求。因此,如果wget
有效,请提供您正在使用的示例命令以及set | grep _proxy
. (您可能会看到一个或多个定义,例如http_proxy
,它为每个相应的协议定义了一个代理。)
顺便说一句,建议的做法iptables
是允许所有环回流量,您可以使用以下两个命令来执行此操作:
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT