Назад | Перейти на главную страницу

Маршрутизатор Centos 7 и firewalld

Я пытаюсь настроить виртуальную машину CentOS 7 с firewalld для маршрутизации трафика между двумя разными подсетями.

У меня есть 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

Из внутренней сети я могу получить доступ к внешней сети. А из внешней сети я могу пропинговать IP-адрес во внутренней сети. Однако я не могу подключиться по ssh к одному и тому же внутреннему IP-адресу из внешней сети, несмотря на то, что служба ssh включена в обеих зонах.

Я безуспешно пробовал несколько различных сложных правил / проходов. Не мог бы кто-нибудь быть так добр, чтобы направить меня в правильном направлении?

Спасибо.

РЕДАКТИРОВАТЬ:

Я удалил маршрут 10.212.21.26 и установил режим SELinux на разрешающий:

sudo ip ro del 10.212.21.26
sudo setenforce permissive

Я могу пинговать:

$ 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

После долгих поисков и поломки клавиатуры я обнаружил, что следующие прямые расширенные правила в цепочке 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

Важность этого поста / вопроса невозможно переоценить. Фактически, эта ситуация обычно возникает в настройке, где у нас есть частная (NAT-ed) сеть за маршрутизатором Linux, где некоторым машинам в частной сети были назначены общедоступные 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.1 и 20.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):

  • на роутере (tcpdump) ICMP host 20.0.0.2 unreachable - admin prohibited,
  • на внешнем узле (telnet 20.0.0.2 22) Unable 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 ACCEPT, firewall-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.