iptables防火墙
熟悉 iptables 框架
iptables 的 4 个表(区分大小写)::
表 | 名称 |
---|---|
raw | 跟踪状态表 |
mangle | 包标记表 |
nat | 地址转换表 |
filter | 过滤表 |
iptables 的 5 个链(区分大小写):
链 | 名称 |
---|---|
INPUT 链 | 入站规则(进入防火墙内的包) |
OUTPUT 链 | 出站规则(出去防火墙的包) |
FORWARD 链 | 转发规则(处理经过防火墙的包) |
PREROUTING 链 | 路由前规则(在路由之前直接转发) |
POSTROUTING 链 | 路由后规则(经路由之后,读过目标地址后转发) |
目标操作:
ACCEPT:允许通过/放行
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过,必要时会给出提示
LOG:记录日志,然后传给下一条规则
操作 | 备注 |
---|---|
ACCEPT | 允许通过/放行 |
DROP | 直接丢弃,不给出任何回应 |
REJECT | 拒绝通过,必要时会给出提示 |
LOG | 记录日志,然后传给下一条规则 |
//注意事项与规律:
//可以不指定表,默认为filter表
//可以不指定链,默认为对应表的所有链
//如果没有找到匹配条件,则执行防火墙默认规则
//选项/链名/目标操作用大写字母,其余都小写
iptables查看和删除
常用管理选项
选项 | 描述 |
---|---|
-I | 在链的开头或指定序列插入一条规则 |
-L | 出所有的规则条目 |
-n | 以数字的形式显示地址,端口信息 |
–line-number | 查看规则时,显示规则序列号 |
-D | 删除链内指定序列号的规则 |
-F | 清空所有规则 |
-P | 为指定的链设置默认规则 |
基本匹配
选项 | 用法 |
---|---|
协议匹配 | -p |
协议名地址匹配 | -s 源地址 , -d 目标地址 |
接口匹配 | -i 收数据的网卡, -o 发数据的网卡 |
端口匹配 | –sport 源端口 , --dport 目标端口 |
ICMP类型匹配 | –icmp-type , ICMP类型 |
iptables 命令的基本使用方法
1)iptabels 语法格式
[root@proxy ~]# iptables [-t 表名] 选项 [链名] [条件] [-j 目
标操作]
[root@proxy ~]# iptables -t filter -I INPUT -p icmp -j
REJECT
[root@proxy ~]# iptables -t filter -I INPUT -p icmp -j
ACCEPT
[root@proxy ~]# iptables -I INPUT -p icmp -j REJECT
//注意事项与规律:
//可以不指定表,默认为 filter 表
//可以不指定链,默认为对应表的所有链
//如果没有找到匹配条件,则执行防火墙默认规则
//选项/链名/目标操作用大写字母,其余都小写
##################################################################
//目标操作:
// ACCEPT:允许通过/放行
// DROP:直接丢弃,不给出任何回应
// REJECT:拒绝通过,必要时会给出提示
// LOG:记录日志,然后传给下一条规则
2)iptables 命令的使用案例
创建规则的案例:
[root@proxy ~]# iptables -t filter -A INPUT -p tcp -j
ACCEPT
//追加规则至 filter 表中的 INPUT 链的末尾,允许任何人使用 TCP 协议访问本机
[root@proxy ~]# iptables -I INPUT -p udp -j ACCEPT
//插入规则至 filter 表中的 INPUT 链的开头,允许任何人使用 UDP 协议访问本机
[root@proxy ~]# iptables -I INPUT 2 -p icmp -j ACCEPT
//插入规则至 filter 表中的 INPUT 链的第 2 行,允许任何人使用 ICMP 协议访问本机
查看 iptables 防火墙规则:
[root@proxy ~]# iptables -nL
INPUT //仅查看 INPUT 链的规则
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
[root@proxy ~]# iptables -L INPUT --linenumbers //查看规则,显示行号
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT tcp -- anywhere anywhere
删除规则,清空所有规则:
[root@proxy ~]# iptables -D INPUT 3
//删除 filter 表中 INPUT 链的第 3 条规则
[root@proxy ~]# iptables -nL
INPUT //查看规则,确认是否删除
[root@proxy ~]# iptables -F
//清空 filter 表中所有链的防火墙规则
[root@proxy ~]# iptables -t nat -F
//清空 nat 表中所有链的防火墙规则
[root@proxy ~]# iptables -t mangle -F
//清空 mangle 表中所有链的防火墙规则
[root@proxy ~]# iptables -t raw -F
//清空 raw 表中所有链的防火墙规则
设置防火墙默认规则
[root@proxy ~]# iptables -t filter -P INPUT DROP
[root@proxy ~]# iptables -nL
Chain INPUT (policy DROP)
… …
filter 过滤和转发控制
步骤一: iptables 防火墙规则的条件
类别 选项 用法
通用匹配 协议匹配 -p 协议名称
地址匹配 -s 源地址、 -d 目标地址
接口匹配 -i 接受数据的网卡、-o 发送数据的网卡
隐含匹配 端口匹配 --sport 源端口号、 --dport 目标端口号
ICMP类型匹配 --icmp-type ICMP类型
1)主机型防火墙案例
[root@proxy ~]# iptables -I INPUT -p tcp --dport 80 -j REJECT
[root@proxy ~]# iptables -I INPUT -s 192.168.2.100 -j REJECT
[root@proxy ~]# iptables -I INPUT -d 192.168.2.5 -p tcp --dport 80 -j REJECT
[root@proxy ~]# iptables -I INPUT -i eth0 -p tcp --dport 80 -j REJECT
[root@proxy ~]# iptables -A INPUT -s 192.168.4.100 -j DROP //丢弃 192.168.4.100 发给本机的所有数据包
[root@proxy ~]# iptables -A INPUT -s 192.168.2.0/24 -j DROP //丢弃 192.168.2.0/24 网络中所有主机发送给本机的所有数据包
[root@proxy ~]# iptables -A INPUT -s 114.212.33.12 -p tcp --dport 22 -j REJECT //拒绝 114.212.33.12 使用 tcp 协议远程连接本机 ssh(22 端口)
步骤二:开启 Linux 的路由转发功能
[root@proxy ~]# echo 0 > /proc/sys/net/ipv4/ip_forward //关闭路由转发
[root@proxy ~]# echo 1 > /proc/sys/net/ipv4/ip_forward //开启路由转发
//注意以上操作仅当前有效,计算机重启后无效
[root@proxy ~]# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf //修改/etc/sysctl.conf 配置文件,可以实现永久有效规则
步骤三:禁 ping 的相关策略
1)默认直接禁 ping 的问题?
[root@proxy ~]# iptables -I INPUT -p icmp -j DROP
//设置完上面的规则后,其他主机确实无法 ping 本机,但本机也无法 ping
其他主机
//当本机 ping 其他主机,其他主机回应也是使用 icmp,对方的回应被丢弃
2)禁止其他主机 ping 本机,允许本机 ping 其他主机
[root@proxy ~]# iptables -A INPUT -p icmp \
> --icmp-type echo-request -j DROP
//仅禁止入站的 ping 请求,不拒绝入站的 ping 回应包
注意:关于 ICMP 的类型,可以参考 help 帮助,参考命令如下:
[root@proxy ~]# iptables -p icmp --help
防火墙扩展规则
扩展条件类型
MAC地址匹配 | -m mac --mac-source |
---|---|
多端口匹配 | -m multiport --dport 目标端口列表, -m multiport --sport 源目标端口 |
-m iprange --s | -m iprange --src-range ,-m iprange --dst-range |
根据 MAC 地址过滤
1)根据 IP 过滤的规则,当对方修改 IP 后,防火墙会失效
[root@proxy ~]# iptables -F
[root@proxy ~]# iptables -I INPUT -s 192.168.4.100 -p tcp --dport 22 -j DROP //设置规则禁止 192.168.4.100 使用 ssh 远程本机
但是,当client主机修改IP地址后,该规则就会失效,注意因为修改了IP,对client 主机的远程连接会断开,需要使用 virt-manager 开启虚拟机操作:
[root@client ~]# ifconfig eth0 192.168.4.101
[root@client ~]# ssh
192.168.4.5 //依然成功
根据 MAC 地址过滤,可以防止这种情况的发生
[root@client ~]# ip link show eth0 //查看 client 的 MAC 地址
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
state UP mode DEFAULT qlen 1000
link/ether 52:54:00:00:00:0b brd ff:ff:ff:ff:ff:ff
[root@proxy ~]# iptables -A INPUT -p tcp --dport 22\
> -m mac --mac-source 52:54:00:00:00:0b -j DROP
//拒绝 52:54:00:00:00:0b 这台主机远程本机
基于多端口设置过滤规则
1)一次需要过滤或放行很多端口时会比较方便
[root@proxy ~]# iptables -A INPUT -p tcp \
> -m multiport --dports 20:22,25,80,110,143,16501:16800 -j ACCEPT
//一次性开启 20,21,22,25,80,110,143,16501 到 16800 所有的端口
提示,多端口还可以限制多个源端口,但因为源端口不固定,一般不会使用,限
制多个源端口的参数是–sports.
1)允许从 192.168.4.10-192.168.4.20 登录
[root@proxy ~]# iptables -A INPUT -p tcp --dport 22 \
> -m iprange --src-range 192.168.4.10-192.168.4.20 -j ACCEPT
注意,这里也可以限制多个目标 IP 的范围,参数是--dst-range,用法与--srcrange 一致。
禁止从 192.168.4.0/24 网段其他的主机登录
[root@proxy ~]# iptables -A INPUT -p tcp --dport 22 -s 192.168.4.0/24 -j DROP
配置 SNAT 实现共享上网
nat表典型应用
模拟防火墙服务器:使4网段能访问2网段的web服务器
web服务器:192.168.4.51
proxy:192.168.4.52
192.168.2.52
client: 192.168.2.54
web服务器上:
]# systemctl stop NetworkManager 关闭网络设备的服务
]# route add default gw 192.168.2.52 配置添加网关指向防火墙服务器
]# route -n 查看网关
proxy防火墙服务器上:
]# echo 1 > /proc/sys/net/ipv4/ip_forward 开启路由功能
]# vim /etc/rc.local 将上命令写入配置文件,永久生效
]# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.4.52
]# iptables-save > /etc/sysconfig/iptables 将规则保存到配置文件
对于proxy外网IP不固定的情况可以执行下面的地址伪装,动态伪装IP
]# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -p tcp --dport 80 -j MASQUERADE