Centos 7 路由器和防火墙

Centos 7 路由器和防火墙

我正在尝试设置带有防火墙的 CentOS 7 VM,以在两个不同的子网之间路由流量。

我有 2 个网络接口,ens192 用于外部网络,ens224 用于内部网络:

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:62:88:ba brd ff:ff:ff:ff:ff:ff
    inet 10.212.21.26/16 brd 10.212.255.255 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe62:88ba/64 scope link
       valid_lft forever preferred_lft forever
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:62:88:c4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.99.1/16 brd 192.168.255.255 scope global ens224
       valid_lft forever preferred_lft forever
    inet6 fe80::d301:8174:1d11:d550/64 scope link
       valid_lft forever preferred_lft forever

内部接口位于内部区域:

$ sudo firewall-cmd --list-all --zone=internal
internal (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens224
  sources:
  services: dhcpv6-client mdns samba-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

外部接口位于启用了伪装的外部区域:

$ sudo firewall-cmd --list-all --zone=external
external (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

内部接口的默认网关设置为外部接口的IP地址:

$ ip ro
default via 10.212.0.10 dev ens192  proto static  metric 100
default via 10.212.21.26 dev ens224  proto static  metric 101
10.212.0.0/16 dev ens192  proto kernel  scope link  src 10.212.21.26  metric 100
10.212.21.26 dev ens224  proto static  scope link  metric 100
192.168.0.0/16 dev ens224  proto kernel  scope link  src 192.168.99.1  metric 100

数据包转发已打开:

$ sudo sysctl -a | grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1

我可以从内部网络访问外部网络。并且,我可以 ping 通外部网络的 IP 地址。但是,尽管两个区域都启用了 ssh 服务,但我无法从外部网络 ssh 到相同的内部 IP 地址。

我尝试过多种不同的丰富规则/直通,但都没有成功。有人能给我指点一下吗?

谢谢。

编辑:

我删除了 10.212.21.26 路由,并将 SELinux 模式设置为宽容:

sudo ip ro del 10.212.21.26
sudo setenforce permissive

我可以 ping 通:

$ ping 192.168.99.100

Pinging 192.168.99.100 with 32 bytes of data:
Reply from 192.168.99.100: bytes=32 time<1ms TTL=63`

但我无法 ssh:

$ ssh -vvv 192.168.99.100
OpenSSH_6.8p1, OpenSSL 1.0.2a 19 Mar 2015
debug1: Reading configuration data /home/clay.rowland/.ssh/config
debug2: ssh_connect: needpriv 0
debug1: Connecting to 192.168.99.100 [192.168.99.100] port 22.
debug1: connect to address 192.168.99.100 port 22: Connection timed out
ssh: connect to host 192.168.99.100 port 22: Connection timed out

答案1

经过大量的挖掘和键盘敲击,我发现在 FORWARD 链上直接使用以下丰富的规则将使 ssh 连接成功。更聪明的人可能会提供更优雅的解决方案。

sudo firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i ens224 -o ens192 -p tcp --sport 22 -j ACCEPT
sudo firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i ens192 -o ens224 -p tcp --dport 22 -j ACCEPT

答案2

这篇文章/问题的重要性怎么估计都不过分。事实上,这种情况通常发生在这样的设置中:我们在 Linux 路由器后面有一个私有 (NAT-ed) 网络,其中私有网络中的一些机器被分配了公共 IP 地址。

换句话说,我们有:

[pc's with local 10.0.0.0/24, and some public 20.0.0.0/24] > --- [router with 10... and 20... address on internal side]---WAN

ens224因此,路由器(OP)的“内部”接口有两个 IP,即10.0.0.120.0.0.1。现在,masquerade: yes在出口处ens192有 是不方便的,因为它会掩盖来自接口的公共 IP 地址的数据包的真实来源20.0.0.0/24,并且可以用以下类型的直接规则替换:

firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.0.0.0/24 -j MASQUERADE

但问题的核心是,一旦我们启用firewalld它,它就会开始充当......好吧......防火墙。也就是说,它将检查所有ens192入站所有ens224入站数据包。在没有直接规则的情况下,如接受的答案所示,数据包将被拒绝,并提供详细的解释(CentOS 7):

  • 在路由器上(tcpdumpICMP host 20.0.0.2 unreachable - admin prohibited
  • 在外部对等体上(telnet 20.0.0.2 22Unable to connect to remote host: No route to host

除非有人提出更好的规则,否则 OP 提供的解决方案似乎是最优雅的,但确实非常详细:

  • 所有到内部网络所选端口的流量必须通过以下直接规则明确允许: firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i ens192 -o ens224 -p tcp --dport 22 -j ACCEPTfirewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i ens192 -o ens224 -p tcp --dport 80 -j ACCEPT (等等)
  • 所有从内部网络(在我的情况下是从网络20.0.0.0/24)出站的流量都必须明确允许;这里我使用 firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i ens224 -j ACCEPT

我们(或者至少是我)在这里缺少的是定义基于 IP 范围的“区域”的可能性,以便只允许将出站流量发送到选定的端口。我不知道这是否有可能firewalld

相关内容