摘要
-
firewalld的基本使用介绍
-
本文基于CentOS8(x86_64)
防火墙firewalld
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| systemctl stop firewalld.service
systemctl start firewalld.service
systemctl disable firewalld.service
systemctl enable firewalld.service
sudo firewall-cmd --state
sudo firewall-cmd --get-default-zone
sudo firewall-cmd --list-all
sudo firewall-cmd --list-services
sudo firewall-cmd --add-service=https
sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload
sudo firewall-cmd --remove-service=vnc-server --permanent sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
sudo firewall-cmd --add-port=80/tcp --permanent sudo firewall-cmd --reload
sudo firewall-cmd --remove-port=80/tcp --permanent sudo firewall-cmd --reload
sudo firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="10.8.1.8" port port="22" protocol="tcp" accept' sudo firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="10.8.1.0/24" port port="22" protocol="tcp" accept' sudo firewall-cmd --reload
sudo firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="10.8.1.8" port port="22" protocol="tcp" reject' sudo firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="10.8.1.0/24" port port="22" protocol="tcp" reject' sudo firewall-cmd --reload
sudo firewall-cmd --list-rich-rules
|
iptables
-
虽然centos8以后默认使用firewalld,但并非说iptables就失效了,只是firewalld对iptables进行了封装。
-
firewalld 默认 backend 是 nftables(但支持切换回 iptables backend)
-
你执行 iptables 命令时,系统实际上可能会把它转译给 nftables backend
-
另外,很多应用(如 docker、k8s)依旧调用 iptables 命令行工具
-
虽然firewalld是iptables的上层封装,但某些命令还是可以直接调用iptables,比如查看5大内置表,当然也可以使用ntf命令进行查看。
| 表名 |
主要用途 |
常用链 |
| filter |
默认表,做包过滤、防火墙规则 |
INPUT、OUTPUT、FORWARD |
| nat |
做地址转换(NAT) |
PREROUTING、POSTROUTING、OUTPUT |
| mangle |
修改包(标记、TTL、TOS等) |
PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD |
| raw |
控制连接跟踪(conntrack)是否启动 |
PREROUTING、OUTPUT |
| security |
用于SELinux等安全上下文标记 |
INPUT、OUTPUT、FORWARD |
1 2 3 4 5 6 7 8 9 10 11
| iptables -nvL iptables -nvL -t nat iptables -nvL -t mangle iptables -nvL -t raw iptables -nvL -t security
nft list table ip filter nft list table ip nat nft list table ip mangle nft list table ip raw nft list table ip security
|
启动与关闭
CentOS 8 默认没有 iptables.service。直接执行 iptables 只改当前内核里的规则,重启后消失。要开机自动加载,安装 iptables-services。它和 firewalld 写的是同一套内核规则,两个服务同时开会互相覆盖。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| sudo dnf install -y iptables-services
sudo systemctl stop firewalld sudo systemctl disable firewalld
sudo systemctl start iptables sudo systemctl enable iptables sudo systemctl status iptables
sudo systemctl stop iptables sudo systemctl disable iptables
sudo systemctl start ip6tables sudo systemctl enable ip6tables
|
CentOS 8 上的 iptables 命令默认走 nftables 后端,iptables -V 里能看到 nf_tables。保存和恢复仍用下面的 iptables-save、iptables-restore。
配置文件
| 文件 |
内容 |
/etc/sysconfig/iptables |
IPv4。iptables.service 启动和重启时用它恢复规则 |
/etc/sysconfig/ip6tables |
IPv6。对应 ip6tables.service |
运行中用命令改过的规则不会自己写回文件。
1 2 3 4 5 6 7 8 9 10 11
| ls -l /etc/sysconfig/iptables /etc/sysconfig/ip6tables
sudo iptables-save > /etc/sysconfig/iptables sudo chmod 600 /etc/sysconfig/iptables
sudo service iptables save
sudo iptables-restore < /etc/sysconfig/iptables
|
安装 iptables-services 时,这两个文件一般会一并放好。如果目录里没有,又没有现成规则可保存,可以新建一份 filter 表:放行已建立的连接、本机回环和 SSH,其余进入本机的包拒绝。SSH 不是 22 时,先改 --dport,再重启服务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| sudo tee /etc/sysconfig/iptables >/dev/null <<'EOF' *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT EOF sudo chmod 600 /etc/sysconfig/iptables sudo systemctl restart iptables
|
IPv6 没有文件时,用 sudo ip6tables-save > /etc/sysconfig/ip6tables 生成。
端口
规则按顺序匹配。链的最后一条如果已经是 REJECT,再用 -A 追加的放行排在它后面,不会生效。放行用 -I,插到 REJECT 前面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| sudo iptables -L INPUT -n -v --line-numbers
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT sudo iptables -I INPUT -p udp --dport 53 -j ACCEPT
sudo iptables -I INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT sudo iptables -I INPUT -p udp -m multiport --dports 53,123 -j ACCEPT
sudo iptables -I INPUT -p tcp -m multiport --dports 80,443,8000:9000 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 8000:9000 -j ACCEPT
sudo iptables -I INPUT -p tcp -s 10.8.1.8 --dport 22 -j ACCEPT sudo iptables -I INPUT -p tcp -s 10.8.1.0/24 --dport 22 -j ACCEPT
sudo iptables -D INPUT 3
sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 23 -j REJECT
sudo service iptables save
|
只清掉 filter 表里的规则、保留三条链的默认策略:
默认策略已经是 DROP 时,-F 之后新进来的包会被丢掉。执行前用 iptables -L 看一下 policy。
后记