jupyter 笔记本的 iptables 设置出现问题。 使用以下规则(假设笔记本端口8888),jupyter笔记本服务器将成功启动,但实际的笔记本内核将无法启动/建立。
通过注释掉最后一个 iptables 规则“-A OUTPUT -j DROP”,一切正常。
有什么想法吗?
-A INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 8888 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED --sport 8888 -j ACCEPT
-A OUTPUT -p tcp -m state --state ESTABLISHED --sport 8888 -j ACCEPT
-A OUTPUT -p tcp -m state --state NEW,ESTABLISHED --dport 8888 -j ACCEPT
-A INPUT -j DROP
-A OUTPUT -j DROP
像 jupyter 这样的工具通常使用环回设备(localhost)来访问某些功能。例如,jupyter 有一个通过 HTTP 与笔记本服务器通信的前端,笔记本服务器通过套接字将消息发送到 IPython 内核(请参阅:https://jupyter.readthedocs.io/en/latest/architecture/how_jupyter_ipython_work.html) .
我会添加以下规则:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
这些规则允许回送设备(本地主机)的输入和输出。
上面的答案是正确的修复方法,但是指出的文档已损坏,有关 Jupyter 客户端与 IPython 内核通信的当前文档已在此处更新:https://jupyter-client.readthedocs.io/en/latest/messaging.html
此外,对于遇到此问题的任何人来说,这是添加 iptable 规则的正确顺序:
iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 8888 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED --sport 8888 -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED --sport 8888 -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state NEW,ESTABLISHED --dport 8888 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptable 规则以链的形式存在。传入、传出和直通数据包在相应的链中一次检查一个规则,并根据第一个匹配的规则进行处理。通过上述顺序,带有环回地址的数据包可以自由通过,但所有其他流量都被阻止。这会阻止 pip 安装、apt-updates、telnet、netcat 等。
我设法使用防火墙策略阻止出站流量:
https://firewalld.org/2020/09/policy-objects-introduction
https://github.com/firewalld/firewalld/issues/898
以下政策奏效了:
#Setup a new policy
firewall-cmd --permanent --new-policy myOutputPolicy
firewall-cmd --permanent --policy myOutputPolicy --add-ingress-zone HOST
firewall-cmd --permanent --policy myOutputPolicy --add-egress-zone ANY
#Block all output traffic
firewall-cmd --permanent --policy myOutputPolicy --set-target REJECT
#Configure Exceptions
firewall-cmd --permanent --policy myOutputPolicy --add-service dns
firewall-cmd --permanent --policy myOutputPolicy --add-service https
firewall-cmd --permanent --policy myOutputPolicy --add-service http
#Apply changes
firewall-cmd --reload
此后,除 dns、http 和 https 之外的所有出站流量都将被拒绝,入站流量仍然有效。
如果需要,可以设置策略解锁:
#Enable all output traffic
firewall-cmd --permanent --policy myOutputPolicy --set-target ACCEPT
firewall-cmd --reload