web-dev-qa-db-ja.com

firewall-cmdによるポート転送

サーバー上でいくつかのVMを実行しています(Virtual Machine Manager、VMM)。サーバーのポート80をいずれかのVMのポート80に転送したい。ホストはCentOS7を実行するため、firewalldが担当します。どうやら、firewalldは仮想接続を処理するためにVMMでも使用されているため、ウィンドウの外に捨てることはできません。

基本的に、私はすべてのコマンドを this スレッドで再現できませんでした。

firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.122.224

または

firewall-cmd --permanent --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=80 to-addr=192.168.122.224'

Firewalldの現在のステータスは次のとおりです。

[root@my-machine ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp8s0
  sources: 
  services: ssh dhcpv6-client samba smtp http
  ports: 25/tcp
  protocols: 
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
  rule family="ipv4" forward-port port="80" protocol="tcp" to-port="80" to-addr="192.168.xxx.xxx"

これはの出力です

iptables -L -n -v

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         
13917 8976K ACCEPT     all  --  *      virbr0  0.0.0.0/0               192.168.122.0/24     ctstate RELATED,ESTABLISHED
13539 2093K ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
4   240 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable <-----
1   133 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
0     0 ACCEPT     all  --  virbr1 virbr1  0.0.0.0/0            0.0.0.0/0           
0     0 REJECT     all  --  *      virbr1  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
0     0 REJECT     all  --  virbr1 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_direct  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_IN_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_IN_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_OUT_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_OUT_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID
0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-Host-prohibited

問題は、私のパッケージを拒否するように見える2番目のルールです(接続しようとすると、数が増えることがわかります)。確かに、私がそれを削除した場合:

iptables -D FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable

私のポート転送は機能します。何が欠けていますか?

1
Matteo Giani

Firewalldとlibvirtを混在させると、このような状況に陥ることがあります。

「NAT」ネットワークのデフォルトでは、libvirtのネットワーキングはマスカレードルールを設定して、VMがレガシーIPv4インターネットにアクセスできるようにします。ただし、libvirtは「NAT」ネットワークへのすべての着信接続をブロックします。

解決策は、ネットワークを通常のルーティングネットワークに変更してから、firewalldに必要なマスカレードを処理させることです。

たとえば、ネットワークXMLを編集して変更します

  <forward mode='nat'/>

  <forward mode='route'/>

all libvirt NATネットワークをルーティングするようにネットワークを変更することをお勧めします。このシナリオでは、ポートを転送したいネットワークだけでなく、ネットワークに互いに通信します。

次に、残りのインターネットに接続されているインターフェースに対応するfirewalldゾーンにマスカレードを設定します。例えば:

firewall-cmd [--permanent] --zone=public --add-masquerade

(firewalld 0.4.4.6以降では、これを使用しないでください。代わりに、IPv4マスカレード用のリッチルールを作成してください。これらのバージョンには、--add-masquerade、IPv6接続が切断されます。)

firewall-cmd [--permanent] --zone=public --add-rich-rule='rule family=ipv4 masquerade'
3
Michael Hampton