跳到主要内容

防火墙使用


firewalld(不好用)

1.列出所有的区域模版

firewall-cmd --list-all-zones

2.列出所有区域的名字

firewall-cmd --get-zones

3.列出当前使用的区域

# 列出详细信息
firewall-cmd --list-all
# 仅列出名字
firewall-cmd --get-default-zone

4.操作指定区域

# --zone=区域名字
# 列出docker区域的详细信息
firewall-cmd --zone=docker --list-all

5.控制端口

# --permanent 永久生效 要配合--reload使用
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
# 关闭80端口
firewall-cmd --permanent --remove-port=80/tcp
firewall-cmd --reload

# 立即生效 但不会持久化
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --remove-port=80/tcp

6.查询端口是否开放

# 查询80端口
firewall-cmd --query-port=80/tcp

7.添加服务

# 添加ntp服务
firewall-cmd --add-service=ntp
# 添加http服务
firewall-cmd --add-service=http 与 firewall-cmd --add-port=80/tcp 效果类似
# 添加https服务
firewall-cmd --add-service=https

iptables(推荐)

基础概念

  • 容器:瓶子 罐子 存放东西
  • (table):存放的容器,防火墙的最大概念
  • (chain):存放规则的容器
  • 规则(policy):准许或拒绝规则,未来书写的防火墙条件就是各种防火墙规则

执行过程

image-20240907095403283

image-20240907094920819

表与链

  • iptables 是 4 表 5 链
  • 4 表:filter 表 nat 表 raw 表 mangle 表
  • 5 链接:INPUT,OUTPUT,FORWARD,PREROUTINGPOSTROUTING
  • PREROUTING pre...之前
  • POSTROUTING post...之后
  • image-20240907104957849

每个表说明

  1. filter 表

    • 实现防火墙功能:屏蔽或准许 端口 ip


      INPUT 负责过滤所有目标地址是本机地址的数据包 通俗的说:就是进入主机的数据包(能否让数据包进入服务器)

      FORWARD 路过:负责转发流经主机的数据包。起到转发的作用,和 NAT 关系很大

      OUTPUT 处理所有源地址是本机地址的数据包 通俗的说:就是处理从主机发出去的数据包

  2. nat 表

    • 实现 nat 功能

    • 实现共享上网(内网服务器上外网)

    • 端口映射和 ip 映射

      image-20240907101547067


      OUTPUT 和主机放出去的数据包有关,改变主机发出数据包的目的地址

      PREROUTING 在数据包到达防火墙时,进行路由判断之前执行的规则,作用时改变数据包的目的地址、目的端口等,可以理解为收信时根据规则重写收件人的地址

      POSTROUTING 在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址、源端口等,可以理解为写好发件人的地址,回信时能有地址可回

安装 iptables 服务,方便通过 systemctl 控制

# redhat系
yum install -y iptables-services
systemctl start iptables.service
# 配置文件路径
/etc/sysconfig/iptables


# debian系
apt-get install iptables-persistent
systemctl start iptables
# 配置文件路径
/etc/iptables/rules.v4
/etc/iptables/rules.v6

写入到开机自启动

# 基于原来文件追加
cat >>/etc/rc.local<<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF

# 写法2
cat <<EOF>>/etc/rc.local
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF

# 给予文件执行权限
chmod +x /etc/rc.local

基本指令

# 清空iptables
iptables -F

# 清空自定义链(Docker...)
iptables -X

# 清空链的计数器(数据包计数器与数据包字节计数器)
iptables -Z

# 查看当前防火墙规则(默认是filter表)
iptables -nL --line-number

# 切换到其它表查看 如nat表 通过-t指定
iptables -nL -t nat

# (默认规则默认是ACCEPT)修改默认规则为 DROP 要最后修改,修改前确保连接里面的22端口打开,否则会失联
iptables -P INPUT DROP

image-20240908104424537

image-20240908103814339

image-20240908110445046

# 屏蔽ip192.168.123.8的机器访问本机
iptables -t filter -I INPUT -s 192.168.123.8 -j DROP
# 取消
iptables -D INPUT 1



# 屏蔽网段
iptables -t filter -I INPUT -s 192.168.123.0/24 -j DROP



# 禁止192.168.123.8 访问22端口 即禁用该ip通过ssh连接
# -t 指定表
# -I 在第1位置插入规则,一般用于禁用
# INPUT 在INPUT链
# -s 源端口
# -p 协议
# --dport 目标端口
# -j DROP 满足之后的处理
iptables -t filter -I INPUT -s 192.168.123.8 -p tcp --dport 22 -j DROP



# 只允许特定网段访问(类似白名单)
iptables -t filter -I INPUT ! -s 192.168.123.0/24 -j DROP

# 开放多个端口可访问80,443
# -m multiport 多端口的
iptables -t filter -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT
# 连续端口
iptables -t filter -A INPUT -p tcp --dport 1000:1005 -j ACCEPT



# 禁止ping
iptables -t filter -I INPUT -p icmp --icmp-type 8 -j DROP
# 通过内核参数禁止被ping 编辑/etc/sysctl.conf
# 添加参数
net.ipv4.icmp_echo_ignore_all=1
# 让参数生效
sysctl -p

image-20240908155551707

image-20240908161255002


规则保存与恢复

image-20240908163703313

# 保存
iptables-save > /etc/sysconfig/iptables
# 恢复
iptables-restore < /etc/sysconfig/iptables

image-20240908175917042

常用配置

# 清除规则
iptables -F

# 开放22端口,允许ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 开放本机环回数据流通
iptables -A INPUT -i io -j ACCEPT
iptables -A OUTPUT -o io -j ACCEPT

# 开放80,443
iptables -A INPUT -m multiport -p tcp --dport 443,80 -j ACCEPT

# 开放特殊网段
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT

# 放行tcp连接状态
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# 开启白名单模式DROP
iptables -P INPUT DROP

# 保存
iptables-save

nat 表的使用

  • 共享上网(SNAT)
# 通过将客户端发送的包伪装为防火墙公网地址从而共享上网
# -t nat 修改nat表
# -A POSTROUTING 在POSTROUTING链添加规则
# -s 将192.168.123.0/24 的ip 都进行 SNAT 地址转换
# --to-source 转为防火墙的公网地址10.0.0.61
iptables -t nat -A POSTROUTING -s 192.168.123.0/24 -j SNAT --to-source 10.0.0.61
# 针对防火墙的公网ip可能会变的情况,可以使用 -j MASQUERADE 伪装ip自动获取防火墙的地址
iptables -t nat -A POSTROUTING -s 192.168.123.0/24 -j MASQUERADE
  • 端口转发(DNAT)

image-20240908214849040

# 公网的用户如果想要访问到内网的设备 可以通过端口转发
# 将目标端口改为内部的ip
# -A PREROUTING 在PREROUTING链添加规则
# -d 目标ip为10.0.0.61
# -dport 目标端口为9000
# --to-destination 都转发到 192.168.123.8:443
iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp -dport 9000 -j DNAT --to-destination 192.168.123.8:443