理论部分
- firewalld 以 zone 的区域分割观念来建立,并以动态设定方式执行避免中断的问题,不能同时执行 iptables 跟 firewalld ,因为会造成冲突错误
配置文件
相关路径
/etc/firewalld 设定档位置
/usr/bin/:firewall-cmd 指令所在的位置
/usr/lib/firewalld/:firewall预设的设定资料(xml格式)
/usr/bin/:firewall-cmd 指令所在的位置
/usr/lib/firewalld/:firewall预设的设定资料(xml格式)
defalut zone在文档中有指定
有关zone
- public:公开场所,不信任网域内所有连线,只有被允许的连线才能进入,一般只要设定这里就可以
- external:公开的场所,应该是IP是NAT的网络
- dmz:非军事区,允许对外连线,内部网络只有允许的才能进来
- work:公司、工作的环境
- home:家庭环境
- internal:内部网路,应用在NAT设定时的对内网络
- trusted:接受所有的连线
- drop:任何进入的封包都丢弃,只有出去的是允许的
- block:任何进入的封包全部拒绝,并以ICMP回复对方,只有对外的连线是允许的
--------------------------------------
预设主机是被放在public zone区域,并有开启两个服务dhcpv6-client ssh
在这样的预设下,任何来源都可以通过ssh服务连接到本机,但其他服务的service port都关闭
一些操作
显示目前的设定
# firewall-cmd --list-all
关闭DHCP服务
# sudo firewall-cmd --zone=public --remove-service dhcpv6-client
暂时开启DNS port 53
# sudo systemctl start named
# sudo systemctl enable named
# sudo firewall-cmd --add-service=dns
# sudo firewall-cmd --reload
# firewall-cmd --list-all
# sudo firewall-cmd --reload
# sudo vi /etc/firewalld/firewalld.conf 修改DefaultZone=dmz
# sudo firewall-cmd --reload
# sudo firewall-cmd --reload
# sudo firewall-cmd --list-all
# sudo firewall-cmd --list-all
当你下一次执行reload时候,设定会被取消
# sudo vi /etc/firewalld/services/http.xml
修改对应连接埠 port protocol="tcp" port="8080"
# sudo firewall-cmd --reload
address="192.168.12.9" port port="8080" protocol="tcp" accept"
这样的写法使用 # firewall-cmd --list-all是看不到的,要用 iptables -L -n
-A INPUT -s 140.113.12.9 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp -s 140.113.0.0/16 --dport 123 -j
ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp -s 140.114.88.0/24 --dport 161 -j ACCEPT
要转换到 firewalld 的 direct 规则:
新增 /etc/firewalld/direct.xml ,如果之前有执行过 # sudo firewall-cmd --permanent --direct ...则这个档案会自动生成
新增/修改 direct.xml 增加对应上面的 rules:
# sudo vi /etc/firewalld/direct.xml
<?xml version="1.0" encoding="utf-8"?>
<direct>
<rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-p tcp -s 192.168.12.9 --dport 22 -j ACCEPT</rule>
<rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-s 140.113.12.9 -j ACCEPT</rule>
<rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-p udp -s 140.113.0.0/16 --dport 123 -j ACCEPT</rule>
<rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-p tcp -s 140.114.88.0/24 --dport 161 -j ACCEPT</rule>
</direct>
# sudo firewall-cmd --zone=public --remove-service=http --permanent
# sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
# sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
# sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080
将 80 port 收到的讯息转往其他主机的
# sudo fierwall-cmd --zone="public" -add-forward-port=port=80:proto=tcp:toport=8080:to addr=140.113.1.1
永久开启DNS port 53
# sudo firewall-cmd --add-service=dns --permanent# sudo firewall-cmd --reload
如何修改主机的预设zone
前面说预设是public zone,但有些服务需要建立在DMZ下,我们可以透过修改 /etc/firewalld/firewalld.conf来将预设的zone改为DNZ# sudo vi /etc/firewalld/firewalld.conf 修改DefaultZone=dmz
# sudo firewall-cmd --reload
加入自行指定的连接埠
# sudo firewall-cmd --add-port=8080/tcp --permanent# sudo firewall-cmd --reload
# sudo firewall-cmd --list-all
设定暂时的rules
# sudo firewall-cmd --add-port=8888/tcp# sudo firewall-cmd --list-all
当你下一次执行reload时候,设定会被取消
修改服务的预设连接埠
# sudo cp /usr/lib/firewalld/services/http.xml /etc/firewalld/services 以Web为例# sudo vi /etc/firewalld/services/http.xml
修改对应连接埠 port protocol="tcp" port="8080"
# sudo firewall-cmd --reload
限制某服务只能从哪些IP进入
# sudo firewall-cmd --add-rich-rule="rule family="ipv4" sourceaddress="192.168.12.9" port port="8080" protocol="tcp" accept"
直接指定rule到INPUT chain
# sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp -s "192.168.12.9" --dport 22 -j ACCEPT这样的写法使用 # firewall-cmd --list-all是看不到的,要用 iptables -L -n
查看预设载入的rule
所有的zone设定档会放在 /etc/firewalld/zones和 /usr/lib/firewalld/zones/ ,你所执行的--permanent参数会放在 /etc/firewalld/zones 对应的zone档案里(如:public.xml)从 /etc/sysconfig/iptables 转为 firewalld 的 direct
假设原有的 /etc/sysconfig/iptables 有规则-A INPUT -s 140.113.12.9 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp -s 140.113.0.0/16 --dport 123 -j
ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp -s 140.114.88.0/24 --dport 161 -j ACCEPT
要转换到 firewalld 的 direct 规则:
新增 /etc/firewalld/direct.xml ,如果之前有执行过 # sudo firewall-cmd --permanent --direct ...则这个档案会自动生成
新增/修改 direct.xml 增加对应上面的 rules:
# sudo vi /etc/firewalld/direct.xml
<?xml version="1.0" encoding="utf-8"?>
<direct>
<rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-p tcp -s 192.168.12.9 --dport 22 -j ACCEPT</rule>
<rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-s 140.113.12.9 -j ACCEPT</rule>
<rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-p udp -s 140.113.0.0/16 --dport 123 -j ACCEPT</rule>
<rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-p tcp -s 140.114.88.0/24 --dport 161 -j ACCEPT</rule>
</direct>
从zone移除某项服务
# sudo firewall-cmd --zone=public --add-service=http --permanent# sudo firewall-cmd --zone=public --remove-service=http --permanent
# sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
# sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
port forward 将从某个port number的封包转送给另外的port或其他主机
将 80 port 收到的讯息转往 port 8080# sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080
将 80 port 收到的讯息转往其他主机的
# sudo fierwall-cmd --zone="public" -add-forward-port=port=80:proto=tcp:toport=8080:to addr=140.113.1.1