iptables防火墙(二)_防火墙

iptables防火墙(二)_防火墙_02

实现NAT功能 所需要的环境: 三台主机,

一台做内网主机桥节点V8 192.168.1.2/24  网关192.168.1.1

一台做防火墙(路由器)装两块网卡V8 ens33 192.168.1.1/24 V1 ens37 200.0.0.1/24

一台做外网主机V1 200.0.0.2/24  无网关

做路由器的主机需要开启路由转发

vim /etc/sysctl.conf

最后加一条

net.ipv4.ip_forward=1

保存退出

sysctl -p

使它生效

tcpdump -i ens33   抓包 测试

IP 200.0.0.1 > localhost.localdomain: ICMP echo request, id 58854, seq 172, length 64echo request ping请求

来自200.0.0.1localhost(目标主机).localdomain(这个名字本机的主机名) ICMP  echo request (ping请求)

IP localhost.localdomain > 200.0.0.1: ICMP echo reply, id 58854, seq 172, length 64

从本机localdomain  返回到200.0.0.1 echo reply ping相应

对ens33网卡的流量 进行抓包

关闭firewalld防火墙


配置防火墙策略 此时的内部主机是访问不到外部的

让内部主机1.2 访问达到外部主机2.2  

数据包走向图:

iptables防火墙(二)_服务器_03


内部主机1.2需要在POSTROUTING 位置换成公网ip 出去 访问外部主机2.2

需要在POSTROUTING 链设置规则

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens37 -j SNAT --to 200.0.0.1

-s来自 1.0/24 网段-o 从 ens37网卡出去的报文-j SNAT –to源地址转换 换成外部接口的ip地址 200.0.0.1

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens37 -j MASQUERADE

原来是声明 把源地址换成谁 现在是MASQUERADE 的意思是 :来自1.0/24网段 从ens37网卡出去的时候 伪装成 外部接口ip  MASQUERADE(伪装)

iptables防火墙(二)_服务器_04

tcpdump -i ens33

IP 200.0.0.1 > localhost.localdomain: ICMP echo request, id 58854, seq 172, length 64echo request ping请求

来自200.0.0.1localhost(目标主机).localdomain(这个名字本机的主机名) ICMP  echo request (ping请求)

IP localhost.localdomain > 200.0.0.1: ICMP echo reply, id 58854, seq 172, length 64

从本机localdomain  返回到200.0.0.1 echo reply ping相应

对ens33网卡的流量 进行抓包

说明1.2从路由器 出来的时候 确实换成200.0.0.1了

200.0.1和200.0.2 是直连的 属于互联网公网当中的网段 所以200.0.2 能识别 所以回包 回来以后 路由器 再给转换回去 最终 在1.2 能看到通信的过程


如果要访问网站 在外网0.2 开启httpd  

1.2 是可以访问到外网的

看日志也可以看到 apache的rpm 日志位置

/var/log/httpd/access_log


现在做个改变:让内部1.2主机 改成服务器

我想让外网主机 可以访问到 内网主机 


需要在路由器 上PREROUTING 上做目标转换

当外部主机0.2访问 公有ip 0.1的时候 路由器就会把她送到1.2去

启动httpd

在路由器上设置

iptables -t nat -A PREROUTING -d 200.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.1.2:80

-d 目标ip是200.0.0.1 的tcp协议80端口的流量 转换为192.168.1.2 80端口



内部服务器希望能够被远程登录 ssh tcp/22

iptables -t nat -A PREROUTING -d 200.0.0.1 -p tcp --dport 2222 -j DNAT --to 192.168.1.2:22

ssh远程登录 访问 200.0.0.1:2222  端口的时候 去访问1.2 的22端口

ssh -p 2222 200.0.0.1

内部还有其他主机 还有其他服务 按照这种语法写就可以

目标转换 不影响 源操作 不影响源地址转换



清空nat表

iptables -t nat -F

清空filter表

iptables -F

这时候内部访问外部 外部访问内部都是不通的了



开始实验:


允许内网主机远程登录及ping通网关


不允许外网主机ping网关,只允许响应包及SSH请求(200.0.0.2)进入网关


允许内网主机访问外网所有服务(SNAT)


允许外网主机远程登录内部服务器及WEB访问(DNAT)


内部服务器只允许SSH及WEB访问(主机过滤)


禁止内部主机pc1访问访问外部网络


先设置默认策略

iptables -P INPUT DROP

禁止任何流量访问 防火墙本机

允许内网主机远程登录及ping通网关

iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type 8 -j ACCEPT

允许来自1.0/24网段的 icmp 协议8 ping请求

iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT

允许来自1.0/24 网段 的 tcp22 端口 进入 22端口也就是ssh 远程控制



不允许外网主机ping网关,只允许响应包及SSH请求(200.0.0.2)进入网关

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

允许 已经建立的连接或相应报文 对方的响应包 响应包就是出去以后回来的包

ESTABLISHED  已建立连接的或相应报文:两个主机之间首先通信之前tcp的三次握手,发请求出去,对方给我响应包,ESTABLISHED 就包括响应包 在建立建立完后 后面是通信过程 因为已经建立连接了 通信过程就是被允许的了 ESTABLISHED 代表已建立连接的或响应报文(不包括请求报文)

iptables -A INPUT -s 200.0.0.2 -p tcp --dport 22 -j ACCEPT

允许 来自200.0.0.2主机的 tcp协议目标端口 22 的流量 22 也就是ssh 

允许内网主机访问外网所有服务(SNAT)

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens37 -j MASQUERADE

来自1.0/24网段 的流量 去往ens37 网卡 的将被 伪装成 网关ip出去  源地址转换

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens37 -j SNAT --to 200.0.0.1

来自1.0/24网段的流量 去往ens37网卡 的将被 换成200.0.0.1 ip 出去  源地址转换

允许外网主机远程登录内部服务器及WEB访问(DNAT)

iptables -t nat -A PREROUTING –d 200.0.0.1 -p tcp --dport 2222 -j DNAT --to 192.168.1.2:22

目标ip200.0.0.1 的tcp 2222 端口的流量 将被 送往192.168.1.2 的22 端口

iptables -t nat -A PREROUTING -d 200.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.1.2:80

目标ip是200.0.0.1 的 tcp 80端口 的流量 将被送往192.168.1.2的80端口


内部服务器只允许SSH及WEB访问(主机过滤)


切换内部主机 设置单机防火墙

iptables -P INPUT DROP

设置默认选项 拒绝所有流量

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

允许 tcp 22和80 端口 流量访问

因为 拒绝所有流量 当本机访问别人的时候 还要回包呢 这时候回包的流量也是拒绝的

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

允许 已经建立的连接或相应报文 对方的响应包

ESTABLISHED  已建立连接的或相应报文:两个主机之间首先通信之前tcp的三次握手,发请求出去,对方给我响应包,ESTABLISHED 就包括响应包 在建立建立完后 后面是通信过程 因为已经建立连接了 通信过程就是被允许的了 ESTABLISHED 代表已建立连接的或响应报文(不包括请求报文)



禁止内部主机pc1访问访问外部网络

iptables -A FORWARD -s 192.168.1.2 -j DROP

禁止 来自192.168.1.2的流量



将这些条目 保存到文件里

iptables-save > /opt/ipc

vim /etc/rc.d/rc.local

最后一行加入

iptables-restore < /opt/ipt
保存退出chmod +x /etc/rc.d/rc.local  给脚本加执行权限
systemctl disable firewalld    使其开机禁用


vim /etc/sysconfig/selinux

这个更多针对于文件系统做监控的 访问那个文件系统 或改变以后会提醒 更细化的一般都关闭 就是敲 setenforce 0 其实关闭selinux的

将里面的SELINUX=enforcing

改为

SELINUX=disabled

这样开机的相当于自动关闭掉了

保存退出

这样重启策略就生效了




1、允许其他机器ping通防火墙

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

2、以下是防火墙本机ping其他机器的设置

2.1 能ping通IP

iptables –A INPUT –p icmp --icmp-type echo-reply –j ACCEPT
iptables –A OUTPUT –p icmp --icmp-type echo-request –j ACCEPT


2.2 能ping通回环地址

iptables -A INPUT -i lo -p all -j ACCEPT
iptables –A OUTPUT –o lo –p all –j ACCEPT

2.3 能ping通域名

iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT  -p udp --sport 53 -j ACCEPT