iptables-防火墙

2211人浏览 / 0人评论

一、iptables简介

  Netfileter/iptables (以下简称iptables)是nuix/linux 系统自带的优秀且完全免费的基于包过滤的防火墙工具、它的功能十分强大、使用非常灵活、可以对流入、流出及流经服务器的数据包进行精细的控制。特别是它可以在一台非常低配置下跑的非常好。提供400台机器的办公上网共享服务丝毫不逊色数万RMB企业级专业路由器防火墙

   Iptables 是linux2.4及2.6内核中集成的服务、其功能与安全性比老一辈ipvfwadm、ipchanins强大的多、一般认为iptables工作在OSI七层的、二、三层、四层。

二、iptables专业术语

1、 iptables 名词和术语

  不少刚接触到iptables的初学者会被iptables防火墙的相关名词搞的很晕、不知道其所云的具体意思、本章不会像某些书籍一样长篇大论、而是以最基本的能让大家容易理解。

 

1 什么是容器

容器就是装东西的。如(箱、包、坛、)、容器就是用来包装或转载物品的存寄器、在iptables里的呢、就是用来描述这种包含或者说术语的关系、喜爱按我就来说说这些包含关系

 

2 什么是Netfileter/iptables  

   Netfileter是表(tables)的容器,(还不知道啥意思的,请网上看)。这样解释大家肯定还晕、举例、如果吧Netfileter看成某小区的一栋大楼、那么表(tables)就是楼里的其中的一套房子。这套房子表(tables) 就属于这栋楼“Netfileter”。比如、你们家所在的小区所在楼当成netfileter

3 什么是表(tables)

   表(tables)是链的容器、及所有的链(chains)都是属于表(tables),如上,如果把Netfileter看成某个小区的一栋楼、那么表(tables)就是楼里的某一套房子、比如你们家住的房子。当然了、表(tables)可能不止一个!

 

4 什么是链(chains)?

  链(chains)是规则(Policys)的容器、链属于表,接上、如果表(tables)当做一套房子、那么链(chains)那么可以说是房子里的家具(桌子、柜子等)。每一套房子都可能会有桌子柜子等、

 

5 什么是规则(Policy)

  规则(policy)就比较容易理解了、柜子(policy)属于链(chains)。就是iptables一系列过滤信息和具体操作方法、可以理解为购买什么家具、并且如何摆放、设计的更符合要求等、

图:

Netfileter/iptables

表(tables)

链(chains)

规则(policy)

小区的一栋楼

楼里的房子

房子里的柜子

增加、摆放的规则

三、iptables工作流程

防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后
进行过滤的。
2. 如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配
新的规则。
3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向
下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
4. 防火墙的默认规则是所有规则执行完才执行的

四、iptables表和链

iptables 4表伍链
4(小写): fifilter nat raw mangle
伍链(大写): INPUT OUTPUT FORWARD PREROUTING
POSTROUTING

1、iptables 的filter表介绍

对于filter表的控制是我们实现本机防火墙功能的重要手段。

Filter表

和主机自身相关、负责防火墙(过滤本机流入、流出数据包)。

是iptables默认使用的表、这个表定义了三个链(chains)说明如下

 

INPUT

负责过滤所有目标地址是主机(防火墙)地址的数据包、通俗的讲、就是过滤进入主机的数据包。

 

FORWARD

负责转发流经主机但不进入本机的数据包、起转发作用、和NAT表关系很大、后面会详细介绍

 

OUTPUT

处理所有原地址是本机地址的数据包、通俗的讲就是处理从主机发出去的数据包。

2 iptabls 的nat表介绍

NAT表

是网络地址转换的意思。即负责来源与目的IP地址和port的转换、和主机本身无关。一般用于局域网多人共享上网或者内网IP映射外网IP及不同端口转换服务等功能。Nat表的功能很重要、这个表定义了三个链(chains)

 

OUTPUT

主机发出去的数据包有关、在数据包路由之前改变主机产生的数据包的目的地址等。

 

PREROUTING

在数据包刚到达防火墙时、进行路由判断之前执行的规则、改变包的目的地址(DNAT功能)、端口等(通俗比喻,就是收信时、根据规则重写收件人的地址、这看上去不地道啊、)把公司IP映射到局域网的机器上、此链多用于把外部IP地址端口的服务、映射为内部IP地址及端口

 

POSTROUTING

在数据包离开防火墙时进行路由判断之后执行的规则、改变包的源地址(SNAT)、端口等(通俗比喻、就是寄信时写好发件人的地址、要让人家回信是能够有地址可回)刺链多用于局域网共享上网,把所有局域网的地址、转换为公网地址上

3 iptables 的mangle表介绍

  由于这个表与特殊路由标记有关、一般在生产运维工作中、我们很少用到这个mangle表。我们就不做详细介绍了.

Mangle

主要负责修改数据包中特殊的路由标记,如TTL、TOS、MARK等、这个表定义了5个链(chains)

 

INPUT

同filter表的INPUT

 

FORWARD

同filter表的FORWARD

 

OUTPUT

同fileter表的OUTPUT

 

PREROUTING

同nat表的PREROUTING

 

POSTOUTING

同nat表的POSTOUTING

 

五、iptables安装

默认centos7是firewalld,没有iptables这个服务,但是有iptables这个命令。

1、安装iptables

[root@iptables ~]# yum install -y iptables-services

2、加载相关模块

#临时加载
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
#永久加载
cat >>/etc/rc.local<<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF
 

 3、检查

[root@iptables ~]# lsmod |egrep 'filter|nat|ipt'
nf_nat_ftp             12770  0 
nf_conntrack_ftp       18638  1 nf_nat_ftp
iptable_nat            12875  0 
nf_nat_ipv4            14115  1 iptable_nat
nf_nat                 26787  2 nf_nat_ftp,nf_nat_ipv4
nf_conntrack          133053  6 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4
iptable_filter         12810  0 
ip_tables              27126  2 iptable_filter,iptable_nat
libcrc32c              12644  3 xfs,nf_nat,nf_conntrack

4、关闭firewalld启动iptables

[root@iptables ~]# systemctl stop firewalld
 [root@iptables ~]# systemctl start iptables

 六、iptables命令

1、命令参数

-L 显示表中的所有规则
-n 不要把端口 或ip反向解析为 名字
-t 指定表 不指定默认是fifilter
-A append 追加 加入准许类规则 使用-A
-D delete 删除 -D INPUT 1
-I insert 拒绝类规则放在所有规则最上面 拒绝类 -I
-p
协议 protocal tcp/udp/icmp/all
--dport
目标端口 dest destination 指定端口 加上协议 -p tcp
--sport 源端口 source
-s --source ip
-d --destination 目标ip
-m 指定模块 multiport
-i input 输入的时候 从哪个网卡进来
-o ouput 输出的时候 从哪个网卡出去
-j
满足条件后的动作 : DROP/ACCEPT/REJECT
DROP REJECT拒绝的区别
DROP把数据丢掉 不会返回信息给用户
REJECT 拒绝 返回拒绝信息
-F flflush 清除所有规则,不会处理默认的规则
-X 删除用户自定义的链
-Z 链的计数器清零(数据包计数器与数据包字节计数器

2、查看规则命令(默认是input表,accept规则)

清除规则

[root@iptables ~]# iptables -F
[root@iptables ~]# iptables -X
[root@iptables ~]# iptables -Z
 

[root@iptables ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

3、 禁止访问80端口

[root@iptables ~]# iptables -t filter -I INPUT -p tcp --dport 80 -j DRO

4、查看规则序号

[root@iptables ~]# iptables -nL --line-number

5、删除规则

[root@iptables ~]# iptables -D INPUT 1

6、禁止某个IP

[root@iptables ~]# iptables -I INPUT -s 10.0.0.7 -j DROP 

#禁止某个ip段

[root@iptables ~]# iptables -I INPUT -s 172.168.0.0/24 -p tcp --dport 8080 -j DROP

7、测试

服务端使用nc -l 8080进行监听端口

客户端使用talnet 8080进行测试 

8、只允许某个IP段进行连接(利用!号取反)

[root@iptables ~]# iptables -I INPUT ! -s 11.0.0.0/24 -j DROP

9、修改默认规则为拒绝

 1、在修改前先把自己加入白名单(要不然你直接修改拒绝规则,导致你最后也登录不上去了)

[root@iptables ~]# iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
2、修改默认拒绝规则

[root@iptables ~]# iptables -P INPUT DROP
[root@iptables ~]# iptables -nL
Chain INPUT (policy DROP)

3、修改回去

[root@iptables ~]# iptables -P INPUT ACCEPT

 10、拒绝多个端口

#80和443

[root@iptables ~]# iptables -I INPUT -p tcp -m multiport ! --dport 80,443 -j DROP

#1024-65535
[root@iptables ~]#  iptables -I INPUT -p tcp --dport 1024:65535 -j DROP

11、禁ping

 [root@iptables ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP

#也可以修改内核参数

[root@iptables ~]# cat /etc/sysctl.conf
#/proc/sys/net/ipv4/icmp_echo_ignore_all
net.ipv4.icmp_echo_ignore_all = 1
[root@iptables~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 1

12、网络匹配状态

-m state --state
NEW:已经或将启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启动的新连接
INVALID:非法或无法识别的
[root@iptables~]#iptables -A INPUT -m state --state ESTABLISHED,RELATED -j
ACCEPT
[root@iptables~]#iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j
ACCEPT

 13、限流

-m limit --limit 10/minute #每分钟只能有10个数据包 每6秒生
-m limit --limit n/{second/minute/hour}:
解释:指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时
 
-m limit --limit 10/minute --limit-burst 5 6秒释放工牌
给别人使用
#10个数据包
511个工牌 从第6个开始 每6秒 才能释放1个工牌
--limit-burst [n]
解释:在同一时间内允许通过的请求”n”为数字,不指定默认为5

 测试

[root@iptables~]#iptables -F
[root@iptables~]#iptables -I INPUT -p icmp -m limit --limit 10/minute
--limit-burst 5 -j ACCEPT
[root@iptables~]#iptables -A INPUT -p tcp --dport -j ACCEPT
[root@iptables~]#iptables -P INPUT DROP

14、防护强规则保存与恢复

iptables-save 默认输出到屏幕
iptables-restore 加上文件
写入到/etc/sysconfifig/iptables

/etc/sysconfig/iptables文件为iptables系统规则配置文件

#将当前的规则写入保存到配置文件中
[root@iptables ~]# iptables-save >/etc/sysconfig/iptables

 [root@iptables ~]# iptables-restore </etc/sysconfig/iptables

15、filter表小结

ip 端口 网段
禁止ping
限制速度和并发
iptables fifilter表 功能 可以在 云服务器使用

 七、NAT表

1、清楚规则

[root@iptables ~]# iptables -P INPUT ACCEPT
[root@iptables ~]# iptables -P FORWARD ACCEPT
[root@iptables ~]# iptables -F

 2、允许172.168.0.0的内网主机可以通过我的外网主机10.0.0.15进行上网

[root@iptables ~]# iptables -t nat -A POSTROUTING -s 172.168.0.0/24 -j SNAT --to-source 10.0.0.15

#开启内核转发

[root@iptables ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@iptables ~]# sysctl -p|grep ip_forward
net.ipv4.ip_forward = 1

 3、如果外网主机的公网ip不固定的情况 这样写

[root@iptables ~]#iptables -t nat -A POSTROUTING -s 172.168.0.0/24 -j MASQUERADE

4、然后客户端配置指定网关

[root@iptables ~]# cat /etc/sysconfig/network-scripts/ifcfg-
eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=no
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.254
DNS1=223.5.5.5
GATEWAY=10.0.0.254
[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-
eth1
TYPE=Ethernet
IPADDR=172.168.0.16
PREFIX=24
NAME=eth1
DEVICE=eth1
ONBOOT=yes
GATEWAY=172.168.0.15
DNS1=1.2.4.8

 验证

然后在内网主机上面ping baidu 和输入ip r

还有route -n看下

八、端口转发

1、将本地(10.0.0.15)的9000端口映射到172.168.0.16主机的22。

[root@iptables ~]# iptables -t nat -A PREROUTING -d 10.0.0.15 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22

九、IP映射

将本地主机(10.0.0.15)的请求都转发到远端的172.168.0.16

[root@iptables ~]# iptables -t nat -A PREROUTING -d 10.0.0.15 -j DNAT --to-destination 172.168.0.16

NAT表总结

实现共享上网
端口转发
nat功能在 云服务器无法使用 替代品叫: NAT网关
 
十、企业实战   
1、禁止来自10.0.0.188 ip地址访问80端口的 请求 
ptables -I INPUT -s 10.0.0.188 -p tcp --dport 80 -j DROP

2、如何使在命令行执行的iptables规则永久 生效? 

iptables-save

/etc/sysconfig/iptables

3、实现把 访问10.0.0.3:80的请求转到172.16.1.17:80

iptables -t nat -A PREROUTING -d 10.0.0.3 -p tcp --dport  80 -j DNAT --to-destination 172.16.xxxx:80

4、实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网。

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 123.32.54.26

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT MASQUERADE

  

全部评论