iptables 基础
iptables防火墙基础
概述
保护内部主机和内部网络的安全,通过过滤的方式对网络层的ip地址和端口进行处理
常见防火墙选用
硬件防火墙:ASA
软件防火墙:iptables(linux平台)
名称说明
名词 | 含义 |
---|---|
容器 | 存放内容/存放东西 |
Netfiler/iptables | Netfilter/iptables是表的容器 |
表(table) | 表是用来存放链的容器 |
链(chain) | 链存放规则的容器 |
规则(policy) | 准许/拒绝访问 |
防火墙执行过程
- 防火墙的规则是一条一条进行匹配
- 无论是配置到拒绝(DROP)还是接受(ACCEPT)都是满足规则
- 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确指示
- 防火墙的默认规则是所有规则执行完才执行的
四表五链
iptables的表:
按照不同功能来划分;
表 | 功能 |
---|---|
Filter | 过滤,默认的表,防火墙功能 |
NAT | 实现NAT转化:1.共享上网 2.端口转发 |
mangle | mangle表的规则可以对数据包进行修改,比如修改ttl值等; |
raw | 主要是为了提高效率使用的 |
iptables规则链
根据不同时机来划分链,在链中存放规则;
INPUT(入站)、OUTPUT(出站)、FORWARD(转发)、PREROUTING(路由前)、POSTROUTING(路由后)
表中默认包含链
编写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端口