iptables用法和介绍
参考视频:bilibili.com/video/BV12f4y1q73o?from=search&seid=11667345261719018642&spm_id_from=333.337.0.0
1.阿里云故障案例
搭建keepalived推出havip,19年无法使用
只能使用阿里云自己推出的slb负载均衡
2.阿里云的iptables防火墙 屏蔽/放行 端口 IP 都可以正常使用 iptables共享上网 端口转发/映射无法使用
阿里云NAT网关,可以实现iptables共享上网 端口转发/映射无法使用
3.阿里云云盾故障导致用户使用什么命令,云盾就删除什么命令
时刻备份好数据
防火墙一些名词
容器:存放东西
表(table):存放链的容器
链(chain):存放规则的容器
规则(policy):准许或拒绝规则
Netfilter 表(tables) 链(chain) 规则(policy)
一栋楼 楼里的房子 房子里的柜子 柜子里的衣服,摆放规则
一:iptables
1.iptables工作流程
1).防火墙是层层过滤的,实际是按照配置规则的顺序从上而下,从前到后进行过滤的
2).如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配新的规则
3).如果规则中没有明确表明是阻止还是通过,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过
4).防火墙的默认规则是所有规则执行完才执行的
注意:屏蔽规则都是放在最上面
2.表与链
简介:
iptables 是 4表五链
4表: filter表 nat表 raw表 mangle表
filter表: 负责过滤功能,防火墙;内核模块:iptables_filter
nat表: network address translation,网络地址转换功能;内核模块:iptable_nat
mangle表 拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw表: 关闭nat表上启用的连接追踪机制;iptable_raw
1)filter表
防火墙:屏蔽或允许端口 IP
filter表 强调:主要和主机自身有关,真正负责主机防火墙功能的(过滤流入流出的数据包) filter表示iptanles默认使用的表,这个表定义了三个链(chains)企业工作场景:主机防火墙
INPUT 负责过滤所有目标地址是本机地址的数据包 通俗来说:就是过滤主机的数据包
FORWARD 负责转发流经主机的数据包,起转发的作用,和NAT关系很大 LVS NAT模式,net.ipv4.ip_forward=0
OUTPU 处理所有源地址是本机地址的数据包 通俗讲:就是处理从主机发出去的数据包
2)nat表
实现nat功能
实现共享上网(内网服务器上外网)
端口映射
ip映射
nat 负责网络地址转换的,即来源与目的IP地址和port的转换
应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务相关
工作场景:
1.用于企业路由(zebra)或网关(iptables),共享上网(POSTROUTING)
2.做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务(PREROUTING)
3.WEB,单个端口的映射,直接映射80端口(PREROUTING)这个表定义了3个链,nat功能相当于网络的acl控制,和网络交换机acl类似
OUTPUT 和主机放出去的数据包有关,改变主机发出数据包的目的地址
PREROUTING 在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址,目的端口等(端口转发)
PORTROUTING 在数据包离开防火墙时,进行路由判断之后执行的规则,作用是改变数据包的目的地址,目的端口等
生产应用: 局域网共享上网
查看是否加载iptables相关模块到内核
[root@node1 ~]# lsmod | egrep 'filter|nat|ipt'
iptable_filter 16384 1
iptable_nat 16384 1
nf_nat 40960 2 iptable_nat,xt_MASQUERADE
nf_conntrack 147456 4 xt_conntrack,nf_nat,nf_conntrack_netlink,xt_MASQUERADE
ip_tables 28672 2 iptable_filter,iptable_nat
libcrc32c 16384 3 nf_conntrack,nf_nat,xfs
其中iptables_filter和iptables_nat为核心,缺少就无法使用
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# systemctl disable firewalld
然后开启iptables
[root@node1 ~]# systemctl start iptables
[root@node1 ~]# systemctl enable iptables
[root@node1 ~]# iptables -nL 说明:-n是把服务名字转换为端口,-L是列出,iptables默认是filter表
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
3.iptables命令参数
参数 含义
-L 显示表中的所有规则
-n 不要把端口或ip反向解析为名字
-t 指定表 不指定默认为filter表
-A append追加,加入准许类规则
-D delete删除 -D INPUT 1
-I insert拒绝类规则放在所有规则最上面 拒绝类
参数 含义
-p 协议protocal tcp/udp/icmp/all
--dport 目标端口 dest destination 指定端口加上协议-p tcp
--sport 源端口 source 源
-s --source 源ip
-d --destination 目标ip
-m 指定模块 multiport(指定多个端口)
-i input 输入的时候从哪个网卡进来
-o ouput 输出的时候从那个网卡出去
参数 含义
-j 满足条件后的动作:DROP/ACCEPT/REJECT
DROP PEJECT 都是拒绝
DROP 会把数据丢掉,不会返回信息给用户
PEJECT 拒绝 返回拒绝信息
参数 含义
-F flush 清除所有规则,不会处理默认规则
-X 删除用户自定义的链
-Z 链的计数器清零(数据包计数器与数据包字节计数器)
4.配置filter表规则
正式配置之前 先备份,再清空规则
[root@node1 ~]# iptables -F 清除所有规则,不会处理默认规则
[root@node1 ~]# iptables -X 删除用户自定义的链
[root@node1 ~]# iptables -Z 链的计数器清零(数据包计数器与数据包字节计数器)
[root@node1 ~]# iptables -nL 清空之后的样子,然后再进行配置
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
案例:禁止访问22端口
[root@node1 ~]# iptables -A INPUT -p tcp --dport 22 -j DROP
说明:-A 后面写链名(追加,允许类规则用A) INPUT是链名 -p是添加tcp协议 --dport是目标端口 -j就是说明后面是允许还是拒绝
-p 协议tcp/udp/icmp(ping命令拒绝访问)/all
--dport 目标端口,指定端口加上协议 -p tcp
--sport 源端口
查看iptables表的顺序
[root@node1 ~]# iptables -nL --line-number
[root@node1 ~]# iptables -D INPUT 1
说明:-D 后面写链名(删除类规则用D) 1是规则表的序号
5.屏蔽某个ip
[root@node1 ~]# iptables -I INPUT -s 192.168.20.22 -j DROP
说明:-I -s 后面加IP 由于禁止的是IP所以不需要加端口
[root@node1 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 192.168.20.22 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@node1 ~]# iptables -D INPUT 1 删除规则表的禁止192.168.20.21的这行
6.禁止某个网段连入(禁止192.168.20.0/24网段访问8888端口)
iptables -I INPUT -s 192.168.20.0/24 -p tcp --dport 8888 -j DROP
7.只允许某个网段连入(允许192.168.20.0网段)
allow 192.168.20.0/24;
deny all;
方法1:利用!进行排除
iptables -I INPUT ! -s 192.168.20.0/24 -j DROP
方法2:修改链默认规则,修改为拒绝"添加准许"
先配置好规则 准许规则
再修改默认规则
[root@node1 ~]# iptables -A INPUT -s 192.168.20.0/24 -j ACCEPT
说明:-A 后面写链名(追加,允许类规则用A)INPUT是链名 ACCEPT(允许的意思)
意思是说:防火墙规则允许192.168.20.0网段访问
然后再修改默认规则
[root@node1 ~]# iptables -P INPUT DROP
说明:-P是修改默认规则的参数,INPUT链内容就改为DROP
[root@node1 ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 192.168.20.0/24 0.0.0.0/0
ACCEPT all -- 192.168.10.0/24 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
8.匹配网络连接状态(TCP/IP连接状态)
-m state --state
NEW: 已经或将启动新的连接
ESTABLISHED:已经建立的连接
RELATED: 正在启动的新连接
INVALID: 非法或无法识别的连接
UNTRACKED: 表示报文未被追踪,无法找到
[root@node1 ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@node1 ~]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
9.拒绝多个端口访问
[root@node1 ~]# iptables -I INPUT -p tcp -m multiport --dport 2222,12306 -j DROP
说明:-m是指定模块 multiport是指定多个端口 2222,12306是指两个端口
[root@node1 ~]# iptables -I INPUT -p tcp -m multiport --dport 1024:2048 -j DROP
说明:1024:2048是指从1024端口到2048端口都拒绝访问
10.匹配ICMP
ICMP:控制报文协议 ping
一般用于禁ping
虽然被禁ping但不影响访问
方法1):通过防火墙禁ping
[root@node1 ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
说明:--icmp-type 8 icmp有很多类型 禁ping是第8个
方法2):通过修改内核禁ping
[root@node1 ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 临时修改
[root@node1 ~]# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all 恢复修改
将net.ipv4.icmp_echo_ignore_all=1 写入到/etc/sysctl.conf 永久修改
然后输入[root@node1 ~]# sysclt -p 使其生效
11.限制并发及速率
-m limit 限制模块
-m ;limt --limt 10/minute #每分钟只能有10个数据包,每秒6个
-m ;limt --limt n/{second/minute/hour}
说明:指定时间内的请求速率 'n'为速率,后面为时间分别为:秒 分 时
-m limit --limit 10/minute --limit-burst 5 #每6秒释放工牌 给别人使用
--limit-burst[n]
说明:在同一时间内允许通过的请求'n'为数字,不指定默认为5
案例:[root@node1 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT 先允许22端口
[root@node1 ~]# iptables -A INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
[root@node1 ~]# iptables -P INPUT DROP
12.防火墙规则的保护与恢复
iptables-save 默认输出到屏幕
iptables-restore
写入到/etc/sysconfig/iptables
案例:iptables-save > /etc/sysconfig/iptables 保存到文件中
iptables-restore < /etc/sysconfig/iptables 恢复防火墙策略
filter表小结
封IP 端口 网段
禁止ping
限制速度和并发
iptables filter表所有功能 可以在云服务器中使用
13.实际生产用法
iptables 配置方式
可以远程访问22端口
[root@node1 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@node1 ~]# iptables -A INPUT -p tcp -m multiport --dport 443,80 -j ACCEPT
[root@node1 ~]# iptables -A INPUT -s 192.168.20.0/24 -j ACCEPT
说明:这里还可以添加vpn网段 例:172.16.1.0/24
1)设置允许本机lo 通讯规则
允许本机回环lo接口数据流量流出与流入
[root@node1 ~]# iptables -A INPUT -i lo -j ACCEPT
[root@node1 ~]# iptables -I OUTPUT -o lo -j ACCEPT
[root@node1 ~]# iptables -P INPUT DROP
[root@node1 ~]# iptables -P FORWARD DROP
[root@node1 ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@node1 ~]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
二:nat
1:1)共享上网
[root@node1 ~]# iptables -t nat -A POSTROUTING -s 192.1683.20.0/24 -j SNAT --to-source 10.0.0.50(公网)
说明:修改的是POSTROUTING(数据包离开防火墙时)链 源地址为192.168.20.0/24 经过防火墙处理 修改为10.0.0.50(公网)
[root@node1 ~]# echo 'net.ipv4.icmp_echo_ignore_all = 0' >> /etc/sysctl.conf
[root@node1 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
2)端口映射/转发
[root@node1 ~]# iptables -t nat -A PREROUTING -d 10.0.0.50 -p tcp --dport 9001 -j DNAT --to-destination 192.168.20.21:22
3)IP转发
[root@node1 ~]# iptables -t nat -A PREROUTING -d 10.0.0.50 -p tcp -j DNAT --to-destination 192.168.20.21
2.nat故障排查
1)先看一下防火墙规则
iptables -t nat -nL
2)ip网关配置
查询网关ip r或者route -n
3)内核转发是否配置
在/etc/sysctl.conf文件中
net.ipv4.ip_forward = 1
echo '1' > /proc/sys/net/ipv4/ip_forward
4)nat表总结
实现共享上网(内网服务器上外网)
端口转发/映射
nat功能在云服务器上无法使用 替代品叫:NAT网关
三:总结
1.禁止来自10.0.0.188 IP地址访问80端口请求
iptables -I INPUT -s 10.0.0.188 -p tcp --dport 80 -j DROP
2.如何使命令在执行的时候永久生效?
iptables-save
/etc/sysconfig/iptables
3.实现把访问10.0.0.3:80的请求转到192.168.20.21:80
iptables -t nat -A PREROUTING -d 10.0.0.3 -P tcp --dport 80 -j DNAT --to-destination 192.168.20.21:80
4.实现192.168.20.0/24段所有主机通过1xx.3x.5x.2xx外网IP共享上网
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -j SNAT --to-destination 1xx.3x.5x.2xx
iptables -t nat -A PORTROUTING -s 192.168.20.0/24 -j SNAT MASQUERADE