为什么 https 通信不能与 iptables 一起工作?

为什么 https 通信不能与 iptables 一起工作?

我正在尝试配置 iptables 以进行安全设置。

基本上,我设置了一个白名单并尝试进行测试。

我设置了以下设置,允许 ssh、http 和 https 访问我的服务器,允许输入值 22、80、443。还允许使用临时端口。

​sudo iptables -t filter -F
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3000: -j ACCEPT

以下是设置列表。

Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpts:3000:65535
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

我按照上述方法允许它,但我能够正常连接到我服务器的 80 端口上的 ssh 和 apache。

但是,“curl https://google.com”命令在我的服务器上没有正确响应。

奇怪的是添加以下规则后:

sudo iptables -P INPUT ACCEPT

当我执行“curl https://google.com”时,通信正常完成。

造成这种情况的原因是什么?解决办法是什么?

答案1

问题是您没有允许来自互联网的响应数据包通过的规则。

也就是说,DNS请求被发送到UDP端口53的互联网主机,并且它的答复来自互联网从UDP端口到客户端用于发出请求的随机端口。

类似地,来自互联网的 TCP 数据包也被丢弃,因为没有规则允许来自互联网服务器端口 443 的数据包到随机客户端端口。

您需要添加以下内容:

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

这将启用 Netfilter 连接跟踪,确保 TCP 连接/UDP 关联的 IP 数据包得到正确允许。

答案2

最后一个 iptables 输入规则格式不正确

并添加一些日志,以便您获得更多的故障排除信息。

sudo iptables -A INPUT -j LOG

您还可以使用 logwatch 和 iptables-log-parser 等日志分析器从日志中获得更多见解。

相关内容