Monday, September 15, 2014

[CentOS 7] 防火牆設定

CentOS 7 預設不用iptables了, 而是改用firewalld.
因此設定的方式已經整個不同.


不過iptables還是可以用yum裝回來, 使用方式就跟之前一樣了:
yum install iptables system-config-firewall-tui setuptool


那麼採用新的firewalld, 好處在哪裡?
iptables是直接把rule餵給kernel, 所以有變動都意味著要清除舊有的rule, 再載入新的rule. 這可能會中斷已開啟的連線.
但是firewalld只會送出有變動的部分, 所以通常來說, 已開啟的連線不會被影響.

firewalld的設定檔現在是儲存在 /usr/lib/firewalld 與 /etc/firewalld 裡面的XML檔案, 所以需要設定工具.
firewalld有圖形介面的設定工具, 叫firewall-config
但是原則上我們還是介紹文字介面工具, firewall-cmd

在firewalld裡面, 是把網路分成幾個區域 (zone).

然後針對zone去設定過濾規則.

我們先看預設設定:

[root@c7 ~]# firewall-cmd --get-active-zones
public
  interfaces: eth0 eth1

所以目前兩個網卡都是被指定在public(對外區域).

然後看看預設public區域的規則:
[root@c7 ~]# firewall-cmd --zone=public --list-all
public (default, active)
  interfaces: eth0 eth1
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:



所以public zone開了DHCP跟SSH服務, 沒有指定port, 沒有限制連線來源, 也沒有開啟NAT功能.
DHCP我沒有在用, 所以移掉:

[root@c7 ~]# firewall-cmd --zone=public --remove-service dhcpv6-client

success

因為eth0是內網, 所以我想把eth0改到trusted(信任區域):
[root@c7 ~]# firewall-cmd --zone=trusted --add-interface=eth0
Error: ZONE_CONFLICT

這是因為eth0已經在public zone, 所以要先把eth0從public zone移除, 再加到trsuted zone:

[root@c7 ~]# firewall-cmd --zone=public --remove-interface=eth0
success
[root@c7 ~]# firewall-cmd --zone=trusted --add-interface=eth0
success

或是用change-interface, firewalld會幫你做好:
[root@c7 ~]# firewall-cmd --zone=public --change-interface=eth0
success

檢查一下設定是不是正確:
[root@c7 ~]# firewall-cmd --get-active-zones
public
  interfaces: eth1
trusted
  interfaces: eth0

最後, 開啟NAT功能:)
[root@c7 ~]# firewall-cmd --zone=public --add-masquerade
success

firewalld也支援"rich-rules", 也就是更詳細的規則設定
這個後面另外再寫一篇來介紹.

這些設定都是runtime的, 也就是說只在下了指令後生效, 並不會被儲存.
如果要儲存的話, 需要在指令後面加上 --permanent, 才會儲存.
儲存後的rule, 可以reload service來載入:
systemctl reload firewalld

注意: 這裡有一個點, 文件也只有輕輕帶過, 那就是firewall-cmd的zone interface設定, 即使下了--permanent 也不會被儲存, 需要管理者自己去編輯
/etc/sysconfig/network-scripts/ifcfg-(NetworkManager Profile Name)
在裡面加上:
ZONE=(firewalld zone name)
目前看來應該只有文字介面的firewalld有這個問題, GUI介面的firewall-config不會.
(CentOS Bug Tracker: 0007407)

另外, firewalld的介面名稱, 不能是NetworkManager的Profile名稱, 而必須是網路介面的裝置名稱.

最後, 如果你在架設service時發現連到localhost daemon都會有問題的時候, 可以試著把default zone設成trusted看看.
firewall-cmd --set-default-zone=trusted
這個指令一定是permanent的, 所以不用另外寫.
當然要記得把外部的interface設在public喔, 不然這樣一搞變成不設防XD

No comments: