首页 > 技术文章 > iptables 简单学习

liuwei-xd 2019-06-14 12:45 原文

预热:网络基础

什么是交换?什么是路由?什么是路由表?

交换是指同网络访问(两台机器连在同一个交换机上,配置同网段的不同IP地址就可以直接通讯)

路由就是跨网络访问(路径选择)

路由表是记录路由信息的表

一、查看路由表信息

//route命令用来查看和设置路由表信息

[root@ceshi ~]# route -n
Kernel IP routing table
目标网络			网关			子网掩码		路由标志					网卡
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 eth0
0.0.0.0         10.1.1.1        0.0.0.0         UG    0      0        0 eth0
												U:up,启动状态
												UG:该网关为路由器

讨论1:
按上图中的路由表来看,如果ping一个公网IP(如ping 14.200.151.38),应该怎么走?
1)先看目标IP是否为本机IP,如果是,则直接访问本地;如果不是,则找路由表里是否有想访问的网段
2)如果路由表有则从这个路由条目后面指定的网卡出去;如果路由表里没有你要访问的网段,则会找默认路由(也就是网关)
讨论2:
按上面的路由表来看,如果ping一个局域网IP为10.1.1.10,怎么走?
直接走本地路由从eth0网卡出去
讨论3:
如何加网关和删除网关,加网关有什么要求?
route add default gw x.x.x.x		临时添加网关,马上生效
route del default gw x.x.x.x		临时删除网关,马上生效
永久修改网关:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
GATEWAY=X.X.X.X
或者
vim /etc/rc.local
..
route add default gw x.x.x.x

注意事项:
1.加网关只能加你已经有的路由网段里的一个IP才行(此IP不一定存在)
2.加网关可以不用指定子网掩码(因为是已有的一个网段的IP,所有掩码已经确认了)

讨论4:
一个Linux服务器上能有几个有效网关?
准确来说,一个路由表上可以加多个网关,但只有一个生效

讨论5:
一台Linux上如果有双物理网卡,请问可不可以两个网卡配置同网段的不同IP呢?
eth0 10.1.1.1/24
eth1 10.1.1.2/24
如果两个网卡同网段,则会有下面两条路由
10.1.1.0			eth0
10.1.1.0			eth1

结果:
它会实现从两张网卡进来的包,却从一张网卡出去,问题将产生了。假设eth0网卡有问题,路由表咯匹配到第一条后,依然走eth0,不走eth1
解决方法(比如多路由表或者双网卡绑定)

二、IP路由选择实验

1.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添加路由

2.实验需求

环境准备:
node1:10.1.1.1和192.168.0.1	作为网关服务器,开启路由转发功能/proc/sys/net/ipv4/ip_forward
node2:172.16.0.254
node3:10.12.0.254
要求:
实现不同网络(10.12.0.0/24和172.16.0.254/24)之间的互通,使用第三方主机node1作为路由进行转发

具体步骤

3.具体步骤





Iptables 防火墙

课程目标

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

思考1:服务如何进行网络访问控制?

​ 配置文件、xinetd、tcp_wrappers

思考2:系统如何进行访问控制?

​ 防火墙

一、防火墙介绍

  • 防火墙分类和作用
    • 硬件防火墙
    • 软件防火墙

作用:

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

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

二、Iptables防火墙介绍

  • Linux系统内核集成了网络访问控制的功能,通过netfilter模块来实现,是内核的一部分(内核空间)
  • 用户层(用户空间)可以通过iptables程序对netfilter进行控制管理,进而实现网络的访问控制
  • TCP_Wrappers也是一个网络访问控制的一个工具,作用在应用层

总结:

  • netfileter 模块 内核空间,是内核一部分
  • iptables组件 用户空间,提供管理防火墙的手段,它主要作用在传输层

三、Iptables防火墙结构

  • 四张表

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

    [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
    iptables -t filter -L
    iptables -t nat -L
    iptables -t raw -L
    iptables -t mangle -L
    
  • iptables 的启动和关闭及保存

    /etc/rc.d/init.d/iptables //脚本文件 软连接 /etc/init.d/iptables 
    //临时停止|启动|查看状态|重新加载|重新启动
    service iptables stop|start|status|reload|restart
    //开机是否自启动
    chkconfig iptables off|on
    //永久保存规则
    vim /etc/sysconfig/iptables
    ...
    
    
  • iptables 常用的命令选项

    -L 				查看
    -A 				追加,放置在最后一条
    -I				插入,默认插入成第一条
    -D				删除
    -F				清空flush
    -P				设置默认策略policy
    
    处理动作:
    filter表:
    -j ACCEPT		允许
    -j DROP			丢弃,没有任何提示信息
    -j REJECT		拒绝,有提示信息
    -j LOG			写日志		/var/log/messages	然后将数据包传递给下一条规则
    
    nat表:
    -j SNAT			源地址转换 POSTROUTING
    -j DNAT			目标地址转换 PREROUTING
    
    
    

1>Filter表

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	

iptables -t filter -P INPUT DROP	设置链上的默认规则
iptables -D INPUT 1
说明:如果不指定表名,默认操作filter表


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出去的包全部允许

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 -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -t filter -A INPUT -P icmp --icmp-type 0 -j ACCEPT

需求2:(input和output都是DROP情况下)
只允许自己和10.1.1.2相互ping通,其他人不能ping通自己,但是允许自己ping通别人
iptables -A INPUT -s 10.1.1.2 -p icmp --icmp-type 8 -j ACCEPT

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

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
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


练习:
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
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

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]
                                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连接,命令连接成功后,建立数据连接
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开启防火墙下被动模式
1.ftp服务,需要固定被动模式下的端口
vim /etc/vsftpd/vsftpd.conf
增加以下内容
pasv_min_port=2000
pasv_max_port=3000
重启服务
service vsftpd restart

iptables -t filter -A INPUT -p tcp --dport 2000:3000 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --sport 2000:3000 -j ACCEPT
iptables -t filter -A INPUT -m multiport -p tcp --dports 20:21,2000:3000 -j ACCEPT

iptables -A INPUT -d 10.1.1.1 -s 10.1.1.3 -p tcp --sport 2000:3000 -j ACCEPT

2.使用连接追踪模式(扩展)(INPUT和OUTPUT都是DROP下)

iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT
做完这步后只能访问,不能查看数据
这两个规则相当于iptables -I INPUT -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

modprobe nf_conntrack_ftp	//加载连接追踪模块(临时)
vim /etc/sysconfig/iptables-config	//开机自动加载
IPTABLES_MODULES="nf_conntrack_ftp"
做完这两步就能查看数据

nf_conntrack_ftp:针对数据端口连接时,将三次握手第一次的状态由NEW识别成RELATED

iptables-save
注意:修改完配置文件需要重启防火墙
service iptables restart

常见协议的端口 /etc/services
grep ^http /etc/services
服务		协议		端口/传输协议
httpd	http		80/tcp

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端部署相关服务并启动
//查看相应的软件包是否成功安装,没安装请安装
rpm -q vsftpd httpd samba openssh-server

2>Nat表

功能:地址转换(源地址和目标地址)
三条链:
PREROUTING
POSTROUTING
OUTPUT

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

1.地址转换应用场景

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

2.地址转换原理

  • 源地址转换(SNAT)

  • 目标地址转换(DNAT)

3.地址转换应用

  • 源地址转换—SNAT
环境:
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
可以访问

1.家里实现上网和上面有什么不同?
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j MASQUERADE(公网地址变的情况下)

2.地址转换是在NAT表上进行,如果在nat-server端的filter表的FORWARD链拒绝转发,是否可以正常访问?
可以,因为是路由后POSTROUTING转换

总结:

  1. SNAT源地址转换目的实现私网地址可以访问互联网
  2. NAT设备可以是硬件防火墙、路由器等物理设备,但是都得具有路由和地址转换功能
  3. 当请求发送到NAT设备后,NAT设备首先查看自己的路由表,然后再进行地址转换,所以应该在NAT表的POSTROUTING链上进行源地址转换(路由后)
  4. 对于NAT表和FILTER表来说,数据包进来先经过NAT表的PREROUTING链,再过路由表,再选择不同的路出去。

  • 目标地址转换—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)
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客户端测试验证
elinks --dump http://2.2.2.1
	this is dnat test page
网关一定要指定‘中间人’的IP网关

推荐阅读