我已在远程CentOS 7
服务器上成功配置 OpenVPN,以允许员工和管理员进行 https 访问,同时还阻止非管理员的所有人进行 ssh 访问。这在为键入 的员工提供 appONE 的情况下运行良好https: / 10.8.0.1
。 但是,我必须向 firewalld 添加哪些规则,以便第三个组suppliers
在登录 VPN 并输入 时可以路由到另一个应用程序(称为 appTWO)的 https 访问权限https: / 10.8.0.1
?
根据 @garethTheRed 的建议,我想答案涉及让 appONE 在端口 80 上运行,然后让 appTWO 在端口 81 上运行。这只需要防火墙规则将员工 ip 范围定向到端口 80,同时将供应商 ip 范围路由到端口 81 ,但是我如何定义firewalld规则来实现这一点呢?
这是我到目前为止所做的:
我总结了所需的用户类别、IP 范围和服务如下:
Class Virtual IP range Allowed Services
employees 10.8.0.0/24 https (but only appONE)
administrator 10.8.1.0/24 ssh, https
suppliers 10.8.2.0/24 https (but only appTWO)
接下来,我在 中添加了以下内容/etc/openvpn/server.conf
,
define the Employee IP address pool:
server 10.8.0.0 255.255.255.0
Add a route for the System Administrator IP range:
route 10.8.1.0 255.255.255.0
Add a route for the Supplier IP range:
route 10.8.2.0 255.255.255.0
Specify client configuration directory to assign a fixed IP forAdministrator:
client-config-dir ccd
/etc/openvpn/ccd/suppliers
然后我按照以下步骤创建了一个新的配置文件:
nano suppliers
type the following into /etc/openvpn/ccd/suppliers:
ifconfig-push 10.8.2.1 10.8.2.2
鉴于最初创建了 OpenVPN 配置使用本教程中的说明/etc/openvpn/easy-rsa
,接下来我通过输入创建了一个证书source ./vars
,然后输入./build-key suppliers
. (这是参考教程中的两个命令。)我将结果suppliers.crt
和复制suppliers.key
到客户端计算机,并创建了以下suppliers.ovpn
文件:
client
dev tun
proto udp
remote my.SERVER.ip.addr 1194
resolv-retry infinite
nobind
persist-key
persist-tun
verb 3
ca /path/to/ca.crt
cert /path/to/suppliers.crt
key /path/to/suppliers.key
然后,我尝试通过在客户端计算机的终端中键入以下内容来从客户端登录 VPN: openvpn --config /path/to/suppliers.ovpn
。终端中的结果似乎表明已建立 VPN 连接,因为终端中打印的最后两行是:
Tue Mar 10 15:39:50 2015 /usr/sbin/ip route add 10.8.0.1/32 via 10.8.2.2
Tue Mar 10 15:39:50 2015 Initialization Sequence Completed
请注意,我似乎已成功连接为正确的 ip 10.8.2.2
,但还没有当我尝试时没有得到答复https : / 10.8.0.1
。
为了确认 OpenVPN 正在工作,我在客户端中输入了以下内容openvpn --config /path/to/administrators.ovpn
,并且能够按预期成功https
连接ssh
到服务器。
当我在服务器上键入时firewall-cmd --list-all-zones
,结果中的活动区域如下:
internal (active)
interfaces: tun0
sources:
services: dhcpv6-client https ipp-client mdns samba-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source NOT address="10.8.1.1" service name="ssh" reject
public (default, active)
interfaces: enp3s0
sources:
services: dhcpv6-client openvpn
ports:
masquerade: yes
forward-ports:
icmp-blocks:
rich rules:
那么为什么供应商账号不能https呢?如何定义防火墙规则,以便供应商 https 请求路由到一个端口 abc,而员工和管理员 https 请求路由到另一个端口 xyz?
编辑
根据@garethTheRed的建议,我ip route
在CLIENT上输入并得到以下结果:
default via 10.0.0.1 dev wlp1s0 proto static metric 1024
10.0.0.0/24 dev wlp1s0 proto kernel scope link src 10.0.0.2
10.8.0.1 via 10.8.2.2 dev tun0
10.8.2.2 dev tun0 proto kernel scope link src 10.8.2.1
在服务器上输入ip route
结果:
default via my.server.ip.1 dev enp3s0 proto static metric 1024
10.8.0.0/24 via 10.8.0.2 dev tun0
10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1
10.8.1.0/24 via 10.8.0.2 dev tun0
my.server.ip.0/24 dev enp3s0 proto kernel scope link src my.server.ip.addr
my.server.ip
注意和之间的区别my.server.ip.addr
。整个4块服务器ip地址由 表示my.server.ip.addr
。相比之下,只有前三个块由 表示my.server.ip
。
的内容nano /etc/openvpn/ccd/administrators
只有一行ifconfig-push 10.8.1.1 10.8.1.2
。
仅有的两个 ccd 文件是/etc/openvpn/ccd/administrators
和 ,/etc/openvpn/ccd/suppliers
如上所示。
编辑#2
按照 @garethTheRed 的指示后,员工 IP 地址范围可以通过键入 登录 appONE https : / 10.8.0.1
,但管理员不再具有 https 访问权限,并且供应商也不再具有 https 访问权限。当作为供应商连接时,当我输入https : / 10.8.0.1:444
和 时,我的 https 请求被拒绝https : / 10.8.0.1
。
注意:为了诊断这个问题,我不得不尝试一些看似偏离主题的事情。如果有必要,我很乐意将此 EDIT#2 的内容作为单独的问题发布,但现在我将其保留在这里,因为防火墙设置可能仍然是问题。没有证据表明这些其他主题导致了该问题。我只是将它们纳入尽职调查。
我猜测供应商缺乏 https 访问可能是由于应用程序由 httpd 反向代理后面的 tomcat 提供服务。因此,我按照另一篇帖子中的说明,让 tomcat 通过端口 8081 为 appTWO 提供服务,同时继续通过端口 8080 为 appONE 提供服务。我在firewalld 的公共区域中打开了端口 8080 和 8081,以确认 tomcat 正确地提供了这两个应用程序。
然后我检查了连接 httpd 和 tomcat 的反向代理的代码。
反向代理在 httpd 中由以下文件定义/etc/httpd/conf.d/mydomain.com.conf
,该文件具有以下内容:
<VirtualHost *:443>
ServerName www.mydomain.com
ServerAlias mydomain.com
ErrorLog /path/to/mydomain_com_error.log
CustomLog /path/to/mydomain_com_requests.log combined
SSLEngine on
SSLProxyEngine on
SSLCertificateFile /path/to/localhost.crt
SSLCertificateKeyFile /path/to/localhost.key
ProxyPass / ajp://my.server.ip.addr:8009/
ProxyPassReverse / ajp://my.server.ip.addr:8009/
</VirtualHost>
请注意,mydomain.com 是计算机的主机名,但没有来自 Internet 的流量到达 mydomain.com,因为 https 和 http 在公共区域中是关闭的。只有 OpenVPN 用户才能访问 Web 应用程序,而且只能在内部区域中访问。
Tomcat的server.xml定义了反向代理<Connector port="8090" protocol="AJP/1.3" redirectPort="8443" />
。
/etc/httpd/conf.d/mydomain.com.conf
为了在端口 444 上为 appTWO 试验单独的反向代理,我在上面的代码部分之后添加了以下内容:
#I added this entire following section as a test for this question
<VirtualHost *:444>
ServerName www.mydomain.com
ServerAlias mydomain.com
ErrorLog /path/to/mydomain_com_error.log
CustomLog /path/to/mydomain_com_requests.log combined
SSLEngine on
SSLProxyEngine on
SSLCertificateFile /path/to/localhost.crt
SSLCertificateKeyFile /path/to/localhost.key
ProxyPass / ajp://my.server.ip.addr:8009/
ProxyPassReverse / ajp://my.server.ip.addr:8009/
</VirtualHost>
我确保<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
在 server.xml 中的两个服务中都定义了这一点,但当我作为供应商登录 OpenVPN 时仍然无法使用 https。
然后我在 server.xml 和 中尝试了端口 8010 /etc/httpd/conf.d/mydomain.com.conf
,但仍然无法作为供应商获得 https 访问。
最后,我尝试了
[root@mydomain ]# telnet localhost 8010
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
[root@mydomain ]# telnet localhost 8009
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
这让我想知道问题是否可能是端口 8010 没有为反向代理开放,从而导致供应商无法访问 appTWO。
不过,我也在httpd.conf中取消了以下注释,并https : / 10.8.0.1:444
再次尝试,但仍然被拒绝,这让我怀疑问题是否出在防火墙上:
<Directory "/var/www">
AllowOverride None
# Allow open access:
Require all granted
</Directory>
注意:我没有重新启动httpd.service。
如果我至少能让供应商通过 https 提供静态 html,那么防火墙问题就可以被认为解决了,如果有必要,我可以单独发布反向代理问题。
编辑#3
根据@garethTheRed 的编辑,我从内部区域中删除了https
和。https-app2
我还删除了reject
内部区域的丰富规则。我添加了新的accept
丰富规则,但我授予管理员查看https
和 的权利https-app2
。当我输入时,结果是以下输出firewall-cmd --list-all --zone=internal
:
internal (active)
interfaces: tun0
sources:
services: dhcpv6-client ipp-client mdns samba-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="10.8.1.0" service name="https" accept
rule family="ipv4" source address="10.8.1.0" service name="https-app2" accept
rule family="ipv4" source address="10.8.2.0" service name="https-app2" accept
rule family="ipv4" source NOT address="10.8.1.1" service name="ssh" reject
rule family="ipv4" source address="10.8.0.0" service name="https" accept
我还保留了该<VirtualHost *:444>
部分,/etc/httpd/conf.d/mydomain.com.conf
如图所示编辑#2多于。但是,在进行下面描述的测试之前, 我确实进行了systemctl stop httpd.service
输入。systemctl start https.service
但现在我无法在任何帐户下登录https或https-app2。
例如,当我输入 时openvpn --config /path/to/employees.ovpn
,终端会回复:
Thu Mar 12 09:46:22 2015 /usr/sbin/ip route add 10.8.0.1/32 via 10.8.0.9
Thu Mar 12 09:46:22 2015 Initialization Sequence Completed
这看起来就像我登录了,但随后https : / 10.8.0.1
两者https : / 10.8.0.1:444
都导致 Firefox 中出现“无法连接”错误。
同样,输入openvpn --config /path/to/suppliers.ovpn
结果为:
Thu Mar 12 09:45:19 2015 /usr/sbin/ip route add 10.8.0.1/32 via 10.8.2.2
Thu Mar 12 09:45:19 2015 Initialization Sequence Completed
但一次https : / 10.8.0.1
又一次https : / 10.8.0.1:444
地导致 Firefox 出现“无法连接”错误。
另外,输入openvpn --config /etc/openvpn/administrators.ovpn
结果为:
Thu Mar 12 09:15:36 2015 /usr/sbin/ip route add 10.8.0.1/32 via 10.8.1.2
Thu Mar 12 09:15:36 2015 Initialization Sequence Completed
但之后https : / 10.8.0.1
仍然https : / 10.8.0.1:444
会导致 Firefox 出现“无法连接”错误。
我是当以管理员身份连接到 OpenVPN 时能够,因此只有和被破坏。 ssh [email protected]
https
https-app2
答案1
在默认https
端口 (443) 上运行 app1,并在另一个端口上运行 app2(444 - 除非您使用 SNPP,在这种情况下,您需要选择另一个空闲端口)。
https.xml
将文件(位于/usr/lib/firewalld/services
)克隆到/etc/firewalld/services
并将其重命名为(例如)https-app2.xml
。
编辑这个新文件并将端口更改为444
.
确保https
(和https-app2
) 从 中删除internal zone
。
跑步:
firewall-cmd --zone=internal --add-rich-rule='rule family="ipv4" source address="10.8.0.0/24" service name="https" accept'
firewall-cmd --zone=internal --add-rich-rule='rule family="ipv4" source address="10.8.0.0/24" service name="https-app2" accept'
firewall-cmd --zone=internal --add-rich-rule='rule family="ipv4" source address="10.8.1.0/24" service name="https" accept'
firewall-cmd --zone=internal --add-rich-rule='rule family="ipv4" source address="10.8.2.0/24" service name="https-app2" accept'
请注意,这些不是永久性的,因此如果它们有效,您需要重新运行它们并--permanent
附加。