[已解决] - 请参阅下面的更新。
我安装了大纲服务器(关联)在我的服务器上,不幸的是 FirewallD 会丢弃来自大纲客户端的所有数据包。
我的系统:
Ubuntu 18.04 x64
Linux x 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
防火墙D版本:0.4.4.5
码头工人版本:Docker version18.05.0-ce, build f150324
防火墙D规则:
root@x:~# firewall-cmd --get-active-zones
public
interfaces: ens3 docker0
root@x:~# firewall-cmd --list-ports
{outline_server_port}/tcp {outline_server_port}/udp
关于这个问题的答案关联也没有帮助。
例如,大纲管理器工作正常:我可以创建密钥并且它连接成功,但是大纲客户端给我以下错误:
发生网络错误。如果再次发生这种情况,请提交反馈。
一旦我使用以下命令停止 FirewallD:
systemctl stop firewalld.service
大纲客户端工作正常,当我启动 FirewallD 时,它不再工作。
以下来自FirewallD状态
root@x:~# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2018-05-15 23:37:31 CEST; 8s ago
Docs: man:firewalld(1)
Main PID: 2479 (firewalld)
Tasks: 2 (limit: 1113)
CGroup: /system.slice/firewalld.service
└─2479 /usr/bin/python3 -Es /usr/sbin/firewalld --nofork --nopid
May 15 23:37:31 x systemd[1]: Starting firewalld - dynamic firewall daemon...
May 15 23:37:31 x systemd[1]: Started firewalld - dynamic firewall daemon.
May 15 23:37:32 x firewalld[2479]: WARNING: COMMAND_FAILED: '/sbin/iptables -w2 -t filter -n -L DOCKER-USER' failed: iptables: No chain/target/match by that name.
May 15 23:37:32 x firewalld[2479]: WARNING: COMMAND_FAILED: '/sbin/iptables -w2 -t filter -C DOCKER-USER -j RETURN' failed: iptables: Bad rule (does a matching rule exist in that chain?).
May 15 23:37:32 x firewalld[2479]: WARNING: COMMAND_FAILED: '/sbin/iptables -w2 -t filter -C FORWARD -j DOCKER-USER' failed: iptables: No chain/target/match by that name.
我已启用
- 也在 FirewallD 上伪装 (
firewall-cmd --add-masquerade
) - 并且还启用了 ipv4 数据包转发 (
vim /etc/sysctl.conf
&net.ipv4.ip_forward=1
)
现在我的问题是:如何配置 FirewallD 以允许大纲客户端数据包?
多谢。
Outline 使用 docker。
更新[2018.05.16]:
问题在于,outline 在 docker 容器中为每个新密钥 AKA 客户端创建的唯一端口,因此要解决该问题,请执行以下操作:
运行以下命令(非常感谢@abe)
ss -tlp
现在,将显示所有 ss-servers 及其相关端口,例如我的如下所示:
root@dockerTest:~# ss -tlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:12615 0.0.0.0:* users:(("ss-server",pid=1162,fd=5))
LISTEN 0 128 127.0.0.53%lo:domain 0.0.0.0:* users:(("systemd-resolve",pid=617,fd=13))
LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* users:(("sshd",pid=824,fd=3))
LISTEN 0 128 [::]:ssh [::]:* users:(("sshd",pid=824,fd=4))
LISTEN 0 128 *:47515 *:* users:(("node",pid=1103,fd=12))
现在,正如我们从输出中看到的,ss-server 使用端口“12615”,我们应该在 FirewallD 中允许此端口。为此,请运行以下命令:
firewall-cmd --add-port=12615/tcp
firewall-cmd --add-port=12615/udp
检查大纲客户端,它应该连接。
如果一切按预期工作,请运行以下命令以使更改永久生效
firewall-cmd --add-port=12615/tcp --permanent
firewall-cmd --add-port=12615/udp --permanent
非常感谢@abe,我非常感谢你的帮助。
答案1
我在新的 ubuntu 18.04 服务器上安装了 docker,并以简单的方式验证了在运行 docker 时防火墙如何工作。
图像是我使用的httpd。
# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04 LTS
Release: 18.04
Codename: bionic
# uname -a
Linux my_hostname 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ sudo docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest fb2f3851a971 2 weeks ago 178MB
$ sudo docker run -d -i -t -p 80:80 httpd
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
43b398cfa5b9 httpd httpd-foreground" 31 minutes ago Up 31 minutes 0.0.0.0:80->80/tcp loving_northcutt
# ss -tlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:http *:* users:(("docker-proxy",pid=2101,fd=4))
# firewall-cmd --list-all
public
target: default
interfaces:
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
对于我的错误建议我真的很抱歉。我可以从我的电脑连接该 httpd,无需进行任何更改。
请参阅 sudo docker ps -a 输出的“PORTS”和 ss -tlp 输出的 docker-proxy。
我想我希望它能解决问题。
谢谢
答案2
将http 或https 端口添加到firewalld 怎么样?
firewall-cmd --add-service=https --permanent
我认为 jason 是一个 Web 应用程序,因此客户端通过http 或 https 协议连接到服务器。