天天看点

Linux中的火墙:firewall和iptables

所谓防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的边界上构造的保护屏障.是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使Internet与Intranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用户的侵入,防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成,防火墙就是一个位于计算机和它所连接的网络之间的软件或硬件。该计算机流入流出的所有网络通信和数据包均要经过此防火墙。

在网络中,所谓“防火墙”,是指一种将内部网和公众访问网(如Internet)分开的方法,它实际上是一种隔离技术。防火墙是在两个网络通讯时执行的一种访问控制尺度,它能允许你“同意”的人和数据进入你的网络,同时将你“不同意”的人和数据拒之门外,最大限度地阻止网络中的黑客来访问你的网络。换句话说,如果不通过防火墙,公司内部的人就无法访问Internet,Internet上的人也无法和公司内部的人进行通信。

百度百科:防火墙:https://baike.baidu.com/item/防火墙/52767?fromtitle=firewall&fromid=9705392&fr=aladdin

在Red Hat发行的linux版本中,我们用到的防火墙有两种,一种为firewall,一种为iptables。

下面我们将对两种火墙都做说明:

【firewall:】

yum search firewalld  ###安装
systemctl stop iptables 停止iptables
systemctl start firewalld 开启火墙
           
Linux中的火墙:firewall和iptables

firewall-config ###图形查看域

下来了解一些关于火墙的基础指令:

firewall-cmd 
	--state    ###状态
	--get-active-zones   ###正在使用的域
	--get-default-zone   ###默认的域
	--get-zones          ###支持的域
	--zone=public --list-all   ###public域的设定
	--get-services       ###支持的所有可以直接使用的服务
	--list-all-zones     ###所有域的设定
	--set-default-zone=dmz   ###更改正在使用的域,和改默认的域是一样
           
Linux中的火墙:firewall和iptables
firewall-cmd --permanent --zone=internal --add-source=172.25.254.250     
###在internal域中允许所有250来源的数据包【例如250pc使用ssh访问】
firewall-cmd --permanent --zone=internal --remove-source=172.25.0.0/24     ###删除internal域中的172.25.0.0网段的所有来源数据包权限
firewall-cmd --permanent --zone=internal --add-interface=eth0    ###给某个域添加eth0接口
firewall-cmd --permanent --zone=internal --change-interface=eth0    ###直接改变eth0接口的所在域
firewall-cmd --permanent --zone=internal --remove-interface=eth0    ###移除internal域中的eth0接口
--permanent 为永久性更改,重起服务后依旧生效
           

下 面 来 演 示 一 下 s o u r c 的 使 用 , 允 许 通 过 某 一 i p 的 数 据 包 : \color{blue}{下面来演示一下sourc的使用,允许通过某一ip的数据包:} 下面来演示一下sourc的使用,允许通过某一ip的数据包:

需要两台pc,一台服务器,一台客户端。

1.服务器配置双网卡,每个网卡都有一个IP

Linux中的火墙:firewall和iptables

2.服务器上下载并开启httpd,firewalld,http默认发布文件中写入内容

yum install http firewall -y
systemctl start httpd
systemctl start firewalld
vim /var/www/html/index.html  ###随便写入内容,方便查看
           
Linux中的火墙:firewall和iptables

我们可以用firewall-cmd --list-all查看现在的域设置:

Linux中的火墙:firewall和iptables

通过添加客户端IP到trustd域中,以达到让特定的用户可以访问。【访问控制】

Linux中的火墙:firewall和iptables
Linux中的火墙:firewall和iptables

在客户端进行测试:

配置好网络,浏览器输入服务器IP:

Linux中的火墙:firewall和iptables

下 面 来 演 示 一 下 更 改 接 口 到 t r u s t e d 域 , 使 单 一 网 卡 I P 段 可 以 被 访 问 : \color{blue}{下面来演示一下更改接口到trusted域,使单一网卡IP段可以被访问:} 下面来演示一下更改接口到trusted域,使单一网卡IP段可以被访问:

我们将双网卡的服务器,一个网卡加入到trusted域中,并改变该网卡上的IPv的IP为其他网段:

Linux中的火墙:firewall和iptables

我们将客户端的IP改为和eth1为同一网段的IP,再进行访问:

Linux中的火墙:firewall和iptables

客户端在浏览器上访问:

Linux中的火墙:firewall和iptables
firewall-cmd --reload    ###当ssh已经连接后不会断开
firewall-cmd --complete-reload    ###会断开已经建立的ssh连接

在/etc/firewalld/zones 中查看当前域的配置。
	可以直接在文件中更改域设定
	old文件会恢复火墙临时更改前的状态
/lib/firewalld/services/中有各个服务的配置文件
/lib/firewalld/zones 为函数,调用ssh时会使用
           

D i r e c t 规 则 【 使 单 一 的 某 个 P C 可 以 s s h 连 接 】 \color{blue}Direct 规则 【使单一的某个PC可以ssh连接】{} Direct规则【使单一的某个PC可以ssh连接】

-s 来源

-p 协议

–dport来源端口

-j动作 ACCEPT【接受】 REJECT【拒绝,有响应,客户端会不再访问】 DROP【丢弃,没有响应,客户端会一直访问,加大服务器负载压力】

firewall-cmd --list-all  ###有ssh服务
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -s 172.25.254.12 -p tcp --dport 22 -j ACCEPT  
 ###添加策略,允许12使用22端口的ssh
firewall-cmd --remove-service=ssh   ##当前域移除ssh服务
firewall-cmd --list-all
用12去ssh该pc,再用其他ip主机去ssh该pc,发现只有12可以连接
           
Linux中的火墙:firewall和iptables
Linux中的火墙:firewall和iptables
firewall-cmd --direct --get-all-rules   ##查看当前策略
firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -s 172.25.254.14 -p tcp --dport 22 -j ACCEPT
移除已有的ipv4 filter INPUT 1 -s 172.25.254.12 -p tcp --dport 22 -j ACCEPT 策略
firewall-cmd --direct --get-all-rules
再用12去连接,也无法连接
           
Linux中的火墙:firewall和iptables

firewall-cmd --direct --add-rule ipv4 filter INPUT 1 ! -s 172.25.254.12 -p tcp --dport 22 -j ACCEPT ###除了12,其他都可以连接

Linux中的火墙:firewall和iptables

下面实验前,先移除之前的配置,将环境还原。

Linux中的火墙:firewall和iptables

地址伪装和端口转发:

Linux中的火墙:firewall和iptables

首先地址伪装,外网172.25.254网段主机需要借助我们双网卡主机来连接到内网的1.1.1网段pc上。【线路1】

双网卡服务端:

firewall-cmd --permanent --add-masquerade  ###
firewall-cmd --reload
sysctl -a | grep ip_forward
如果ip_forward=0,则需要vim /etc/sysctl.conf【将net.ipv4.ip_forward的值改为1】【添加一行:net.ipv4.ip_forward=1】
           
Linux中的火墙:firewall和iptables
Linux中的火墙:firewall和iptables

172.25.254.12测试端:

设置网关为双网卡服务器的172.25.254.200

ping 1.1.1.200

ping 1.1.1.1

Linux中的火墙:firewall和iptables

这样我们地址伪装就完成了,手绘图的线路1即完成。下面进行端口转发:

firewall-cmd --add-forward-port=port=22:proto=tcp:toport=22:toaddr=1.1.1.1
###端口转发到1.1.1.1
firewall-cmd --list-all 
           
Linux中的火墙:firewall和iptables

测试端:172.25.254.12主机:访问双网卡服务器的172.25.254.200时,会自动跳转为远处服务器1.1.1.1上。

Linux中的火墙:firewall和iptables

在后续的iptables中,我们会继续了解线路2的内容

iptables:

IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或

LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。

iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该工具并安装使用它。

systemctl stop firewalld
systemctl start iptables
           

正式介绍iptables之前,我们先了解一下三表五列:

三表:nat表,filter表,mangle表

五列:/input/output/forward/postrouting/prerouting

一些列只在单独的表中有,mangle表为附加表

Linux中的火墙:firewall和iptables

iptables

参数 含义
-t 指定表名称
-n 不做解析
-L 列出指定表中的策略
-A 增加策略
-p 网络协议
–dport 端口
-s 数据来源
-j 动作
ACCEPT 允许
REJECT 拒绝
DROP 丢弃
-N 增加链
-E 修改链名称
-X 删除链
-D 删除指定策略
-I 插入
-R 修改策略
-P 修改默认策略
iptables  -t filter -nL		#查看filter表中的策略   【不加-t和表的时候默认查看filter表】
iptables  -F			#刷掉filter表中的所有策略,当没有用-t指定表名称时默认是filter表【相当于删除】
service iptables save		#保存当前策略到/etc/sysconfig/iptables
iptables -A INPUT -i lo -j ACCEPT	#允许lo  【回环接口】
iptables -A INPUT -p tcp --dport 22 -j ACCEPT	##允许访问22端口
iptables -A INPUT -s 172.25.254.250 -j ACCEPT	##允许250主机访问本机所有端口
iptables -A INPUT -j REJECT 			##拒绝所有主机的数据来源
iptables -D INPUT 3    ###删除默认表INPUT列中的第三条策略
iptables -I INPUT  -p tcp --dport 80  -j REJECT	##插入策略到INPUT中的第一条
iptables -I INPUT 2 -s 172.25.254.250 -p tcp --dport 22  -j REJECT ###插入策略拒绝250访问22端口到input第二条
iptables -R INPUT 1 -p tcp --dport 80 -j ACCEPT	##修改第一条策略
iptables -R INPUT 2 -s 172.25.254.250 -j REJECT ##修改第二条策略为REJECT
iptable -P INPUT DROP		##把INPUT表中的默认策略改为drop
           
Linux中的火墙:firewall和iptables
Linux中的火墙:firewall和iptables

策略的读取是按顺序读取,当第一条拒绝策略被读取后,后面的允许策略则失效:

Linux中的火墙:firewall和iptables
Linux中的火墙:firewall和iptables
iptables -F 刷掉设置的策略后
iptables -P INPUT DROP  更改默认策略为DROP
用172.25.254.12主机去ssh服务器172.25.254.200
会一直处于连接等待状态,也不报错连接失败。【访问直接被丢弃】
           
Linux中的火墙:firewall和iptables

常用的iptables指令如上所述。下面我们来实现nat表的地址转换

nat表:做地址转换

测试机:172.25.254.12

双网卡主机:172.25.254.200 1.1.1.200

远端:1.1.1.1

【功能:】

172.25.254.12ssh172.25.254.200,会通过1.1.1.200网卡自动连接到1.1.1.1这台主机上。

1.1.1.1这台主机无法直接传输数据ping到172.25.254.12,需要端口伪装,将其伪装为172.25.254.200,然后可以传输数据【ping】到172.25.254.12

在双网卡服务器上:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-dest 1.1.1.198:22   
 ###IP为目的地地址【做地址转发】  
用14主机ssh199,ifconfig,会发现连接到的是198

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.199    
 ###ip为双网卡的172段
用1.1.1.198ping172.25.254.14 ,可以ping通
           
Linux中的火墙:firewall和iptables
Linux中的火墙:firewall和iptables

注意:1.1.1.1这台主机上需要设置网关,否则数据可能无法经过1.1.1.200发送至172.25.254.200再发送回172.25.254.12

Linux中的火墙:firewall和iptables
 大大的小小阳
           

继续阅读