环境:
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