[总体比较]
相同点:
firewalld 与 iptables 都是 linux 中防火墙的管理程序,他们的作用都是用于维护规则,而真正的防火墙执行者是位于内核中的netfilter,只不过firewalld和iptables的结构以及使用方法不一样。
不同点:
1.iptables 仅能通过命令行进行配置;而 firewalld 提供了图形接口,类似windows防火墙的操作方式
2.iptables 每一个单独更改将清除所有旧的规则,并全部读取所有新的规则,会中断业务,而firewalld 在有规则变动后,可以仅仅应用修改的规则,其他规则不影响。
3.iptables 的配置文件在 /etc/sysconfig/iptables 中;而 firewalld 的配置文件在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件中
4.iptables 通过控制端口来控制服务,而 firewalld 则是通过控制协议来控制端口
5.iptables 没有守护进程,而 firewalld 有守护进程
[Iptables]
iptable工作数据流向图
- 网络数据包到达时,先走prerouting链,如果数据目的地是传给本机,则经过Input链,即:prerouting –> input
- 如果数据包目的地不是传给本机,则走forward链,然后由postrouting出去。即:prerouting –> forward –> postrouting
- 由本机用户进程/程序/服务发出的数据报文(主动发出或响应的报文): output –> postrouting
规则链
Input链: 对进入本机(即目的地址是本机)数据包的过滤
Output链: 对从本机出去(即源地址是本机)的数据包的过滤
forward链: 对仅仅通过本机转发(即源地址和目的地址都不是本机)的数据包进行过滤
prerouting链:对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
postrouting链:对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都由这个链处理)
规则表
四种:raw,mangle,nat,filter,优先级顺序为:Raw——>mangle——>nat——>filter
raw: 表中的规则可以被哪些链使用:prerouting,output
mangle:表中的规则可以被哪些链使用:prerouting,input,forward,output,postrouting
nat:表中的规则可以被哪些链使用:prerouting,output,postrouting(centos7中还有input,centos6中没有)
filter: 表中的规则可以被哪些链使用:input,forward,output
iptables的语法格式
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
##表名
raw mangle nat filter(不指定时默认)
##命令选项
-A 在指定链的末尾添加一条新的规则
-D 删除指定链中的某一条规则,可以按规则序号和内容删除
-I 在指定链中插入一条新的规则,默认在第一行添加
-R 修改、替换指定链中的某一条规则,可以按规则序号和内容替换
-L 列出指定链中所有的规则
-E 重命名用户定义的链,不改变链本身
-F 清空
-N 新建一条用户自己定义的规则链
-X 删除指定表中用户自定义的规则链
-P 设置指定链的默认策略
-Z 将所有表的所有链的字节和数据包计数器清零
-n 使用数字形式显示输出结果
-v 查看规则表详细信息(verbose)的信息
-V 查看版本(version)
-h 获取帮助(help)
##链名
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
##防火墙处理数据包的四种方式
ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给任何回应信息
REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
iptables使用及命令示例
1.centos7下默认是用的firewalld,需要停止与禁用firewalld,两个只能选一个
##停掉firewalld
systemctl stop firewalld
systemctl disable firewalld
#禁用firewalld服务
systemctl mask firewalld
#安装iptables
yum install -y iptables
#安装iptables-services
yum install -y iptables-services
#注册iptables服务,相当chkconfig iptables on
systemctl enable iptables.service
#启动服务
systemctl start iptables.service
#重启服务
systemctl restart iptables.service
#查看状态
systemctl status iptables.service
#保存规则
service iptables save
- 显示防火墙列表
iptables -L
iptables -L -n
iptables -L -n --line-number
- 增加端口访问规则(80和443示例,所有ip能访问)
#开放80端口(HTTP)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#开放端口示例
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
- 开放某个范围段内的端口
iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT
- 开放多个不连续的端口
iptables -A INPUT -p tcp -m state --state NEW -m multiport --dports 7001,8001,9001 -j ACCEPT
- 对192.168.56.1和192.168.56.102开放22端口
iptables -A INPUT -p tcp -s 192.168.56.1,192.168.56.102 --dport 22 -j ACCEPT
- 删除规则
#使用iptables -L -n --line-number 可以查看到每个规则chain 的序列号,只能这样才能删除指定的规则
iptables -L -n --line-number
#删除INPUT链中第9条规则
iptables -D INPUT 9
- linux端口映射,启用网卡转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8022 -j ACCEPT
iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 8022 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8022 -j DNAT --to-destination 192.168.60.206:22
iptables -t nat -A POSTROUTING -s 192.168.60.0/16 -d 192.168.60.206 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.60.62
- 本地端口转发
iptables -t nat -A PREROUTING -p tcp --dport 8022 -j REDIRECT --to-ports 22
iptables -t nat -A OUTPUT -d localhost -p tcp --dport 8022 -j REDIRECT --to-ports 22
iptables -t nat -A PREROUTING -d localhost -p tcp --dport 8022 -j REDIRECT --to-ports 22
- iptables保存到文件及从文件中恢复规则
iptables-save >xxx.txt ##保存文件xxx.txt
iptables-restore <xxx.txt ##加载规则
- 端口映射1
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --dport 18080 -j DNAT --to-destination 192.167.1.201:8080
iptables -t nat -A POSTROUTING -d 192.167.1.201 -p tcp --dport 8080 -j SNAT --to-source 192.167.1.204
- 端口映射2
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --dport 18080 -j DNAT --to-destination 192.168.60.133:8899
iptables -t nat -A POSTROUTING -d 192.168.60.133 -p tcp --dport 8899 -j SNAT --to-source 192.168.56.2
[Firewalld]
firewalld的基本使用
启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status firewalld 开机禁用 : systemctl disable firewalld 开机启用 : systemctl enable firewalld
配置firewalld-cmd
查看版本: firewall-cmd --version
查看帮助: firewall-cmd --help
显示状态: firewall-cmd --state
查看所有打开的端口: firewall-cmd --zone=public --list-ports
更新防火墙规则: firewall-cmd --reload
查看区域信息: firewall-cmd --get-active-zones
查看指定接口所属区域: firewall-cmd --get-zone-of-interface=eth0
拒绝所有包:firewall-cmd --panic-on
取消拒绝状态: firewall-cmd --panic-off
查看是否拒绝: firewall-cmd --query-panic
查看防火墙列表:firewall-cmd --list-all
firewalld的命令示例
- 开启一个端口
#添加
firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
#重新载入
firewall-cmd --reload
#查看
firewall-cmd --zone=public --query-port=80/tcp
#删除
firewall-cmd --zone=public --remove-port=80/tcp --permanent
- 开放端口(开放固定的ip访问):
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.1" port protocol="tcp" port="1080" accept"
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.56.1" port protocol="tcp" port="1080" accept"
- 批量开放端口
firewall-cmd --add-port 30000-40000/tcp --permanent
firewall-cmd --add-port 30000-40000/udp --permanent
- 配置文件位置
配置规则在以下文件中:more /etc/firewalld/zones/public.xml
- CentOS7系统配置firewalld使用NAT方法将网络共享给内部局域网机器
####开启NAT转发
firewall-cmd --permanent --zone=public --add-masquerade
####开放DNS使用的53端口,否则可能导致内网服务器虽然设置正确的DNS,但是依然无法进行域名解析。
firewall-cmd --zone=public --add-port=53/tcp --permanent
####重启防火墙
systemctl restart firewalld.service
#### 检查是否允许NAT转发
firewall-cmd --query-masquerade
#### 关闭NAT转发
firewall-cmd --remove-masquerade
开启后,局域网内的其他机器可以将默认网关设置为已开启 NAT 转发的服务器IP ,即可上网。
- 如何利用 CentOS 进行端口转发TCP+UDP协议转发
开启NAT(一辈子只需要执行一次)
firewall-cmd --add-masquerade --permanent
添加转发
1.开放TCP端口转发(本机端口31002转发到 10.0.1.2:3389)
firewall-cmd --add-forward-port=port=31002:proto=tcp:toport=3389:toaddr=10.0.1.2 --permanent
2.开放UDP端口转发(本机端口31002转发到 10.0.1.2:3389)
firewall-cmd --add-forward-port=port=31002:proto=udp:toport=3389:toaddr=10.0.1.2 --permanent
3.开放TCP和UDP端口(开放端口31002 的TCP和UDP)
firewall-cmd --add-port 31002/tcp --permanent
firewall-cmd --add-port 31002/udp --permanent
4.重载应用配置(配置完毕后必须进行这一步)
firewall-cmd --reload
其余操作
1.如果不生效检查一下 协议是否开启转发(编辑文件:/etc/sysctl.conf ),保存后执行:sysctl -p
net.ipv4.ip_forward = 1
3.查看所有映射情况
firewall-cmd --list-all
删除操作
1.如删除端口转发(40000端口转发到10.0.2.24的3389 TCP协议转发)
firewall-cmd --remove-forward-port=port=40000:proto=tcp:toport=3389:toaddr=10.0.2.24 --permanent