我读了很多页,尝试了很多方法,但还是卡在这里。
我有一台新安装的 Ubuntu 20.04 服务器。我在其上运行了一个 Django 测试服务器(只是为了试用)。它正在运行并监听端口 8000。
我理解了:
$ sudo netstat -tulpen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 112 62240 47748/postgres
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 1000 65495 48618/python
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 101 23068 755/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 27689 850/sshd: /usr/sbin
tcp6 0 0 :::5432 :::* LISTEN 112 62241 47748/postgres
tcp6 0 0 :::22 :::* LISTEN 0 27691 850/sshd: /usr/sbin
udp 0 0 127.0.0.53:53 0.0.0.0:* 101 23067 755/systemd-resolve
udp 0 0 192.168.0.15:68 0.0.0.0:* 100 23071 753/systemd-network
udp6 0 0 fe80::224:e8ff:fe22:546 :::* 100 23086 753/systemd-network
并且它响应得很好。我可以在服务器上执行以下操作:
wget localhost:8000
我得到了回复。
因此,现在我转到局域网上的台式机。然后我尝试 wget:
$ wget server.lan:8000
--2020-10-11 11:42:18-- http://server.lan:8000/
Resolving server.lan (server.lan)... 192.168.0.15
Connecting to server.lan (server.lan)|192.168.0.15|:8000... failed: Connection refused.
果然:
$ nmap server.lan
Starting Nmap 7.80 ( https://nmap.org ) at 2020-10-11 22:43 AEDT
Nmap scan report for server.lan (192.168.0.15)
Host is up (0.00025s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
5432/tcp open postgresql
Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
$ nmap serverlan -p 8000
Starting Nmap 7.80 ( https://nmap.org ) at 2020-10-11 22:44 AEDT
Nmap scan report for server.lan (192.168.0.15)
Host is up (0.00068s latency).
PORT STATE SERVICE
8000/tcp closed http-alt
Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds
好的,对服务器进行标准检查:
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:8000
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
因为我使用以下命令启用了端口 8000:
$ sudo iptables -A INPUT -p tcp --dport 8000 -j ACCEPT
按照此处的说明进行操作:https://www.e2enetworks.com/help/knowledge-base/how-to-open-ports-on-iptables-in-a-linux-server/
和:
$ sudo ufw status verbose
Status: inactive
然而从桌面上看lan端口8000已经关闭了!
我应该注意到端口 22 是打开的(因为我使用 ssh 登录到服务器,并且我也可以在端口 5432 上看到数据库,并且可以从桌面使用 pgadmin4 对其进行管理,所以端口 22 和 5432 是打开的,但我看不到iptables -L
它们是打开的。
Ubuntu 20.04 到底有怎样的神秘魔力,我读过的许多页面都没有提到这一点。
我甚至可以 ping 通它:
$ ping arachne.lan
PING arachne.lan (192.168.0.15) 56(84) bytes of data.
64 bytes from 192.168.0.15 (192.168.0.15): icmp_seq=1 ttl=64 time=0.269 ms
64 bytes from 192.168.0.15 (192.168.0.15): icmp_seq=2 ttl=64 time=0.267 ms
64 bytes from 192.168.0.15 (192.168.0.15): icmp_seq=3 ttl=64 time=0.530 ms
64 bytes from 192.168.0.15 (192.168.0.15): icmp_seq=4 ttl=64 time=0.284 ms
64 bytes from 192.168.0.15 (192.168.0.15): icmp_seq=5 ttl=64 time=0.280 ms
64 bytes from 192.168.0.15 (192.168.0.15): icmp_seq=6 ttl=64 time=0.280 ms
因为我喜欢它并且使用它,所以我安装了它cockpit
并且它在端口 9090 上运行。它可以在桌面上安装并运行。
现在:
$ netstat -tulpen
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 112 62240 -
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 1000 65495 48618/python
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 101 23068 -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 27689 -
tcp6 0 0 :::5432 :::* LISTEN 112 62241 -
tcp6 0 0 :::9090 :::* LISTEN 0 71091 -
tcp6 0 0 :::22 :::* LISTEN 0 27691 -
udp 0 0 127.0.0.53:53 0.0.0.0:* 101 23067 -
udp 0 0 192.168.0.15:68 0.0.0.0:* 100 23071 -
udp6 0 0 fe80::224:e8ff:fe22:546 :::* 100 23086 -
但 iptables 却无动于衷:
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:8000
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
但是从台式机上的 nmap 可以看到它:
$ nmap server.lan
Starting Nmap 7.80 ( https://nmap.org ) at 2020-10-11 22:55 AEDT
Nmap scan report for server.lan (192.168.0.15)
Host is up (0.00024s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
5432/tcp open postgresql
9090/tcp open zeus-admin
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds
因此,cockpit、postgresql 和 ssh 在安装时都以某种方式管理,以告诉 Ubuntu 20.04 打开一个端口。
因此,在内省 nmap 上查看服务器:
$ nmap localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2020-10-11 11:58 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00021s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
5432/tcp open postgresql
8000/tcp open http-alt
9090/tcp open zeus-admin
Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds
端口 8000 看起来是开放的。
桌面和服务器之间没有防火墙,只有标准的 LAN 交换机。
为什么 cockpit、postgresql 和 ssh 都能实现某些功能,但要弄清楚它们实现了什么以及如何实现这些功能却如此困难?他们iptables
似乎没有使用它。也没有ufw
。我错过了什么魔法?我如何打开 8000 端口?
答案1
不幸的是,你走错了方向(但是发布了一个经过彻底研究的问题,做得很好!)
问题不在于港口,这是界面您的服务正在监听的,显示在Local Address
netstat 报告的列中:127.0.0.1
是本地主机(或“环回”)接口 - 它只接受来自同一主机的连接。
通常,你可以将服务配置为侦听特定接口或所有外部接口。例如
udp 0 0 192.168.0.15:68 0.0.0.0:* 100 23071 753/systemd-network
正在监听分配了 IPv4 地址的任何接口上的 68 端口192.168.0.15
,而你的 SSH 服务
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 27689 850/sshd: /usr/sbin
正在监听所有外部接口,如 netstat 的0.0.0.0
本地地址值所示。
我对 Django 一无所知,但这个[so]问答建议了一些方法来配置它以监听外部接口:
或者(出于安全意识),您可以让它在环回接口上监听,并为网络流量设置 SSH 隧道。