14 iptables基础知识

1. iptables介绍

1.1 iptables是什么

iptables是开源的基于数据包过滤的防火墙工具。

1.2 iptables企业应用场景

  1. 主机防火墙(filter表的INPUT链)
  2. 局域网共享上网(nat表的POSTROUTING链)。半个路由器,NAT功能。
  3. 端口及IP映射(nat表的PREROUTING链),硬防的NAT功能。
  4. IP一对一映射。

1.3 商用防火墙品牌

- Juniper    思科     华为     H3C  中兴   奇安信
- 天融信     深信服   绿盟科技  启明星辰  网康  飞塔   金盾

2. iptables工作流程

  1. 防火墙规则从上往下依次匹配
  2. 防火墙规则只要匹配上,就不再往下进行
  3. 如果都没匹配上,最后匹配默认规则
  4. 默认规则默认是放行所有

3. iptables四表五链

3.1 表与链的关系

Filter表 :过滤数据包,放行或拒绝,不会对数据包进行修改

  • INPUT
  • FORWARD
  • OUTPUT

NAT表:改写数据包

  • PREROUTING 改写的是目标端口目标IP
  • OUTPUT
  • POSTROUTING 改写的是源IP和源端口

本质就是不同的表和链处于不同的位置

3.2 数据包格式

  • 源IP
  • 源端口
  • 目标IP
  • 目标端口

4. iptables环境准备

4.1 安装iptables管理工具

yum install iptables-services -y

4.2 加载防火墙模块

modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

4.3 查看已经加载的模块

lsmod |egrep 'filter|nat|ipt'

4.4 启动防火墙

# 首先停止firewalld
systemctl stop firewalld
systemctl disable firewalld

# 开启iptables
systemctl start iptables.service
systemctl enable iptables.service

5. iptables实战

5.1 禁止200机器访问本机的22端口

源IP: 10.0.0.200
源端口: xxx
目标IP: 10.0.0.100 
目标端口: 22
执行的动作:禁止

执行命令:
iptables -I INPUT -p tcp -s 10.0.0.200 --dport 22 -j DROP

[参数解释]

  • -I 在防火墙的第一条上添加规则
  • -P tcp 指定协议是tcp
  • -s 匹配源IP
  • --dport 匹配目标端口
  • -j DROP 执行的操作 DROP(拒绝) ACCEPT(接收)

[验证]

第二台机器操作:
ping 10.0.0.100  可以通
curl 10.0.0.100  可以访问
ssh  10.0.0.100  不能访问

[思考]

iptables -I INPUT -p tcp -s 10.0.0.200 --dport 22 -j ACCEPT

5.2 完全禁止某个IP访问

源IP: 10.0.0.200
源端口: xxx
目标IP: 10.0.0.100 
目标端口: xxx
执行的动作:禁止

执行命令:
iptables -I INPUT -p tcp -s 10.0.0.200 -j DROP

[验证]

第二台机器操作:
ping 10.0.0.100  可以通
curl 10.0.0.100  不能访问
ssh  10.0.0.100  不能访问

[思考]

为什么可以ping通? 因为ping命令是ICMP协议

5.3 禁止除了某个IP以外的地址访问某个端口(只允许某个IP访问某个端口)

源IP: 除了10.0.0.200
源端口: xxx
目标IP: 10.0.0.100 
目标端口: 80
执行的动作:禁止

操作命令:
iptables -I INPUT -p tcp ! -s 10.0.0.200 --dport 80 -j DROP

[中文解释]

如果访问的端口是80并且他的IP地址不是200那么拒绝掉 是and条件只有全部满足才执行动作

10.0.0.1   ---> 22端口	 可以访问
10.0.0.1   ---> 80端口     访问不了
10.0.0.200 ---> 22端口     可以访问
10.0.0.200 ---> 80端口     可以访问 

5.4 禁止200这个IP访问22和80端口

源IP: 10.0.0.200
目标端口: 22,80
执行的动作:禁止

操作命令:
iptables -I INPUT -p tcp -s 10.0.0.200 -m multiport --dport 22,80 -j DROP

[测试]

10.0.0.1   ---> 22端口	 可以访问
10.0.0.1   ---> 80端口   可以访问
10.0.0.200 ---> 22端口   访问不了
10.0.0.200 ---> 80端口   访问不了 

5.5 禁止所有主机ping(不包含自己)

iptables -I INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j DROP

#等同于
iptables -I INPUT ! -i lo -p ICMP --icmp-type 8 -j DROP

5.6 放行某个IP可以ping

iptables -A INPUT ! -s 10.0.0.200 -p icmp --icmp-type 8 -j DROP

5.7 除了10.0.0.200以外,其他都可以ping

iptables -A INPUT -s 10.0.0.200 -p icmp --icmp-type 8 -j DROP

6. 企业案例

6.1 安全策略

  • 黑名单 ------> 默认大部分人没问题
  • 白名单 ------> 默认认为所有人都有问题

6.2 部署一个安全的防火墙

场景:服务器
最小开放哪些端口?对谁开放?
80	:不限制
443	:不限制
22	:只对windows这个电脑开放10.0.0.1
ping:禁止外面的人ping

[配置命令]


[测试]

10.0.0.1   ---> 22端口	 不通
10.0.0.1   ---> 80端口   可以访问
10.0.0.1   ---> ping     不通

10.0.0.200 ---> 22端口   可以访问
10.0.0.200 ---> 80端口   可以访问
10.0.0.1   ---> ping     可以访问  

7. 防坑指南

  1. 如果默认规则为DROP,然后不小心使用了-F,那么会导致没有IP可以连接进入了,物理服务器只能去机房
  2. 如果服务是高可用的,并且iptables没有写入配置文件,那么直接重启服务器即可还原
  3. 为了避免把自己关在外面,测试防火墙的时候,提前写一条crontab,内容是定时恢复默认规则
    */5 * * * * iptables -P INPUT ACCEPT
  4. 或者不修改默认规则,自己在最后添加一条禁止所有的规则,这样当iptables -F的时候就会清空了,不会把自己关在外面
    iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
    等价于
    iptables -P INPUT DROP
  5. 测试环境测试好之后,再应用到生产服务器

8. iptables命令总结

# 1.查看防火墙规则
iptables -nL

# 2.插入规则
iptables -I 	
iptables -A 

# 3.清除规则
iptables -F
iptables -X
iptables -Z 

# 4.删除某条规则
iptables -nL --line-numbers
iptables -D INPUT 3

# 5.修改默认防火墙规则
iptables -P INPUT DROP 

# 6.备份恢复
iptables-save > iptables_20201209
iptables-restore < iptables_20201209
iptables-save > /etc/sysconfig/iptables

=======================================================================================================================================

1.禁止某个IP访问
数据包分析: db02访问db01的22端口
源端口: 22
源IP: 10.0.0.52
目标端口:22
目标IP:10.0.0.51

规则命令1:
iptables -I INPUT -s 10.0.0.52 -j DROP

规则解释:
-I INPUT #在INPUT链第一条插入
-s 10.0.0.52 #匹配的数据包源地址
-j DROP #匹配后执行的动作 ACCEPT DROP

规则命令2:
iptables -I INPUT -p tcp -s 10.0.0.52 -j DROP

规则解释:
-p tcp #匹配tcp协议

2.禁止某个IP访问我的某个端口
规则命令1:
iptables -I INPUT -s 10.0.0.52 -p tcp --dport 22 -j DROP

规则解释:
--dport 22 #匹配访问目标端口是22的数据包

规则命令2:
iptables -I INPUT -s 10.0.0.52 -p tcp -m state --state NEW --dport 22 -j DROP
iptables -I INPUT -s 10.0.0.52 -p tcp -m state --state ESTABLISHED --dport 22 -j DROP

规则解释:
-m state --state ESTABLISHED #匹配TCP协议的连接状态

3.禁止除了某个IP以外的地址访问某个端口(只允许某个IP访问某个端口)
应用场景:只允许跳板机的内网IP登陆SSH

iptables -I INPUT ! -s 10.0.0.52 -p tcp --dport 22 -j DROP

规则解释:
! -s 10.0.0.52 #匹配除了52以外所有的IP地址

4.禁止某个IP访问22和80端口
iptables -I INPUT -s 10.0.0.52 -p tcp -m multiport --dport 22,80 -j DROP

规则解释:
-m multiport #匹配多个端口
--dport 22,80

5.禁止某个IP访问22-100之间的所有端口
iptables -I INPUT -s 10.0.0.52 -p tcp --dport 22:100 -j DROP

规则解释:
--dport 22:100 #匹配22到100之间所有的端口

6.禁止所有主机ping(不包含自己)
iptables -I INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
等同于
iptables -I INPUT ! -i lo -p ICMP --icmp-type 8 -j DROP

命令解释:
-i lo #匹配哪个网卡的流量

7.放行某个IP可以ping
iptables -A INPUT ! -s 10.0.0.52 -p icmp --icmp-type 8 -j DROP

8.除了某个IP以外,其他都可以ping
iptables -A INPUT -s 10.0.0.52 -p icmp --icmp-type 8 -j DROP

第6章 企业案例
1.安全策略
黑名单 默认大部分人没问题
白名单 默认认为所有人都有问题

2.部署一个安全的防火墙
场景:lb服务器
最小开放哪些端口?对谁开放?
80 :不限制
443 :不限制
22 :只对跳板机开放
10051 :对内
224.0.0.18 :对内

最佳实践:
按照服务访问的频次,频次最高的服务规则放在上面
443 :不限制
80 :不限制
224.0.0.18 :对内
10051 :对内
22 :只对跳板机开放

操作命令:
iptables -F
iptables -X
iptables -Z

iptables -A INPUT -p tcp -m multiport --dport 443,80 -j ACCEPT
iptables -A INPUT -p tcp -s 172.16.1.61 --dport 10051 -j ACCEPT
iptables -A INPUT -p tcp -s 172.16.1.61 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT
iptables -A OUTPUT -o eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT
iptables -P INPUT DROP

实验环境:
iptables -F
iptables -X
iptables -Z

iptables -A INPUT -p tcp -m multiport --dport 8080,80 -j ACCEPT
iptables -A INPUT -p tcp -s 172.16.1.53 --dport 9090 -j ACCEPT
iptables -A INPUT -p tcp -s 172.16.1.53 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

3.局域网共享上网
应用场景:
db02没有外网IP,只能通过db01才能上网

内网机器的IP包:
源端口 :
目标端口 :443
源IP :172.16.1.52
目标IP :100.1.1.1
网关: 172.16.1.51

改造的IP包:
源端口 :
目标端口 :443
源IP :10.0.0.51
目标IP :100.1.1.1

防火墙配置命令:
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p

iptables -F
iptables -X
iptables -Z
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.51

内网机器eth1配置:
[root@db02 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=eth1
UUID=0f9c0547-954c-4c9c-bf72-43810e653189
DEVICE=eth1
ONBOOT=yes
IPADDR=172.16.1.52
PREFIX=24
GATEWAY=172.16.1.51
DNS1=10.0.0.2

验证访问:
ssh 172.16.1.52
ip a
ping www.baidu.com
curl -I www.baidu.com

4.端口映射-来自深圳脱产3期-雷大神&涛哥解决方案
iptables -t nat -A PREROUTING -d 10.0.0.51 -p tcp -m tcp --dport 9000 -j DNAT --to-destination 172.16.1.52:22
iptables -t nat -A POSTROUTING -p tcp -m tcp -d 172.16.1.52 --dport 22 -j SNAT --to-source 172.16.1.51

5.IP映射
ip a add 10.0.0.55/24 dev eth0 label eth0:0
iptables -t nat -A PREROUTING -d 10.0.0.52 -j DNAT --to-destination 172.16.1.51

第7章 保存与恢复
iptables-save 打印出当前生效的配置
iptables-save > 20200319_iptables
iptables-restore < 20200319_iptables
iptables-save > /etc/sysconfig/iptables

第8章 iptables防坑指南
1.如果默认规则为DROP,然后不小心使用了-F,那么会导致没有IP可以连接进入了,物理服务器只能去机房了
2.如果服务是高可用的,并且iptables没有写入配置文件,那么直接重启服务器即可还原
3.为了避免把自己关在外面,测试防火墙的时候,提前写一条crontab,内容是定时恢复默认规则
*/5 * * * * iptables -P INPUT ACCEPT
4.或者不修改默认规则,自己在最后添加一条禁止所有的规则,这样当iptables -F的时候就会清空了,不会把自己关在外面
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
等价于
iptables -P INPUT DROP
5.测试环境测试好之后,再应用到生产服务器

第9章 ansible管理iptables

  • hosts: web
    tasks:
    • name: iptables flush nat
      iptables:
      table: nat
      chain: '{{ item }}'
      flush: yes
      with_items: [ 'INPUT', 'OUTPUT', 'PREROUTING', 'POSTROUTING' ]
      become: yes

    • name: Insert a rule on line 5
      iptables:
      chain: INPUT
      protocol: tcp
      source: 10.0.0.52
      destination_port: '22'
      ctstate: ESTABLISHED
      jump: ACCEPT
      action: insert

    • name: Forward port 80 to 8600
      iptables:
      table: nat
      chain: PREROUTING
      in_interface: eth0
      protocol: tcp
      match: tcp
      destination_port: '9000'
      jump: DNAT
      to_destination: '172.16.1.52:22'
      become: yes

    • name: save
      shell: "iptables-save > /etc/sysconfig/iptables"

第x章 iptables命令总结
1.查看防火墙规则
iptables -nL

2.插入规则
iptables -I
iptables -A

3.清除规则
iptables -F
iptables -X
iptables -Z

4.删除某条规则
iptables -nL --line-numbers
iptables -D INPUT 3

5.修改默认防火墙规则
iptables -P INPUT DROP

6.备份恢复
iptables-save
iptables-restore

posted @ 2020-12-09 20:13  Mn猿  阅读(171)  评论(0编辑  收藏  举报