Router

Centos 7 路由器和防火牆

  • June 3, 2019

我正在嘗試使用 firewalld 設置 CentOS 7 VM,以在 2 個不同子網之間路由流量。

我有 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

經過一番探勘和敲擊鍵盤,我發現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

這個文章/問題的重要性不能被高估。事實上,這種情況通常出現在我們在 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

路由器(OP)的“內部”介面ens224因此有兩個 ip,比如10.0.0.120.0.0.1。現在,masquerade: yes在出口上使用ens192是不方便的,因為它會掩蓋來自具有20.0.0.0/24地址的介面的公共 IP 的數據包的真實來源,並且可以用以下直接規則代替:

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 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

引用自:https://serverfault.com/questions/835246