Linux防火墙(iptables篇)

防火墙,可以理解为网络访问控制,常用的网络访问控制有:哪些IP可以访问服务器, 可以使用哪些协议,哪些接口,是否需要对数据包进行修改等。
一、SELinux
SELinux是Linux特有的一种安全机制,因这种机制的限制太多,配置也较繁琐,所以将它关闭即可!

getenforce  #查看SELinux的状态
#Disabled

setenforce 0    #临时关闭SELinux


永久关闭SELinux时需要更改SELinux的配置文件/etc/selinux/config,将SELINUX=enforcing改为SELinux=disabled 即可。
更改后的配置文件如下:
===========================================================
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
#SELINUX=enforcing
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
==========================================================

二、netfilter(centos5、centos6的防火墙)
Linux内核集成了网络访问控制功能,通过netfilter实现,netfilter是通过iptables进行调用的。

netfilter通过以下方式对数据包进行分类:

  • 源IP地址
  • 目的IP地址
  • 使用接口
  • 使用协议(tcp,udp,icmp)
  • 端口号
  • 连接状态(new,establish,related,invalid)

1、netfilter中的表和链(过滤点)
这里写图片描述

netfilter的五张表

  1. Filter:INPUT,OUTPUT,FORWARD
  2. Nat:PREROUTING,OUTPUT,POSTROUTING
  3. Mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
  4. Raw
  5. security

netfilter的五条链

  1. PREROUTING:数据包进入路由之前
  2. INPUT:通过路由表后目的地为本机
  3. FORWARD:通过路由表后,目的地不为本机
  4. OUTPUT:由本机产生,向外转发
  5. POSTROUTING:发送到网卡接口之前

2、iptables的基本语法
查看以及清除规则

iptables -t nat -nvL    #查看规则,
#-t指定表 
#-n不进行ip与主机名的反查,
#-L列出目前的iptables规则,
#-v列出更多信息


iptables -F #清空规则,清除只是临时的
#iptables -Z    #清空规则,清除只是临时的


service iptables save   #保存规则
#iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]


======================================================
cat /etc/sysconfig/iptables #防火墙规则文件
# Generated by iptables-save v1.4.7 on Sat Mar  3 20:06:07 2018
*filter
:INPUT ACCEPT [75:5752]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [55:5768]
COMMIT
# Completed on Sat Mar  3 20:06:07 2018
=====================================================

增加、删除一条规则

-P :设置默认策略的(设定默认门是关着的还是开着的)
    默认策略一般只有两种
    iptables -P INPUT (DROP|ACCEPT)  默认是关的/默认是开的
    往下定义动作,作为允许的‘后门’

-A/-D:  增加、删除一条规则
-I: 表示插入一条规则,其实效果与-A一样

-p: 表示指定协议,可以是tcp,udp,icmp
--dport:    与-p一起使用,表示指定目标端口
--sport:    与-p一起使用,表示指定源端口

-s: 表示指定源IP(可以是一个IP网段)
-d: 表示指定目的IP(可以是一个IP网段)

-j: 后面跟动作,其中ACCEPT表示允许包, DROP表示丢掉包(悄悄丢弃), 
REJECT表示拒绝包(明示拒绝),MASQUERADE表示源地址伪装

-i eth0:从这块网卡流入的数据(流入一般用在INPUTPREROUTING上)
-o eth0:从这块网卡流出的数据(流出一般在OUTPUTPOSTROUTING上)


iptables -t filter -A INPUT -s 192.168.217.1 -j DROP
-t filter   指定表
-A INPUT-s 192.168.217.1    匹配属性
-j DROP 动作

下面举一些例子

#将来自1.1.1.1的所有数据包都丢掉
iptables -I INPUT -s 1.1.1.1 -j DROP

#注意删除一条规则时,必须和插入的规则一致,也就是说,除了—I和—D不一样外,其他的都一样
iptables -D INPUT -s 1.1.1.1 -j DROP

#把来自2.2.2.2并且是tcp协议到本机80端口的数据包丢掉
iptables -I INPUT -s 2.2.2.2 -p tcp --dport 80 -j DROP

#把发送到10.0.1.14的22端口的数据包丢掉
iptables -I INPUT -p tcp --dport 22 -d 10.0.1.14 -j DROP

#把来自192.168.1.0/24这个网段且作用在eth0上的包放行
iptables -I INPUT -s 192.168.1.0/24 -i eth0 -j ACCEPT

#有时候服务器上的iptables过多了,想要删除一条规则时,有一个简单的方法
iptables -nvL --line-numbers
#
#然后删除某一条规则
iptables -D INPUT num   #-D后依次跟链名,规则num。

#关于icmp包的一个比较常见的应用
iptables -I INPUT -p icmp --icmp-type 8 -j DROP
#这里--icmp-type选项要与-p icmp一起使用,后面指定类型编号,
#这个8指的是能在本机ping通其他机器,
#而其他机器不能ping通本机

3、nat表

SNAT和DNAT的实现

由于我们现在IP地址十分紧俏,已经分配完了,这就导致我们必须要进行地址转换,来节约我们仅剩的一点IP资源。那么通过iptables如何实现NAT的地址转换呢?

SNAT基于源地址的转换

基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。
所以我们在iptables中就要定义到底如何转换:定义的样式:
比如我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT –to-source 172.16.100.1
这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.16.100.1这个IP.
那么,如果172.16.100.1不是固定的怎么办?
我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。所以,我们就需要这样设置:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
这里要注意:地址伪装并不适用于所有的地方。

DNAT目标地址转换

对于目标地址转换,数据流向是从外向内的,外面的是客户端,
里面的是服务器端通过目标地址转换,
而我们的服务却放在内网服务器的不同的服务器上。
如何做目标地址转换呢?:

iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2

目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上。

这里写图片描述

控制规则的存放以及开启

注意:你所定义的所有内容,当你重启的时候都会失效,要想我们能够生效,
需要使用一个命令将它保存起来
1.service iptables save 命令
    它会保存在/etc/sysconfig/iptables这个文件中
2.iptables-save 命令
    iptables-save > /etc/sysconfig/iptables

3.iptables-restore 命令
        开机的时候,它会自动加载/etc/sysconfig/iptabels
        如果开机不能加载或者没有加载,而你想让一个自己写的配置文件
       (假设为iptables.2)手动生效的话:
        iptables-restore < /etc/sysconfig/iptables.2
        则完成了将iptables中定义的规则手动生效

举例

假设你的机器上有两块网卡eth0,eth1,其中eth0的IP为10.0.2.68,eth1的IP为192.168.1.1。eth0连接了因特网,但eth1没有连接。
现有另一台机器(192.168.1.2)和eth0是互通的,那么如何设置才能让连接eth1的这台机器连接因特网呢?

echo "1" > /proc/sys/net/ipv4/ip_forward    #打开路由转发功能
#iptables对nat表做了一个IP转发的操作,-o表出口的网卡
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE 

参考书籍 《跟阿铭学Linux》
参考博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章