firewalld 规则将两个用户组路由到 OpenVPN 中的不同应用程序

firewalld 规则将两个用户组路由到 OpenVPN 中的不同应用程序

我已在远程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]httpshttps-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附加。

相关内容