2019年4月9日 星期二

在 CentOS 7 使用 firewalld 架設 NAT

整理舊資料時,發現iptables的資料,但是Centos 7 已經改用 firewalld 了,所以尋找網路上相關的資料。


第一篇
https://becoder.org/centos7-firewalld-nat-server/
架設 NAT 需要有兩個網路孔,一個負責 WAN,一個負責 LAN,先修改網卡的 zone 分別為   External (WAN) 跟 Internal (LAN),我的 ens33 負責 WAN,ens34 負責 LAN。

# nmcli c mod ens34 connection.zone internal
# nmcli c mod ens33 connection.zone external


然後確認一下有沒有成功
# firewall-cmd --get-active-zone
WAN 設定 IP masquerad,其實我不太懂這是什麼意思,似乎是 IP 偽裝。

# firewall-cmd --zone=external --add-masquerade --permanent
# firewall-cmd --zone=internal --add-masquerade --permanent
# firewall-cmd --reload

檢查一下 ip fordwarding 是否啟用,如果啟用的話結果為 1

# cat /proc/sys/net/ipv4/ip_forward

通過 WAN 的 port 22/tcp 轉發到 WAN 本身的  port 9487/tcp

# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=9487
# firewall-cmd --list-all --zone=external


通過 WAN 的 port 22/tcp 轉發到 192.168.0.31

# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=22:toaddr=192.168.0.31
# firewall-cmd --list-all --zone=external

允許封包轉送

# firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o ens33 -j MASQUERADE
# firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i ens34 -o ens33 -j ACCEPT
# firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i ens33 -o ens34 -m state --state RELATED,ESTABLISHED -j ACCEPT
# firewall-cmd --reload

重新讀取防火牆設定後,NAT 就完成了。
這一篇沒說明和public的關係

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

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

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

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


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

這些設定都是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不會.

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

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

第三篇 https://blog.gtwang.org/linux/centos-7-firewalld-command-setup-tutorial/2/
這裡有更完整的介紹

補充
預設情況下 centos並不允許IP轉送
所以要修改 /etc/sysctl.conf 中的
net.ipv4.ip_forward = 0
把0改成1
然後執行
sysctl -p /etc/sysctl.conf 
讓此設定生效
 
 
 


沒有留言:

張貼留言