防火墙使用
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):准许或拒绝规则,未来书写的防火墙条件就是各种防火墙规则
执行过程


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

每个表说明
-
filter 表
-
实现防火墙功能:屏蔽或准许 端口 ip
INPUT 负责过滤所有目标地址是本机地址的数据包 通俗的说:就是进入主机的数据包(能否让数据包进入服务器)
FORWARD 路过:负责转发流经主机的数据包。起到转发的作用,和 NAT 关系很大
OUTPUT 处理所有源地址是本机地址的数据包 通俗的说:就是处理从主机发出去的数据包
-
-
nat 表
-
实现 nat 功能
-
实现共享上网(内网服务器上外网)
-
端口映射和 ip 映射

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



# 屏蔽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


规则保存与恢复

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

常用配置
# 清除规则
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)

# 公网的用户如果想要访问到内网的设备 可以通过端口转发
# 将目标端口改为内部的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