iptables 基础

iptables防火墙基础

概述

保护内部主机和内部网络的安全,通过过滤的方式对网络层的ip地址和端口进行处理

常见防火墙选用

硬件防火墙:ASA
软件防火墙:iptables(linux平台)

名称说明

名词 含义
容器 存放内容/存放东西
Netfiler/iptables Netfilter/iptables是表的容器
表(table) 表是用来存放链的容器
链(chain) 链存放规则的容器
规则(policy) 准许/拒绝访问

防火墙执行过程

  1. 防火墙的规则是一条一条进行匹配
  2. 无论是配置到拒绝(DROP)还是接受(ACCEPT)都是满足规则
  3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确指示
  4. 防火墙的默认规则是所有规则执行完才执行的
    image.png

四表五链

iptables的表:

按照不同功能来划分;

功能
Filter 过滤,默认的表,防火墙功能
NAT 实现NAT转化:1.共享上网 2.端口转发
mangle mangle表的规则可以对数据包进行修改,比如修改ttl值等;
raw 主要是为了提高效率使用的

iptables规则链

根据不同时机来划分链,在链中存放规则;

INPUT(入站)、OUTPUT(出站)、FORWARD(转发)、PREROUTING(路由前)、POSTROUTING(路由后)

表中默认包含链

四表五链.png

编写iptables 规则

语法

语法:iptables -t 表名 选项 链名 条件 -j 动作

编写规则语法注意:

省略表名,默认表示filter表,省略链名,表示表内所有链;
除非设置默认规则,否则必须设置匹配的规则;
选项、链名、动作必须大写,其他小写;

动作:对匹配的条件进行处理;

ACCEPT:允许
DROP:丢弃
REJECT:拒绝
LOG:日志

选项:对链中的规则进行增删改查操作;

 a.增加:-A链的末尾添加、-I 链的指定位置添加,需要指定序号(若不指定,默认作为第一条规则),例:-I INPUT 2
 
 b.删除:-D 删除一条规则,-F清空链内所有规则,例:iptables -D 链名 2
 
 c.查看:-L -n 查看规则,-L -n -v 查看更详细的信息,-L -n --line-number显示规则的序号(大写为选项,后边小写为子选项,	子选项需要跟在链名的后边)
 
 d.设置默认规则:-P 链名 DROP或ACCEPT

匹配条件:

a.通用匹配条件:
	-p 协议				##常用的协议ICMP、TCP、UDP协议;
	-s 源地址			   ##控制源地址访问,网段书写格式:192.168.1.0/24
	-d 目的地址			  ##控制目的地址访问
	-i 入站网卡名称		 ##控制传输数据的入站网卡
	-o 出站网卡名称		 ##控制传输数据的出站网卡
 注:编写规则时,需要判断主机数据的流向,如INPUT链只能用-i入站网卡;

b.隐含匹配条件:
	端口:-p 协议 --dport 目的端口
		  -p 协议 -sport 源端口

c.显式匹配条件:
	多端口:-m multiport -p tcp或udp --dports 端口号		##指定多个端口,若连续端口11:22,若不连续端口11,22
	mac地址:-m mac --mac-source MAC地址			##MAC地址中间用:隔开,指定的mac地址为源地址
	ip地址范围:-m iprange --src-range 192.168.1.1-192.168.1.10    ##指定的ip地址范围是源地址
	数据包的状态:-m state --state NEW,ESTABLISHED,RELATED	##三个选项分别表示,新建,已经建立的连接,已经相关,例:默认规则为DROP并且无允许ssh22号端口,但是允许已经建立的连接,ssh不会断开,ss命令查看当前的连接;

清空防火墙规则

iptables -F	//清空规则链中所有规则
iptables -X	//清空自定义链中所有规则
iptables -Z	//清空规则链中的数据包计算器和字节计数器
iptables -nL	//显示表中的规则,同时不把端口解析为服务名(默认filter表)

规则配置

#规则配置-禁止访问22端口
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP 
//这个添加该规则后,会自己也连接不上服务器。(立刻断开连接)

#封掉某个IP地址
iptables -I INPUT -s ***.***.***.*** -j DROP

#网段控制
iptables -t filter -A INPUT -p tcp ! -s 10.0.0.0/24 -j DROP   //只允许10.0.0.0网段访问

#禁止端口
iptables -I INPUT -p tcp  --dport 80 -j DROP		//封掉80端口

#禁止没有IP访问22端口
[root@hdss7-11 ~]# iptables -t filter -A INPUT -s 10.4.7.11 -p tcp --dport 22 -j DROP

#准许或禁止多个端口
iptables -I INPUT -p tcp --dport 1:1024 -j DROP  		//禁止1-1024端口
iptables -I INPUT -p tcp ! --dport 1:1024 -j DROP		//叹号、除了1-1024端口其他全禁
iptables -I INPUT -p tcp  --dport 1:1024 -j ACCEPT	//允许1-1024端口
iptables -I INPUT -p tcp -m multiport ! --dport 80,443,22 -j DROP 
//需要使用multiport模块、-m 指定指定扩展模块

保存防护墙规则

iptables-save >/etc/sysconfig/iptables		//将iptables规则导出
iptables-restore < /etc/sysconfig/iptables	//将iptables规则导入
#写的iptables命令是默认是临时生效的
#也可以直接在/etc/sysconfig/iptables文件中写入

防火墙规则实战

SNAT源地址转换

1.原理:在路由后链POSTROUTING将内网主机的ip地址转换成外网网卡的ip地址;
2.应用场景:共享内部主机上网,在网关主机上设置;

实验环境说明

主机A 外网IP: 10.4.7.200	内网IP: 172.16.1.200  主机名: HDSS7-200
主机B 无外网IP		       内网IP: 172.16.1.11	主机名: HDSS7-11

设置SNAT

HDSS7-200 操作

#开启路由转发功能
[root@hdss7-200 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1				//写入的内容,内核转发
[root@hdss7-200 ~]# sysctl -p		//检查是否写入

#编写SNAT规则
[root@hdss7-11 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.4.7.200

#保存规则
[root@hdss7-200 ~]# iptables-save >/etc/sysconfig/iptables

HDSS7-11 操作

# 将eth1网卡中的网关改入 172.16.1.200
[root@hdss7-11 ~]# grep "GATEWAY" /etc/sysconfig/network-scripts/ifcfg-eth1
GATEWAY="172.16.1.21"

#重启网卡
[root@hdss7-11 ~]# systemctl restart network

#访问测试
[root@hdss7-11 ~]# ping baidu.com
PING baidu.com (39.156.69.79) 56(84) bytes of data.
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=128 time=25.9 ms

其他说明

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.61  #公网ip固定
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source	MASQUERADE #伪装,公网IP不固定时使用

DNAT目的地址转换

原理:在路由前链PREROUTING将来自外网访问网关公网ip及对应端口的目的ip及端口修改为内部服务器的ip及端口,实现发布内网服务器;

应用场景:发布内网主机到公网

实验环境

访问m01的8080端口,映射到db01的22端口。(DNAT)

M01服务器:公网ip-10.0.0.61 内网ip-172.16.1.61 主机名-m01
db01服务器:公网ip-10.0.0.51 内网ip-172.16.1.51 主机名-db01

服务端m01操作

#01. 开启内核转发功能
[root@m01 ~]# echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf
[root@m01 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@m01 ~]# cat /proc/sys/net/ipv4/ip_forward

#02. 写入防火墙规则
[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 8080  -j DNAT --to-destination 172.16.1.51:22

#03. 查看防火墙规则
[root@m01 ~]# iptables -t nat -nL

客户端db01操作配置

#01. db01关掉公网网卡(eth0)
[root@db01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=no        //关闭eth0网卡
IPADDR=10.0.0.51
PREFIX=24
GATEWAY=10.0.0.254
DNS1=10.0.0.254

#02. 将db01内网ip的网关设置为m01的内网地址
[root@db01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
IPADDR=172.16.1.51
PREFIX=24
NAME=eth1
DEVICE=eth1
ONBOOT=yes
GATEWAY=172.16.1.61      //写入的内容

本地xshell测试连接

成功跳转到db01服务器的22端口

连接测试01

连接测试02

posted @ 2020-02-21 14:20  OneLpc  阅读(373)  评论(0编辑  收藏  举报