Iptables 防火墙

35 篇文章 7 订阅


了解iptables的基本知识和工作原理
掌握基本的语法结构
掌握常见的iptables规则配置
能够根据需求对服务器进行iptables的基本配置

思考1:服务如何进行网络访问控制?
​ 配置文件、xinetd、tcp_wrappers(7层防火墙)
思考2:系统如何进行访问控制?
​ 防火墙

一、Iptables防火墙介绍

作用:
防火墙作为内部网和外部网之间的一种访问控制设备,常常安装在内部网络和外部网络的边界上。防火墙具有很好的网络安全保护作用,入侵者必须首先穿过防火墙的安全防线,才能接触目标计算机。可以将防火墙配置成许多不同保护级别。高级别的保护可能会禁止一些服务,如视频流等,但至少这是你自己的保护选择。

主要作用:
1、Internet防火墙可以防止Internet上的危险传播到网络内部
2、能强化安全策略
3、能有效记录Internet上的活动

Linux系统内核集成了网络访问控制的功能,通过netfilter模块来实现,是内核的一部分(内核空间)
用户层(用户空间)可以通过iptables程序对netfilter进行控制管理,进而实现网络的访问控制
TCP_Wrappers也是一个网络访问控制的一个工具,作用在应用层 7层防火墙
总结:
netfileter 模块 内核空间,是内核一部分
iptables组件 用户空间,提供管理防火墙的手段,它主要作用在传输层 4层防火墙

 

二、Iptables防火墙结构

总结:iptables是由表组成的,表是链的集合,链是规则的集合

四张表 ( 重点掌握 filter 和 nat )
filter:实现对数据包的过滤
[root@ceshi ~]# iptables -t filter -L
nat:地址转换功能(源地址和目标地址)
mangle:对数据包进行修改,例如给数据包打标记MARK
raw:主要是连接追踪

五条链
PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

[root@ceshi ~]# iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

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         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination  

 

三、防火墙工作原理(数据包流向)

一种是帮别人转发,另一种是流给我主机的
在这里插入图片描述在这里插入图片描述总结:iptables是由表组成的,表是链的集合,相应的链构成了对应的表,链是规则的集合

 

四、Iptables 基本语法


iptables [-t 表名] 命令选项 [链名] [规则号码] [条件匹配] [-j 目标动作]
      小写 大写  大写      小写    大写

说明:
表名和链名:用于指定iptables命令所操作的表和链
命令选项:用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等)
规则号码:用于指定规则的编号
条件匹配:用于指定对符合什么样条件的数据包进行处理(比如:什么协议、出入网卡等)
目标地址:用于指定数据包的处理方式(比如:允许处理、拒绝、丢弃等)

示例:
iptables -L    查看默认表(filter)
iptables -t filter -L    查看filter表
iptables -t nat -L
iptables -t raw -L
iptables -t mangle -L

iptables 的启动和关闭及保存

/etc/init.d/iptables start

//临时停止|启动|查看状态|重新加载|重新启动
service iptables stop|start|status|reload|restart
//开机是否自启动
chkconfig iptables off|on
//永久保存规则
vim /etc/sysconfig/iptables
...
增加规则

iptables [-t 表名] 命令选项 [链名] [规则号码] [条件匹配] [-j 目标动作]
      小写 大写  大写      小写    大写

iptables 常用的命令选项

常见的命令选项
-L                查看
-A                追加,放置在最后一条
-I                插入,默认插入成第一条
-D                删除
-F                清空flush
-P                设置默认策略policy      Chain xxx (policy ACCEPT)
-R				  覆盖

处理动作:
filter表:
-j ACCEPT     允许
-j DROP       丢弃,没有任何提示信息
-j REJECT     拒绝,有提示信息
-j LOG        写日志     /var/log/messages   然后将数据包传递给下一条规则

nat表:
-j SNAT           源地址转换 POSTROUTING
-j DNAT           目标地址转换 PREROUTING

1.Filter表

1.1 示例1:(全部允许/拒绝/丢弃)

iptables -t filter -A INPUT -j DROP     添加规则,丢弃所有进来的数据包
iptables -t filter -A INPUT -j ACCEPT   添加规则,允许所有进来的数据包

//指定位置插入规则,允许所有进来的数据包第1条规则
iptables -t filter -I INPUT 1 -j ACCEPT

iptables -t filter -A OUTPUT -j DROP    添加规则,丢弃所有出去的数据包

//指定位置插入规则,拒绝所有进来的数据包为第3条规则
iptables -t filter -I INPUT 3 -j REJECT

★iptables -t filter -L --line-numbers    查看规则编号
iptables -t filter -R INPUT 1 -j ACCEPT 覆盖已有规则

iptables -t filter -D INPUT 3   删除INPUT链的第3条规则
iptables -t filter -F   清空filter表的所有规则

iptables -A INPUT -j LOG    增加日志规则,必须先写日志,然后将数据包传递给下一条规则,不然直接就被拒绝了
iptables -I INPUT 2 -j DROP  因此把DROP 拒绝 , 放在第二条

iptables -t filter -P INPUT DROP    设置链上的默认规则   Chain INPUT (policy DROP)
iptables -D INPUT 1
❤说明:如果不指定表名,默认操作filter表
如:  iptables -L  是默认查看filter表

1.2.示例2:(根据源和目标地址匹配)

匹配的条件:
-s 192.168.134.0/24     源地址
-d 192.168.134.1        目标地址
-p tcp|udp|icmp         协议
-i lo       input 从lo接口进入的数据包
-o eth0     output 从eth0出去的数据包
-p tcp --dport 80   目标端口是80,必须和-p tcp|udp连用
-p udp --dport 53   目标端口是53/udp
iptables -t filter -A INPUT -s 10.1.1.3 -j ACCEPT   允许源地址为10.1.1.3进入
iptables -t filter -A INPUT ! -s 10.1.1.3 -j ACCEPT 不允许源地址为10.1.1.3进入
iptables -t filter -A IPPUT -s 10.1.1.3 -j DROP     拒绝源地址10.1.1.3进入
iptables -t filter -A OUTPUT -d 10.1.1.3 -j DROP    丢弃到达目标地址为10.1.1.3的包
iptables -t filter -A OUTPUT ! -d 10.1.1.3 -j ACCEPT 丢弃到达目标地址为10.1.1.3的包

iptables -t filter -A INPUT -d 10.1.1.2 -j DROP     丢弃所有到目标地址为10.1.1.2的包
iptables -t filter -A OUTPUT -s 10.1.1.2 -j ACCEPT  源地址为10.1.1.2出去的包全部允许

1.3.示例3:(根据协议匹配过滤)

iptables -t filter -A INPUT -p tcp -s 10.1.1.2 -j DROP
iptables -t filter -A INPUT -p tcp --dport 22 -s 10.1.1.2 -j DROP   拒绝ssh

iptables -A INPUT -s 10.1.1.3 -p icmp -j DROP
iptables -A INPUT -s 10.1.1.3 -p tcp -j DROP
iptables -A INPUT -s 10.1.1.3 ! -p tcp -j DROP

icmp协议中:
icmp-type 8 类型为8代表请求回显,ping 请求
icmp-type 0 类型为0代表回显应答,ping 应答


需求1:只允许自己ping通别人,不允许别人ping通自己(在policy DROP ❤前提下加规则)
iptables -t filter -P OUTPUT DROP   前提
iptables -t filter -P INPUT DROP    前提
iptables -L  查看前提设置好了没
iptables -t filter -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -t filter -A INPUT -P icmp --icmp-type 0 -j ACCEPT
解释:别人给自己发包,是ping请求,在INPUT 是8,OUTPUT 是 0才可以(要各自增加一条)
      因此别人访问不了


❤需求2:(input和output都是DROP情况下)
iptables -t filter -P OUTPUT DROP   前提
iptables -t filter -P INPUT DROP    前提

只允许自己和10.1.1.2相互ping通,其他人不能ping通自己,但是允许自己ping通别人
( 在policy DROP ❤前提下加规则 )
iptables -A INPUT -p icmp --icmp-type 8 -s 10.1.1.2 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 0 -d 10.1.1.2 -j ACCEPT
允许自己ping通别人
iptables -t filter -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -t filter -A INPUT -p icmp --icmp-type 0 -j ACCEPT

1.4.示例4:(根据端口匹配过滤)

policy是DROP前提下
iptables -A INPUT -s 10.1.1.2 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -s 10.1.1.2 -p tcp --dport 20:21 -j ACCEPT  表示20到21号
iptables -A INPUT -s 10.1.1.2 -p tcp --dport 22 -j ACCEPT


临时生效: 
echo 0> /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 1> /proc/sys/net/ipv4/icmp_echo_ignore_all   临时禁止PING
1 意味着别人ping,不显示回应,别人是不通的。我能ping通别人

永久生效:// 重启生效(init 6 or reboot)  or 指令生效(sysctl -p)
vim /etc/sysctl.conf(linux 内核参数)中增加一行
net.ipv4.icmp_echo_ignore_all=1   
练习:要根据自己策略敲,默认filter策略 # iptables -L
1.禁止你的另外一台服务器访问你的80端口,在INPUT和OUTPUT
iptables -A INPUT -s 10.1.1.3 -p tcp --dport 80 -j DROP
iptables -A OUTPUT -s 10.1.1.3 -p tcp --dport 80 -j DROP
2.只允许别人访问你的80端口
iptables -A INPUT -s 10.1.1.1 -p tcp --dport 80 -j ACCEPT 
3.拒绝所有人登录你的sshd服务
iptables -A INPUT -p tcp --dport 22 -j DROP

4.只允许你可以ping通另外一台主机,但是不允许它ping通你(上面讲过)
INPUT 默认策略:DROP   目标主机:10.1.1.2
OUTPUT :DROP
iptables -t filter -A OUTPUT -p icmp --icmp-type 8 -d 10.1.1.2 -j ACCEPT
iptables -t filter -A INPUT -p icmp --icmp-type 0 -s 10.1.1.2 -j ACCEPT

解释:别人给自己发包,是ping请求,在INPUT 是8,OUTPUT 是 0才可以(要各自增加一条)
      因此别人访问不了  只能我访问别人。 细品

1.5 iptables 内置模块(扩展)

-m 参数+<模块名>
1.multiport 多端口     目的:指定多个不连续的端口,减少iptables的条目,达到优化效果
用法:
iptables -m multiport --help
multiport match options:
[!] --source-ports port[,port:port,port...]
 --sports ...
                                match source port(s)
[!] --destination-ports port[,port:port,port...]
 --dports ...
                                match destination port(s)
[!] --ports port[,port:port,port]    
              --dports 20:22,80   match both source and destination po
                                                     
示例:
iptables -t filter -A INPUT -s 10.1.1.2 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -s 10.1.1.2 -p tcp --dport 80 -j ACCEPT
等于:
iptables -t filter -A INPUT -s 10.1.1.2 -p tcp -m multiport --dports 22,80 -j ACCEPT


2.iprange ip范围
用法:
iptables -m iprange --help
iprange match options:
[!] --src-range ip[-ip]    Match source IP in the specified range
[!] --dst-range ip[-ip]    Match destination IP in the specified range

iptables -t filter -I INPUT -m iprange --src-range 10.1.1.2-10.1.1.10 -p tcp --dport 80 -j ACCEPT


3.state  连接状态   目的:根据连接请求的状态进行数据过滤
状态值:
NEW     首次访问,比如:打开网站看到首页文件,后续点击叫后续操作
ESTABLISHED 连接完成后 1)某服务的后续所有访问 2)服务器的所有响应
RELATED:    相关联的连接,比如ftp连接,命令连接成功后,建立数据连接。21是建立连接端口,数据连接端口是另外个
INVALID:    无效连接

示例:
iptables -A OUTPUT -p tcp -m multiport --sports 20:22,80,137,445 -j ACCEPT
等于:
❤iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

————————————————————————————————————————————

· 额外扩展

主动模式下连接后,ftp>passive 就能关闭被动模式,可以访问
现在需求:被动模式下 也要可以访问
例子:ftp开启防火墙下被动模式


1.ftp服务,需要固定被动模式下的端口 (不然随机也捉摸不透,防火墙规则不好写)
vim /etc/vsftpd/vsftpd.conf
增加以下内容
pasv_min_port=2000
pasv_max_port=3000
重启服务
service vsftpd restart
如果进来的端口不固定的话,即使出去是 模块state 的ESTABLISHED 也不行。
因此要在 vsftpd.conf增加 max 和 min
因为在FTP 数据连接时,客户端会发 一个 大于1024的端口号


❤ 2.使用连接追踪模式(扩展)(INPUT和OUTPUT都是DROP下)
********************************************************************
iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT
做完这步后只能访问,不能查看数据 (因为没有追踪模块)T

modprobe nf_conntrack_ftp   //加载连接追踪模块(临时)
vim /etc/sysconfig/iptables-config  //开机自动加载
IPTABLES_MODULES="nf_conntrack_ftp"
配合RELATED
即补一条 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
做完这两步就能查看数据

nf_conntrack_ftp:针对数据端口连接时,将三次握手第一次的状态由NEW识别成RELATED
注意:修改完配置文件需要重启防火墙
service iptables restart
********************************************************************

FTP的话,因为防火墙不知道,没有连接追踪模块。 因此要增加连接追踪模块

 
正解:
# iptables -t filter -A INPUT -p tcp --dport 20:21 -j ACCEPT
# iptables -t filter -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
在这里插入图片描述结果 这种是能连接FTP,但是无法查看数据。

想要查看数据 采用追踪模块 vim /etc/sysconfig/iptables-config 进来就追踪
# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES=“nf_conntrack_ftp”
在这里插入图片描述
重启防火墙,再添加
# iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
在这里插入图片描述测试验证
OK
 
————————————————————————————————————————————
 

1.6 综合案例

环境:
server 10.1.1.1     部署了ftp,http,samba,ssh
client1:10.1.1.2
client2:10.1.1.3

要求:
1.server端根据权限最小化原则,INPUT的默认规则改为DROP
2.client2可以访问server端的所有服务
3.client1 只能访问server端的ftp服务和ssh服务
4.IP地址为10.1.1.100到10.1.1.200之间的人只能访问server端的samba服务

具体步骤:

首先,server端部署相关服务并启动
//查看相应的软件包是否成功安装,没安装请安装
[root@server ~]# rpm -q vsftpd httpd samba openssh-server

//启动相应的服务
[root@server ~]# service vsftpd start
[root@server ~]# service httpd restart
[root@server ~]# service nmb start
[root@server ~]# service smb start
[root@server ~]# service sshd start

//检查端口是否处于监听状态
[root@server ~]# netstat -anltp|grep vsftpd        tcp/21号端口
[root@server ~]# netstat -anltp|grep httpd         tcp/80号端口
[root@server ~]# netstat -anltp|grep smb           tcp/139,445号端口
[root@server ~]# netstat -anltp|grep sshd          tcp/22号端口

1.server端根据权限最小化原则,INPUT链的默认规则改为DROP
[root@server ~]# iptables -F
[root@server ~]# iptables -L
[root@server ~]# iptables -P INPUT DROP
[root@server ~]# iptables -L  //设置好了,默认拒绝
Chain INPUT (policy DROP)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

2.client2可以访问server端的所有服务
[root@server ~]# iptables -A INPUT -s 10.1.1.3 -d 10.1.1.1 -m multiport -p tcp --dports 20:22,80,139,445 -j ACCEPT

//ftp服务比较麻烦,需要固定被动模式下的端口,跟上面额外扩展做的差不多
vim /etc/vsftpd/vsfptd.conf
增加如下内容:
pasv_min_port=2000
pasv_max_port=3000

[root@server ~]# iptables -A INPUT -d 10.1.1.1 -s 10.1.1.3 -p tcp --sport 2000:3000 -j ACCEPT


3.client1只能访问server端的ftp服务和ssh服务
//client1访问server端的ssh服务,server端规则如下:
[root@server ~]# iptables -A INPUT -s 10.1.1.2 -d 10.1.1.1 -p tcp --dport 22 -j ACCEPT

注意:此时server如果不能远程访问client1主机,解决方案如下:
则需要再添加如下规则:
[root@server ~]# iptables -A INPUT -s 10.1.1.2 -d 10.1.1.1 -m state --state ESTABLISHED -j ACCEPT

//client1访问server端ftp服务,server端规则如下:
[root@server ~]# iptables -A INPUT -s 10.1.1.2 -d 10.1.1.1 -m multiport -p tcp --dports 20:21,2000:3000 -j ACCEPT


4.IP地址为10.1.1.100到10.1.1.200之间的人只能访问server端的samba服务
iptables -A INPUT -m iprange --src-range 10.1.1.100-10.1.1.200 -p tcp -m multiport --dports 139,445 -j ACCEPT

在这里插入图片描述在这里插入图片描述 

 

2.Nat表

功能:地址转换(源地址和目标地址) 可在核心交换机做,也可以在防火墙做。
三条链:
PREROUTING
POSTROUTING
OUTPUT

处理动作:
nat表:
-j SNAT 源地址转换 POSTROUTING
-j DNAT 目标地址转换 PREROUTING
-j MASQERRADE 地址伪装

源地址发送数据–> {PREROUTING–>路由规则–>POSTROUTING} -->目的地址接收到数据
PREROUTING是“路由规则”之前的动作,POSTROUTING是“路由规则”之后的动作

2.1 地址转换应用场景

公司内部员工访问互联网 SNAT (通俗讲,就是公网不知道来访的私网ip,nat设备‘中间人’给转换一下ip地址,同时转发给公网数据请求)
互联网用户访问公司服务器 DNAT (公网用户经过‘中间人’的地址转换得以访问私网)

2.2 地址转换原理

2.2.1 源地址转换(SNAT)

在这里插入图片描述

2.2.2 目标地址转换(DNAT)

在这里插入图片描述

2.3 ❤地址转换应用

2.3.1 源地址转换—SNAT

先额外补充route命令知识点
route相关命令
route -n 查看路由,显示IP,不解析
route del default 删除默认路由
route add default gw 192.168.1.110 添加一个默认网关,把所有不知道的网络交给网关来转发

route add -net 192.168.2.0/24 dev eth0 对一个网络添加一个新的路由(另一个网段)
route add -host 192.168.3.1 gw 192.168.1.110 对一个具体的IP添加路由
在这里插入图片描述

环境:
client:10.1.1.2
nat-server:10.1.1.1和2.2.2.1
web-server:2.2.2.2

需求:
客户端client是私有IP,想要访问互联网中的web服务

步骤:
1.client端:设置自己的默认路由(网关)指向nat-server服务器  (把‘中间人10.1.1.1’的IP添加网络作为网关,此处已有,故不添加net,只加gw)
# route add default gw 10.1.1.1
# route -n

2.nat-server端:开启路由转发功能并添加防火墙规则
(路由后POSTROUTING)

还原 iptables -F  包括配置文件/etc/sysconfig/iptables也要还原(此处注意,提前备份)
echo 1 > /proc/sys/net/ipv4/ip_forward  开启路由转发功能
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j SNAT --to 2.2.2.1 

3.web-servcer端:搭建web服务
echo "this is snat test page" > /var/www/html/index.html
service httpd restart
netstat -nltp|grep 80
route -n
Destination Gateway     Genmask         Flags Metric Ref    Use Iface
2.2.2.0     0.0.0.0     255.255.255.0   U       1     0     0   eth0

4.client端测试验证:client10.1.1.2是否可以访问web-server端2.2.2.2的web服务
wget http://2.2.2.2
可以访问    也可以再 web-server端 日记查看,tail -f /var/log/httpd/access_log

1.家里实现上网和上面有什么不同?
iptables -t nat -A POSROUTING -s 10.1.1.0/24 -j MASQUERADE
(仅在公网地址变的情况下才能使用这个,但公司的公网地址是不会一直变的)
  MASQUERADE 对应 POSROUTING
2.地址转换是在NAT表上进行,如果在nat-server端的filter表的FORWARD链拒绝转发,是否可以正常访问?
可以,因为是路由后POSTROUTING转换

/etc/sysconfig/iptables 默认参数如图:
在这里插入图片描述
总结:
SNAT源地址转换目的实现私网地址可以访问互联网
NAT设备可以是硬件防火墙、路由器等物理设备,但是都得具有路由和地址转换功能
当请求发送到NAT设备后,NAT设备首先查看自己的路由表,然后再进行地址转换,所以应该在NAT表的POSTROUTING链上进行源地址转换(路由后)
对于NAT表和FILTER表来说,数据包进来先经过NAT表的PREROUTING链,再过路由表,再选择不同的路出去。

 

2.3.2 源地址转换—SNAT目标地址转换—DNAT
路由前
web-server:10.1.1.3
nat-server:10.1.1.1和2.2.2.1(两个网卡,网络适配器增加,配置好eth1)
client:2.2.2.2

需求:公网用户client访问私网服务器提供的WEB服务

步骤:
1.web-server端:10.1.1.3上搭建web服务
echo "this is dnat test page">/var/www/html/index.html

2.nat-server端:10.1.1.1、2.2.2.1端开启路由转发功能并添加DNAT规则
echo 1 > /proc/sys/net/ipv4/ip_forward
route -n 查看路由表信息,确认有到达目标的网关

(默认ACCEPT)  目标地址转换 是在路由器前
意思就是 访问 目标 2.2.2.1的80端口的时候 作 目标地址转换,转换为10.1.1.3
iptables -t nat -A PREROUTING -d 2.2.2.1 -p tcp --dport 80 -j DNAT --to 10.1.1.3

3.client端:2.2.2.2客户端测试验证  (如果web-server的默认网关是 10.1.1.254,则客户端是wget不了的,回不去。因为中间设备是10.1.1.1)
elinks --dump http://2.2.2.1
    this is dnat test page
网关一定要指定‘中间人’的IP网关(2.2.2.1)

WEB-SERVER : tail -f /var/log/httpd/access_log
2.2.2.2 ——》( 2.2.2.1 ——》 10.1.1.1 )——》 10.1.1.3

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值