jupyter 笔记本的 iptables 规则

iptables rules for jupyter notebook

jupyter notebook 的 iptables 设置有问题。使用以下规则(假设笔记本端口 8888),jupyter 笔记本服务器将成功启动,但实际笔记本内核将无法 start/establish.

通过注释掉最后一条 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

这些规则允许环回设备 (localhost) 的输入和输出。

以上答案是正确的解决方法,但是指向的文档已损坏,有关 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 等