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

 

posted @ 2021-11-27 14:11  虞岩  阅读(441)  评论(0编辑  收藏  举报