目录
iptables 是Linux里的防火墙工具
Linux系统内部有一个内核(kernel),里面有一个模块(netfilter)来实现对tcp/ip协议族的一些过滤
netfilter模块:专门对进出系统的数据进行过滤
iptables:给netfilter模块传递参数的一个工具
- [root@localhost ~]# cat /etc/centos-release 查看系统版本
- CentOS Linux release 7.9.2009 (Core)
- [root@localhost ~]# uname -r 查看内核版本
- 3.10.0-1160.el7.x86_64
el7指enterprise linux 7
Network Address Translation 网络地址转换
解决了:IPV4地址不足,不能给每个人或每个设备都分配足额的ip地址的问题
NAT:将公网转为私网,将私网转为公网
公网IP:互联网上使用
私有IP:局域网里使用
(一个局域网共用一个公网IP地址上网)
Source Network Address Translation 源地址转换
原理:修改数据包的源IP地址
典型应用环境:局域网主机共享单个公网IP地址接入Internet

Linux网关服务器:可以理解为一台路由器
NAT功能的实现就是通过netfilter模块来实现的,iptables给netfilter传递参数
NAT转换表(映射表):存放在Linux内核里netfilter模块里
(1)有很多公网IP地址的场景

(2)PAT:通过IP地址和端口号区分不同主机(共用一个公网IP地址)



VMvare Network Adapter VMnet1 ==》NAT模式(网络地址转换)
VMvare Network Adapter VMnet8 ==》hostonly模式(仅主机模式)
VMvare Network Adapter VMnet0 ==》bridge模式(桥接模式)


1. hostonly模式:虚拟机只能和我们的真实机器通信==》原因:虚拟机没有配置网关
真实机器通过vmnet1和虚拟机连接

2. NAT模式:网络地址转换。==》优点:隐藏内部网络;缺点:速度慢(经过的转换太多,每过一层就要修改一次数据包)
真实机器通过Vmnet8连接虚拟机

3. 桥接模式:虚拟机可以和本地通信,也可以和局域网里的其他的真实机器或者也是桥接模式的虚拟机通信。
VMware会虚拟出一个交换机,桥接模式的虚拟机和真实机器都是连接在这个虚拟的交换机上。
桥接模式里的虚拟机和真实机器的地位是一样的,都是通过外面的路由器上网,而且和真实机器在相同网段。
【注】桥接模式下,真实机器和虚拟机的IP要在同一网段,所以他们的网关、DNS也都要相同

💥选择桥接到有线网卡、无线网卡或自动。有线==》选Realtek PCIe。无线==》Qualcomm Atheros。不知道就选自动。(注意:无线网卡并不是……WIFI)

准备两台虚拟机:
centos 7 64位:作为内部客户机
centos 7-Ting:作为网关服务器(需要两个网络适配器)

内网用hostonly(防止IP地址冲突,自己手动配置网关即可),外网用桥接

准备两台虚拟机
第一步:设置好网卡模式
天龙八部无线路由器:192.168.1.1
网关服务器——centos 7-Ting: hostonly(ens37:192.168.255.254)
桥接(ens33:192.168.1.110;网关:192.168.1.1)
内部客户机——centos 7 64位: hostonly:192.168.255.132 网关:192.168.255.254
第二步:给虚拟机配置好IP地址
【centos 7 64位】
- [root@localhost ~]# cd /etc/sysconfig/network-scripts/
- [root@localhost network-scripts]# cat ifcfg-ens33
- BOOTPROTO="none"
- NAME="ens33"
- UUID="53b58e1e-92a7-48c8-a480-8eb13ed58ba2"
- DEVICE="ens33"
- ONBOOT=yes
- IPADDR=192.168.255.132
- NERMASK=255.255.255.0
- GATEWAY=192.168.255.254
- DNS1=114.114.114.114
- DNS2=192.168.255.254
- [root@localhost network-scripts]#
【centos 7-Ting】
==ens33
- [root@localhost network-scripts]# cat ifcfg-ens33
- BOOTPROTO="none"
- NAME="ens33"
- UUID="4c40cec7-ea15-448e-9589-9a640bf9a6f0
- DEVICE="ens33"
- ONBOOT="yes"
- IPADDR=192.168.1.110
- PREFIX=24
- GATEWAY=192.168.1.1
- DNS1=114.114.114.114
==ens37:不需要配网关和DNS
- [root@localhost network-scripts]# cat ifcfg-ens37
- BOOTPROTO="none"
- NAME="ens37"
- DEVICE="ens37"
- ONBOOT="yes"
- IPADDR=192.168.255.254
- PREFIX=24
【配置完成后,要刷新服务:service network restart】
【检查】
- [root@localhost network-scripts]# ip add
- 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- inet 127.0.0.1/8 scope host lo
- valid_lft forever preferred_lft forever
- inet6 ::1/128 scope host
- valid_lft forever preferred_lft forever
- 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
- link/ether 00:0c:29:bd:89:f9 brd ff:ff:ff:ff:ff:ff
- inet 192.168.1.110/24 brd 192.168.1.255 scope global noprefixroute ens33
- valid_lft forever preferred_lft forever
- inet6 fe80::20c:29ff:febd:89f9/64 scope link
- valid_lft forever preferred_lft forever
- 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
- link/ether 00:0c:29:bd:89:03 brd ff:ff:ff:ff:ff:ff
- inet 192.168.255.254/24 brd 192.168.255.255 scope global noprefixroute ens37
- valid_lft forever preferred_lft forever
- inet6 fe80::20c:29ff:febd:8903/64 scope link
- valid_lft forever preferred_lft forever
- [root@localhost network-scripts]# ip route #看网关
- default via 192.168.1.1 dev ens33 proto static metric 100
- 192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.110 metric 100
- 192.168.255.0/24 dev ens37 proto kernel scope link src 192.168.255.254 metric 101
网络检验(在客户机):
ping 192.168.255.254 ==》可以ping通
ping 192.168.1.110 ==》可以ping通
ping 192.168.1.1 ==》ping不通(因为数据回不来)
第三步:开启网关主机的路由转发功能(方法见2.2.3)
echo 1 > /proc/sys/net/ipv4/ip_forward ==》临时
vim /etc/sysctl.conf ==》 net.ipv4.ip_forward=1 ==》 永久开启(sysctl -p 让内核重新加载新的配置)
第四步:添加使用SNAT策略的防火墙规则(建议写到脚本里,更加便捷)
iptables -t nat -A POSTROUTING -s 192.168.255.0/24 -o ens33 -j SNAT --to-source 192.168.1.110
-t nat 指定在nat表里操作
-A POSTROUTING 在POSTROUTING位置追加一条规则 A:表示append
-s 192.168.255.0/24 指定从防火墙通过的数据包里的源ip地址来自192.168.255.0/24网段
-o ens33 从ens33接口出去 out-interface
-j SNAT 采取SNAT策略,进行源ip地址的转换
--to-source 192.168.1.110 将ip包里的源IP地址修改为192.168.1.110(你是从哪个地址出去的就填哪个)
===查看nat表里的规则
-
- [root@localhost network-scripts]# iptables -t nat -L -n
- Chain POSTROUTING (policy ACCEPT)
- target prot opt source destination
- SNAT all -- 192.168.255.0/24 0.0.0.0/0 to:192.168.1.110
==脚本
- [root@localhost ~]# cat snat.sh
- #!/bin/bash
-
- # clear firewall rules in iptables
- iptables -F
- iptables -t nat -F
-
- # enabling routing
- echo 1 >/proc/sys/net/ipv4/ip_forward
-
- # enable the SNAT function
- iptables -t nat -A POSTROUTING -s 192.168.255.0/24 -o ens33 -j SNAT --to-source 192.168.1.110
- [root@192 ~]# bash snat.sh
- [root@192 ~]# iptables -t nat -L -n #以数字的形式查看nat表里的规则
第五步:验证(要求都能通)
内部客户机:
ping 192.169.255.254
ping 192.168.1.110
ping 192.168.1.1
ping 114.114.114.114
- [root@localhost ~]# tracepath -n 114.114.114.114
- 1?: [LOCALHOST] pmtu 1500
- 1: 192.168.255.254 0.892ms
- 1: 192.168.255.254 1.066ms
- 2: 192.168.1.1 3.740ms
- 3: 192.168.0.1 3.589ms
- 4: 192.168.0.1 4.216ms pmtu 1492
- 4: 175.8.224.1 16.629ms
- 5: 61.187.5.241 10.459ms
- 6: no reply
1. 临时开启
echo 1 > /proc/sys/net/ipv4/ip_forward
【注】vi无法写入,这是一个特殊文件,只能用echo重定向
- [root@localhost network-scripts]# cat /proc/sys/net/ipv4/ip_forward
- 0
2. 永久开启
vim /etc/sysctl.conf
添加一行(添加配置,开启路由转发功能):net.ipv4.ip_forward=1

让内核重新加载新的配置,开启路由转发功能:sysctl -p
![]()
典型应用环境:在Internet中发布位于企业局域网内的服务器
发布:公开出去(背后是对资源的管控)
将一个网络里的服务器发布处来,让另外的网络可以访问

原理:目标地址转换,Destination Network Address Translation
修改数据包的目标IP地址
实现公有IP到私有IP的转换

直接在snat实验的基础上去做即可
局域网的Web服务器正确设置了IP地址
局域网的Web服务器正确设置了默认网关地址
内网服务器:centos 7 64位
1.网关的服务器配置好ip和网关,dns,关闭防火墙
网关服务器本身相当于一个防火墙,只充当一个转发作用。
service firewalld stop #关闭防火墙
2.内网的服务器搭建好web服务,启动nginx
==》安装web的脚本
- #!/bin/bash
-
- #解决软件的依赖关系,需要安装的软件包
- yum install epel-release -y
- yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake make psmisc net-tools lsof vim geoip geoip-devel wget -y
-
- #新建luogan用户和组
- id lilin || useradd lilin -s /sbin/nologin
-
- #下载nginx软件
- mkdir /lilin99 -p
- cd /lilin99
- wget
- https://nginx.org/download/nginx-1.21.4.tar.gz
-
- #解压软件
- tar xf nginx-1.21.4.tar.gz
- #进入解压后的文件夹
- cd nginx-1.21.4
-
- #编译前的配置
- ./configure --prefix=/usr/local/sclilin99 --user=lilin --group=lilin --with-http_ssl_module --with-threads --with-http_v2_module --with-http_stub_status_module --with-stream --with-http_geoip_module --with-http_gunzip_module
==》访问自己的网页
- [root@localhost ~]# curl 192.168.255.132
- <html>
- <head>
- <title>welcome to sanchuangtitle>
- head>
- <body>
- <h1> <p>name: fzth1>
- <p>phoneNO:secret
- <p>address: hunan.changsha
- <p>sex:female
- <p><img src=IMG_7438.JPG width=500>
- body>
- html>
【举例解释命令含义】网关服务器开启路由功能配置好dnat策略
iptables -t nat -A PREROUTING -i eth0 -d 192.168.0.127 -p tcp --dport 80 -j DNAT --to-destination 192.168.88.27
-t nat 指定在nat表里操作
-A PREROUTING 在PREROUTING位置追加一条规则
-i eth0 从eth0接口进入系统
-d 218.28.30.3 目的ip地址是218.28.30.3
-p tcp --dport 80 传输层使用tcp协议,同时目的端口是80
-j DNAT 采取DNAT策略
--to-destination 192.168.1.6 修改目的ip为192.168.1.6
3.【和上面snat的脚本结合】bash就行
- [root@localhost ~]# cat snat_dnat.sh
- #!/bin/bash
-
- # clear firewall rules in iptables
- iptables -F
- iptables -t nat -F
-
- # enabling routing
- echo 1 >/proc/sys/net/ipv4/ip_forward
-
- # enable the SNAT function
- iptables -t nat -A POSTROUTING -s 192.168.255.0/24 -o ens33 -j SNAT --to-source 192.168.1.110
-
- # setting DNAT policy
- iptables -t nat -A PREROUTING -d 192.168.1.110 -p tcp --dport 80 -i ens33 -j DNAT --to-destination 192.168.255.132
4.查看
- [root@localhost ~]# iptables -t nat -L -n
- Chain PREROUTING (policy ACCEPT)
- target prot opt source destination
- DNAT tcp -- 0.0.0.0/0 192.168.1.110 tcp dpt:80 to:192.168.255.132
-
- Chain POSTROUTING (policy ACCEPT)
- target prot opt source destination
- SNAT all -- 192.168.255.0/24 0.0.0.0/0 to:192.168.1.110
5. 浏览器访问192.168.1.110
DNAT如何发布内网不同的服务器呢?
使用不同的端口号来对应内网不同的IP地址服务器
iptables -t nat -A PREROUTING -i eth0 -d 192.168.0.127 -p tcp --dport 80 -j DNAT --to-destination 192.168.88.27
iptables -t nat -A PREROUTING -i eth0 -d 192.168.0.127 -p tcp --dport 8080 -j DNAT --to-destination 192.168.88.88
dnat修改IP包的目的IP地址,还可以修改tcp或者udp里的目的端口号==》最后没加端口号的话,默认和进来的端口一样
- # 发布跳板机192.168.88.37
- # 这样就只要添加一条DNAT策略,用户访问到跳板机,然后通过跳板机ssh到内网的其他服务器
- iptables -t nat -A PREROUTING -i eth0 -d 192.168.0.127 -p tcp --dport 2233 -j DNAT --to-destination 192.168.88.37:22
- #访问192.168.0.127的2233端口,就相当于转到192.168.88.37的22端口
- # 为什么转到22端口:因为192.168.88.37中ssh服务监听的22端口