iptables防火墙策略

环境:

foundation1     172.25.1.250    172.25.254.1

server1             172.25.1.1

server2             172.25.1.2

server3             172.25.1.3

四个主机都做解析

iptables简介:

netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

iptables采用“表”和“链”的分层结构,在linux中iptables主要有三张表五条链:

三张表即filter表、nat表、mangle表,分别用于实现包过滤,网络地址转换、包重构(修改)功能

filter表有三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包 

Nat表有三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口)

Mangle表有五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型等

iptables命令中设置数据过滤或处理数据包的策略叫做规则,将多个规则合成一个链,叫规则链。

规则链则依据处理数据包的位置不同分类:

PREROUTING: 在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
INPUT:处理入站的数据包
OUTPUT:处理出站的数据包
FORWARD:处理转发的数据包
POSTROUTING: 在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)

iptables中的规则表是用于容纳规则链,规则表默认是允许状态的,那么规则链就是设置被禁止的规则,而反之如果规则表是禁止状态的,那么规则链就是设置被允许的规则。

raw表:确定是否对该数据包进行状态跟踪

mangle表:为数据包设置标记(较少使用)

nat表:修改数据包中的源、目标IP地址或端口

filter表:确定是否放行该数据包(过滤)

另外注意:

1.没有指定规则表则默认指filter表。

2.不指定规则链则指表内所有的规则链。

3.在规则链中匹配规则时会依次检查,匹配即停止(LOG规则例外),若没匹配项则按链的默认状态处理。

注意:

你所定义的所有内容,当你重启的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来

1.service iptables save 命令

它会保存在/etc/sysconfig/iptables这个文件中

    2.iptables-save 命令

iptables-save > /etc/sysconfig/iptables

为了不影响实验去除干扰,将 firewalld 关闭,安装 iptables,并启动

[root@server1 ~]# systemctl stop firewalld
[root@server1 ~]# systemctl status firewalld

[root@server1 ~]# yum install iptables-services                      //下载防火墙服务,server1、server2、server3均下载

[root@server1 ~]# systemctl start iptables.service                //开启服务

[root@server1 ~]# iptables -nL           //查看防火墙策略
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         

[root@server1 ~]# iptables -F            //刷新策略
[root@server1 ~]# iptables -nL
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  

[root@server1 ~]# yum install -y httpd                      //下载http服务

[root@server1 ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

[root@server1 ~]# systemctl start httpd                     //开启http服务
[root@server1 ~]# iptables -P INPUT ACCEPT         //设置接受模式

此时所有主机浏览器都可以访问httpd页面,这里用curl命令

给server1写一个Apache的发布页面

[root@server1 ~]# cd /var/www/html/
[root@server1 html]# ls
[root@server1 html]# vim index.html

[root@foundation1 Desktop]# curl server1

[root@server2 ~]# curl server1
server1

[root@server3 ~]# curl server1
server1

[root@server1 ~]# iptables -A INPUT -p tcp --dport 80 -j REJECT               //添加策略,使http为拒绝

[root@server1 ~]# iptables -nL           //查看策略是否已添加
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

此时:

[root@server2 ~]# curl server1

[root@server3 ~]# curl server1
curl: (7) Failed connect to server1:80; Connection refused

[root@server1 ~]# iptables -A INPUT -s 172.25.1.2 -p tcp --dport 80 -j ACCEPT        //指定ip为server2可以访问该主机的http服务

[root@server1 ~]# iptables -nL

[root@server2 ~]# curl server1
curl: (7) Failed connect to server1:80; Connection refused

防火墙策略读取方式:

读取时从第一条开始读取,当满足第一条时停止读取。

可以看到虽然有策略,但是server2还是不能访问,因为第一条策略读完就拒之门外,所以因采用:

[root@server1 ~]# iptables -D INPUT 2
[root@server1 ~]# iptables -I INPUT 1 -s 172.25.1.2 -p tcp --dport 80 -j ACCEPT [root@server1 ~]# iptables -nL

[root@server1 ~]# iptables -nL

此时:

[root@server2 ~]# curl server1

[root@server3 ~]# curl server1

[root@server1 ~]# iptables -R INPUT 2 -s 172.25.1.3 -p tcp --dport 80 -j ACCEPT      //修改第二条策略,修改为允许server3访问

[root@server1 ~]# iptables -nL

此时server3也可进行访问

[root@server3 ~]# curl server1

[root@server1 ~]# iptables -F       //刷新策略
[root@server1 ~]# iptables -nL     //察看是否已刷新

[root@server1 ~]# iptables -N xx            //添加名为xx的链
[root@server1 ~]# iptables -nL

[root@server1 ~]# iptables -E xx cc                  //修改链名,将名为xx的链修改为cc
[root@server1 ~]# iptables -nL

[root@server1 ~]# iptables -X cc                //删除链cc
[root@server1 ~]# iptables -nL

 

NAT (Net Address Trancelate:网络地址转换)

*************************源地址转换:SNAT*********************************

(源地址转换)是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的 IP,这样,接收方就认为数据包的来源是被替换的那个 IP 的 主机

*************************目的地址转换:DNAT*******************************

(目标地址转换),就是指数据包从网卡发送出去的时候,修改数据包中的目的 IP,表现为如果你想访问 A,可是因为网关做了 DNAT,把所有访问 A 的数 据包的目的 IP 全部修改为 B,那么,你实际上访问的是 B

注意:实现配置iptables的NAT功能需要 开启内核的转发功能

 

1、SNAT

环境:

server1:172.25.1.1

server2: 172.25.1.2        172.25.254.2                 开启iptables服务

server3:172.25.254.3

## 所有主机刷新策略,并关闭防火墙firewalld

##  打开转发IP功能(IP forwarding):

echo "1" > /proc/sys/net/ipv4/ip_forward

要想永久有效:

  vim /etc/sysctl.conf

  net.ipv4.ip_forward = 1

如果使用PPP、DHCP等动态IP,需要打开:

echo "1" > /proc/sys/net/ipv4/ip_dynaddr

[root@server2 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward

[root@server2 ~]# systemctl status iptables

[root@server2 ~]# ip address add 172.25.254.2/24 dev eth1                   //添加网卡eth1:172.25.254.2

[root@server1 ~]# ip addr

[root@server3 ~]# ip addr

原本不同网段ip是ping不通的,即server1和server3是ping不通的

[root@server1 ~]# ping 172.25.254.3

[root@server2 ~]# iptables -nL -t nat         //查看nat策略

[root@server2 ~]# iptables -t nat -I POSTROUTING -s 172.25.1.0/24 -j MASQUERADE

//在路由后,将172.25.1.0/24网段过来的主机转发出去

[root@server2 ~]# iptables -nL -t nat

[root@server1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0          //添加网关

GATEWAY=172.25.1.2

[root@server1 ~]# systemctl restart network

[root@server2 ~]# route -n
-bash: route: command not found
[root@server2 ~]# yum install -y net-tools                 //下载route 命令所需的工具

[root@server1 ~]# route -n               //查看网关

[root@server1 ~]# ping 172.25.254.3             

//此时虽然是不同网段,但是可以ping通

2、DNAT    

环境:

server1 内网 172.25.1.1/24

server2 路由 172.25.1.2/24   172.25.254.2/24

server3 外网 172.25.254.3/24

 

分别给三个主机写一个http页面,内容为各自的ip,方便判断连接到的是哪个主机

[root@server1 ~]# yum install -y httpd

[root@server1 ~]# systemctl start httpd

[root@server1 ~]# echo 172.25.1.1 > /var/www/html/index.html              //写一个http页面,内容为172.25.1.1

[root@server2 ~]# yum install -y httpd

[root@server2 ~]# systemctl start httpd

[root@server2 ~]# echo 172.25.1.2 > /var/www/html/index.html              //写一个http页面,内容为172.25.1.1

[root@server3 ~]# yum install httpd

[root@server3 ~]# systemctl start httpd

[root@server3 ~]# systemctl status httpd

[root@server3 ~]# echo 172.25.254.3 > /var/www/html/index.html              //写一个http页面,内容为172.25.254.3

给路由主机添加策略:

现在要把外网访问172.25.254.2的所有流量映射到172.25.1.1上

[root@server2 ~]#  iptables -t nat -A PREROUTING -d 172.25.254.2 -j DNAT --to-destination 172.25.1.1      
[root@server2 ~]#  iptables -t nat -A POSTROUTING -d 172.25.1.1 -j SNAT --to 172.25.1.2

[root@server2 ~]# iptables -nL -t nat

[root@server2 ~]# service iptables save                    //保存策略

[root@server2 ~]# cat  /etc/sysconfig/iptables              //可以查看策略保存的内容

此时,外网用curl命令访问路由主机,相当于http访问:

[root@server3 ~]# curl 172.25.254.2

curl命令查看172.25.1.2内容时出现的不是172.25.1.2而是server1的内容,即172.25.1.1的httpd发布内容

也可以通过ssh远程连接:

[root@server3 ~]# ssh root@172.25.254.2

//本应连接到server2,但此时远程连接上的是server1而不是server2,因为目标地址进行了转换,将172.25.254.2转换成了172.25.1.1

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值