您现在的位置是:首页 >技术交流 >K8S内容分发网络之集群,nginx,负载均衡,防火墙网站首页技术交流

K8S内容分发网络之集群,nginx,负载均衡,防火墙

天国召唤 2024-06-17 18:01:02
简介K8S内容分发网络之集群,nginx,负载均衡,防火墙

目录

第一章.实验架构需求

 第二章.实验环境准备

2.1.节点准备

2.2.环境准备

2.3.在master,node01,node02上操作安装docker

2.4.所有节点安装kubeadm,kubelet和kubectl

2.5.部署K8S集群

2.6.在master节点操作

2.7.所有节点部署网络插件flannel

第三章.创建两个自主式Pod资源

3.1.生成nginx的pod模板文件

3.2.两个node节点的存储卷,写入不同的html文件内容,验证访问网页

第四章.创建service资源

4.1.编写service对应的yaml文件  

4.2.查看service资源

4.3.测试使用nodeIP:nodePort访问nginx网页  

第五章.搭建负载均衡层

5.1.两台负载均衡器配置nginx

5.2.两台负载均衡器配置keepalived

5.3.关闭主调度器的nginx服务,模拟故障,测试keepalived

第六章.配置防火墙服务器

6.1.两台负载均衡器,将网关地址修改为防火墙服务器的内网IP地址  

6.2.配置iptables策略


第一章.实验架构需求

(1)Kubernetes 区域可采用 Kubeadm 方式进行安装。

(2)要求在 Kubernetes 环境中,通过yaml文件的方式,创建2个Nginx Pod分别放置在两个不同的节点上,Pod使用hostPath类型的存储卷挂载,节点本地目录共享使用 /data,2个Pod副本测试页面二者要不同,以做区分,测试页面可自己定义。

(3)编写service对应的yaml文件,使用NodePort类型和TCP 30000端口将Nginx服务发布出去。

(4)负载均衡区域配置Keepalived+Nginx,实现负载均衡高可用,通过VIP 192.168.10.100和自定义的端口号即可访问K8S发布出来的服务。

(5)iptables防火墙服务器,设置双网卡,并且配置SNAT和DNAT转换实现外网客户端可以通过12.0.0.1访问内网的Web服务。

 第二章.实验环境准备

2.1.节点准备

master192.168.233.100docker、kubeadm、kubelet、kubectl、flannel

node01

192.168.233.111docker、kubeadm、kubelet、kubectl、flannel
node02192.168.233.199docker、kubeadm、kubelet、kubectl、flannel

lb01

192.168.233.69nginx,keepalived
lb02192.168.233.177nginx,keepalived
vip,iptables

192.168.10.100,192.168.233.171,

12.0.0.1

iptables,ens33,ens36
client12.0.0.12ens33

2.2.环境准备

关闭防火墙


systemctl stop firewalld


systemctl disable firewalld


iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
 

#关闭selinux


setenforce 0


sed -i 's/enforcing/disabled/' /etc/selinux/config

关闭swap


swapoff -a


sed -ri 's/.*swap.*/#&/' /etc/fstab 
 

根据规划设置主机名


hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02

hostnamectl set-hostname lb01

hostnamectl set-hostname lb02


#这里设置MASTER和node内存4G起步,2核2处理器起步,最优8G

在master添加hosts

cat >> /etc/hosts << EOF
192.168.233.100 master01
192.168.233.111 node01
192.168.233.199 node02

192.168.233.69 lb01

192.168.233.177 lb02
EOF

调整内核参数


cat > /etc/sysctl.d/k8s.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF

sysctl --system

时间同步


yum install ntpdate -y


ntpdate time.windows.com

2.3.在master,node01,node02上操作安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2 


yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 


yum install -y docker-ce docker-ce-cli containerd.io
 

mkdir /etc/docker

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  }
}
EOF

#使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。  

#日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。  ​  

#重新加载配置,将docker设置为开机自启

#查看Cgroup引擎是否已变更  

docker info | grep "Cgroup Driver"  

Cgroup Driver: systemd

2.4.所有节点安装kubeadm,kubelet和kubectl

定义kubernetes源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
 

yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11

开机自启kubelet
systemctl enable kubelet.service

 #K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启

2.5.部署K8S集群

查看初始化需要的镜像

kubeadm config images list

在 master 节点上传 v1.20.11.zip 压缩包(压缩包中包含所需的镜像文件)至 /opt 目录 

 cd /opt/  

mkdir /opt/k8s  

unzip v1.20.11.zip -d /opt/k8s                            #解压  

cd /opt/k8s/v1.20.11  

for i in $(ls *.tar); do docker load -i $i; done               #载入镜像,将镜像文件导入到镜像库中 docker images                                        #查看本地镜像

复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件

scp -r /opt/k8s root@node01:/opt  

scp -r /opt/k8s root@node02:/opt

cd /opt/k8s/v1.20.11  

for i in $(ls *.tar); do docker load -i $i; done

初始化kubeadm

#master节点,通过如下指令创建默认的kubeadm-config.yaml文件  

kubeadm config print init-defaults > /opt/kubeadm-config.yaml

修改文件  

cd /opt/  

vim kubeadm-config.yaml

.......

11 localAPIEndpoint:  

12   advertiseAddress: 192.168.233.100     #指定master节点的IP地址  

13   bindPort: 6443

.................

34 kubernetesVersion: v1.20.11    #指定kubernetes版本号  

35 networking:  

36   dnsDomain: cluster.local  

38   serviceSubnet: 10.96.0.0/16    #指定service网段  

37   podSubnet: "10.244.0.0/16" #指定pod网段,10.244.0.0/16用于匹配flannel默认网段  

39 scheduler: {}

#末尾再添加以下内容

---  

apiVersion: kubeproxy.config.k8s.io/v1alpha1  

kind: KubeProxyConfiguration  

mode: ipvs                                                    #把默认的kube-proxy调度方式改为ipvs模式

2.6.在master节点操作

在master节点操作,初始化kubeadm,搭建k8s控制平面节点。结尾会有几条命令分别在master和node上执行

kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log

#--experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,K8S V1.16版本开始替换为 --upload-certs  

#tee kubeadm-init.log 用以输出日志

#master节点执行以下命令:  

#kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。

mkdir -p $HOME/.kube  

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config  

sudo chown $(id -u):$(id -g) $HOME/.kube/config

#两个node节点执行以下命令,加入集群:  

kubeadm join 192.168.233.100:6443 --token abcdef.0123456789abcdef      --discovery-token-ca-cert-hash sha256:b48d7bec33150c0f58bd04c17a6b994900fdef116b6ef355282909330b3a23cc  ​

#查看 kubeadm-init 日志  

less kubeadm-init.log

#kubernetes配置文件目录

ls /etc/kubernetes/

#存放ca等证书和密码的目录  

ls /etc/kubernetes/pki

master节点,修改yaml文件,进行健康检查

#初始化后,kubeadm本身没有健康检查方法,需要修改两个yaml文件,之后重启kubelet

kubectl get cs   #查看集群健康状态,有2个组件不健康,需要修改对应组件的yaml文件

 #如果 kubectl get cs 发现集群不健康,更改以下两个yaml文件  

vim /etc/kubernetes/manifests/kube-scheduler.yaml

......  

16     - --bind-address=192.168.233.100   #修改成k8s的控制节点master的ip  

......  

19     #- --port=0     # 搜索port=0,把这一行注释掉  

......  

24       httpGet:  

25         host: 192.168.233.100   #修改成k8s的控制节点master的ip  

......  

38       httpGet:  

39         host: 192.168.233.100   #修改成k8s的控制节点master的ip

vim /etc/kubernetes/manifests/kube-controller-manager.yaml

17     - --bind-address=192.168.233.100           #修改成k8s的控制节点master的ip  

......  

26     #- --port=0                                            # 搜索port=0,把这一行注释掉  

......  

36       httpGet:  

37         host: 192.168.233.100                                #修改成k8s的控制节点master的ip  

......  

50       httpGet:  

51         host: 192.168.233.100                             #修改成k8s的控制节点master的ip

 #重启

kubelet  systemctl restart kubelet

#查看集群健康状态  

kubectl get cs

 

2.7.所有节点部署网络插件flannel

 #在master节点查看所有节点状态,由于网络插件还没有部署,节点没有准备就绪,所以显示NotReady

 kubectl get nodes

NAME     STATUS     ROLES                 AGE     VERSION  master   NotReady   control-plane,master   49m     v1.20.11  node01   NotReady   <none>                 11m     v1.20.11  node02   NotReady   <none>                 4m41s   v1.20.11

所有节点部署网络插件flannel

(1)方法一:  #所有节点上传flannel镜像 flannel.tar 到 /opt 目录,master节点上传 kube-flannel.yml 文件。

 #kube-flannel.yml 文件的下载地址https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

 cd /opt  

docker load -i flannel.tar                       #所有节点导入镜像

#在 master 节点创建 flannel 资源  

kubectl apply -f kube-flannel.yml

##(2)方法二:  kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

#现在在master节点查看节点状态,都已是Ready状态  

kubectl get nodes  

NAME     STATUS   ROLES                 AGE   VERSION  

master   Ready   control-plane,master   136m   v1.20.11  

node01   Ready   <none>                 98m   v1.20.11  

node02   Ready   <none>                 92m   v1.20.11

 

#查看各组件,都是Running状态  

kubectl get pods -n kube-system  

NAME                             READY   STATUS   RESTARTS   AGE  

coredns-74ff55c5b-788pc          1/1     Running   0         137m  

coredns-74ff55c5b-9hfnv          1/1     Running   0         137m  

etcd-master                      1/1     Running   0         137m  

kube-apiserver-master            1/1     Running   0         137m  

kube-controller-manager-master   1/1     Running   0         45m  

kube-flannel-ds-8ck6r            1/1     Running   0         3m10s  

kube-flannel-ds-9svrq            1/1     Running   0         3m10s  

kube-flannel-ds-fxpwt            1/1     Running   0         3m10s  

kube-proxy-22mgq                 1/1     Running   0         137m  

kube-proxy-2lx25                 1/1     Running   0         93m  

kube-proxy-s5s75                 1/1     Running   0         99m  

kube-scheduler-master            1/1     Running   0         62m

 

第三章.创建两个自主式Pod资源

要求在 Kubernetes 环境中,通过yaml文件的方式,创建2个Nginx Pod分别放置在两个不同的节点上,Pod使用hostPath类型的存储卷挂载,节点本地目录共享使用 /data,2个Pod副本测试页面二者要不同,以做区分,测试页面可自己定义。

3.1.生成nginx的pod模板文件

kubectl run mynginx --image=nginx:1.14 --port=80 --dry-run=client -o yaml > mynginx.yaml

修改模板文件

vim mynginx.yaml

---  

apiVersion: v1  

kind: Pod  

metadata:  

labels:    

app: yuji-nginx                                       #pod的标签  

name: yuji-nginx01  

spec:  

nodeName: node01       #指定该pod调度到node01节点  

containers:    

- image: nginx:1.14    

name: mynginx    

ports:    

- containerPort: 80                               #定义容器的端口    

volumeMounts:                                    #挂载存储卷      

- name: page01                         #名称需要与下方定义的存储卷的名称一致      

mountPath: /usr/share/nginx/html        #容器中的挂载点,设置为nginx服务的网页根目录       readOnly: false                                 #可读可写  

volumes:                                      #定义一个存储卷    

- name: page01                         #存储卷的名称    

hostPath:                          #存储卷的类型为 hostPath      

path: /data                           #node节点的共享目录      

type: DirectoryOrCreate          #该类型表示如果共享目录不存在,则系统会自动创建该目录  

---  

apiVersion: v1  

kind: Pod  

metadata:  

labels:    

app: yuji-nginx                                  #pod的标签  

name: yuji-nginx02  

spec:  

nodeName: node02                             #指定该pod调度到node02节点  

containers:    

- name: mynginx    

image: nginx:1.14    

ports:    

 - containerPort: 80                                        #定义容器的端口    

volumeMounts:                                         #挂载存储卷      

- name: page02                           #名称需要与下方定义的存储卷的名称一致      

mountPath: /usr/share/nginx/html                              #容器中的挂载点      

readOnly: false  

volumes:                                               #定义一个存储卷  

 - name: page02                               #存储卷的名称    

hostPath:                                      #存储卷类型为 hostPath      

path: /data                     #node节点的共享目录      

type: DirectoryOrCreate       #该类型表示如果共享目录不存在,则系统会自动创建该目录

---
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: mynginx
  name: cxk-nginx01
spec:
  nodeName: node01
  containers:
  - image: nginx:1.14
    name: mynginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: page01
      mountPath: /usr/share/nginx/html
      readOnly: false
  volumes:
  - name: page01
    hostPath:
      path: /data

---
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: mynginx
  name: cxk-nginx02
spec:
  nodeName: node02
  containers:
  - image: nginx:1.14
    name: mynginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: page02
      mountPath: /usr/share/nginx/html
      readOnly: false
  volumes:
  - name: page02
    hostPath:
      path: /data

 

 

#使用yaml文件创建自主式Pod资源  

kubectl apply -f mynginx.yaml

 #查看创建的两个pod,被调度到了不同的node节点  

kubectl get pods -o wide  

NAME           READY   STATUS   RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES  

yuji-nginx01   1/1     Running   0         9m16s   10.244.1.2   node01   <none>           <none>  yuji-nginx02   1/1     Running   0         9m16s   10.244.2.4   node02   <none>           <none>

 

3.2.两个node节点的存储卷,写入不同的html文件内容,验证访问网页

 #node01节点  

echo "this is node01" > /data/index.html  ​  

#node02节点  

echo "this is node02 ~~" > /data/index.html

curl 10.244.1.5                        #访问Node01节点的Pod的IP

 curl 10.244.2.3                         访问Node02节点的Pod的IP

 

第四章.创建service资源

编写service对应的yaml文件,使用NodePort类型和TCP 30000端口将Nginx服务发布出去。

4.1.编写service对应的yaml文件  

vim myservice.yaml

apiVersion: v1  

kind: Service  

metadata:    

name: yuji-nginx-svc    

namespace: default    

spec:  

type: NodePort                       #service类型设置为NodePort  

ports:    

- port: 80                            #service使用的端口号,ClusterIP后面跟的端口号。    

targetPort: 80                           #需要转发到的后端Pod的端口号    

nodePort: 30000             #指定映射到物理机的端口号,k8s集群外部可以使用nodeIP:nodePort访问service  

selector:                

app: yuji-nginx                    #标签选择器要和上一步创建的pod的标签保持一致

apiVersion: v1
kind: Service
metadata:
  name: cxk-nginx
  namespace: default
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30000
  selector:
    app: mynginx

 

 #创建service资源      

kubectl apply -f myservice.yaml

4.2.查看service资源

kubectl get svc  

NAME             TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)       AGE  

kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP       27h  

yuji-nginx-svc   NodePort    10.96.100.164   <none>        80:30000/TCP   76s

 

#查看service资源的详细信息  

kubectl describe svc yuji-nginx-svc

 

4.3.测试使用nodeIP:nodePort访问nginx网页  

curl 192.168.233.111:30000                   #node01  ​  

curl 192.168.233.199:30000                  #node02

 

第五章.搭建负载均衡层

负载均衡区域配置Keepalived+Nginx,实现负载均衡高可用,通过VIP 192.168.10.100和自定义的端口号即可访问K8S发布出来的服务。

  • lb01:192.168.233.69
  • lb02:192.168.233.177
  • VIP:192.168.233.11

5.1.两台负载均衡器配置nginx

关闭防火墙和selinux  

systemctl stop firewalld  

systemctl disable firewalld  

setenforce 0  

sed -i 's/enforcing/disabled/' /etc/selinux/config

设置主机名  

hostnamectl set-hostname lb01  

su  

hostnamectl set-hostname lb02  

su

#配置nginx的官方在线yum源

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum install nginx -y  ​

#修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台node的节点ip和30000端口  

vim /etc/nginx/nginx.conf

 

events {
    worker_connections  1024;
}

#在http块上方,添加stream块

stream {
    log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';

    access_log  /var/log/nginx/k8s-access.log  main;

    upstream k8s-apiserver {
        server 192.168.233.111:30000;                          #node01+端口
        server 192.168.233.199:30000;                         #node02+端口
    }
    server {
        listen 3030;                             #自定义端口
        proxy_pass k8s-apiserver;
    }
}

http {

.......

#include /etc/nginx/conf.d/*.conf;   #建议将这一行注释掉,否则会同时加载/etc/nginx/conf.d/default.conf文件中的内容,nginx会同时监听80端口。  

}

 

#检查配置文件语法是否正确  

nginx -t

 

启动nginx服务,查看到已监听3344端口

systemctl start nginx  

systemctl enable nginx  

netstat -natp | grep nginx

 

 

5.2.两台负载均衡器配置keepalived

#安装keepalived服务  

yum install keepalived -y

#修改keepalived配置文件  

vim /etc/keepalived/keepalived.conf

 

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id NGINX_MASTER
}
vrrp_script check_nginx {
    script "/etc/nginx/check_nginx.sh"
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.233.11
    }
    track_script {
        check_nginx
    }
}

 

#主调度器lb01创建nginx状态检查脚本  

vim /etc/nginx/check_nginx.sh

 

#!/bin/bash
#egrep -cv "grep|"用于过滤掉包含grep或者表示的当前Shell进程ID,即脚本运行的当前进程ID号
count=$(ps -ef | grep nginx | egrep -cv "grep|$$")

if [ "$count" -eq 0 ];then
    systemctl stop keepalived
fi

 

chmod +x /etc/nginx/check_nginx.sh                   #为脚本增加执行权限

#启动keepalived服务(一定要先启动了nginx服务,再启动keepalived服务,否则keepalived检测到nginx没有启动,会杀死自己)  

systemctl start keepalived  

systemctl enable keepalived  

ip a                                                       #查看主节点的VIP是否生成

 

 

#测试使用VIP:3344访问web网页  

curl 192.168.233.11:3030

 

5.3.关闭主调度器的nginx服务,模拟故障,测试keepalived

 #关闭主调度器lb01的Nginx服务,模拟宕机,观察VIP是否漂移到备节点  

systemctl stop nginx  

ip a  

systemctl status keepalived   #此时keepalived被脚本杀掉了,这里不模拟了,上面vip在node02就是结果

#备节点查看是否生成了VIP  

ip addr                                                 #此时VIP漂移到备节点lb02

#恢复主节点  

systemctl start nginx        

#先启动nginx  

systemctl start keepalived    

#再启动keepalived

ip a

 

第六章.配置防火墙服务器

iptables防火墙服务器,设置双网卡,并且配置SNAT和DNAT转换实现外网客户端可以通过12.0.0.1访问内网的Web服务。

  • 内网网卡ens33:192.168.233.1
  • 外网网卡ens36:12.0.0.1

 

 

6.1.两台负载均衡器,将网关地址修改为防火墙服务器的内网IP地址  

vim /etc/sysconfig/network-scripts/ifcfg-ens33  

GATEWAY="192.168.233.1"  ​

 

systemctl restart network                             #重启网络  

systemctl restart keepalived             #如果VIP丢失,需要重启一下keepalived

配置防火墙服务器  

#-------------关闭防火墙和selinux-------------  

systemctl stop firewalld  

systemctl disable firewalld  

setenforce 0  

sed -i 's/enforcing/disabled/' /etc/selinux/config

开启路由转发功能

vim /etc/sysctl.conf  net.ipv4.ip_forward = 1     //在文件中增加这一行,开启路由转发功能

sysctl -p   //加载修改后的配置

6.2.配置iptables策略

#先将原有的规则清除  

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

#设置SNAT服务,解析源地址。修改nat表中的POSTROUTING链。  

#将源地址192.168.233.11转换为为12.0.0.1  

iptables -t nat -A POSTROUTING -s 192.168.233.0/24 -o ens36 -j SNAT --to 12.0.0.1

 

#-t nat                 //指定nat表  

#-A POSTROUTING         //在POSTROUTING链中添加规则   

#-s 192.168.233.11/24   //数据包的源地址  

#-o ens36               //出站网卡  

#-j SNAT --to 12.0.0.1   //使用SNAT服务,将源地址转换成公网IP地址。

注:这里需要把lb01,lb02的网卡地址改成防火墙服务器的IP地址192.168.233.171

iptables这里的网卡需要加物理网卡,需要修改ens36的地址12.0.0.1,注释掉ens33,ens36的网关。

 

 

#设置DNAT服务,解析目的地址。修改nat表中的PRETROUTING链。  

#将目的地址12.0.0.1:3030 转换成 192.168.233.11:3030 

iptables -t nat -A PREROUTING -i ens36 -d 12.0.0.1 -p tcp --dport 3030 -j DNAT --to 192.168.233.11:3030   

#-A PREROUTING               //在PREROUTING链中添加规则          

#-i ens36             //入站网卡   

#-d 12.0.0.254         //数据包的目的地址   

#-p tcp --dport 3030  //数据包的目的端口   

#-j DNAT --to 192.168.233.11:3030   //使用DNAT功能,将目的地址和端口转换成192.168.233.11:3030

iptables -t nat -nL                                     #查看策略

 

##客户端修改网关配置文件,测试访问内网的Web服务  

客户端IP地址:12.0.0.12,将网关地址设置为防火墙服务器的外网网卡地址:12.0.0.1  

 

浏览器输入 http://12.0.0.1:3030 进行访问

 

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。