学习centos第十六天---主机防火墙路由

本文详细介绍并演示了SNAT(源地址转换)和DNAT(目的地址转换)的配置与应用,包括如何在不同网络环境下进行IP地址转换,以及在两台虚拟机上进行实验的具体步骤。

一、SNAT(源地址)转换

 

 

下面两图表示未作SNAT和做了SNAT的情况

 

 

SNAT的配置和前提条件:

 

打开IPV4 的转发功能

 

 

把net.IPV4.ip_forward 改成1,表示开启IPV4转发

 

使配置生效。

 

在某些情况下,网关的外网IP地址可能并不是固定的,例如使用ADSL宽带接入时。那么在这种网络环境下,应该如何设置SNAT策略呢?针对这种需求,iptables提供了一个名为MASQUERADE(伪装)的数据包控制类型,MASQUERADE 相当于SNAT的一个特例,同样用来修改(伪装)数据包源IP地址,只不过它能够自动获取外网接口的IP地址,而无需使用 ' —to-source ' 指定固定的IP地址。

 

SNAT实验:

实现内容:准备两台虚拟机,一台centos1 一台centos2,centos1两张网卡,一张桥接到本机,一张为vmnet12,centos 2的网卡也设置成vmnet12 ,假设vmnet12 设公网,桥接的网络是内网;假设内网是192.168.8.0/24网段,公网是192.168.40.0/24,我们要在真实机访问centos2的httpd服务

 

(注意清空filter表,因为SNAT和DNAT走forward,直接拒绝额)

第一步:配置centos1 的两张网卡:eth0和eht1,和centos2的网卡

 

 

cnetos1 双网卡设置

 

 

 

centos 2 的网卡配置

 

 

第二步:开启IPV4 数据包转发

 

 修改vim  /etc/sysctl.conf 文件  把net.IPV4.ip_forward 改成1

 

设置重启后配置任然生效

 

第三步:开启cnetos 1的防火墙,查看nat表,配置SNAT策略(注意清空filter表,因为转发默认是拦截的):

 

清空filter 表

 

查看 nat 表的配置

 

配置SNAT

 

 

第四步查看是否成功:

实体机访问httpd服务器成功

 

实体机ping  httpd服务器

 

2.目的地址转换(DNAT)

当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。

 

DNAT实验:

实现内容:准备两台虚拟机,一台centos1 一台centos2,centos1两张网卡,一张桥接到本机,一张为vmnet12,centos 2的网卡也设置成vmnet12 ,假设vmnet12设内网,桥接的网络是公网;假设公网是192.168.8.0/24网段,内网是192.168.40.0/24,我们要在公网访问内网的服务器

 

(注意清空filter表,因为SNAT和DNAT走forward,直接拒绝额)

第一步:配置centos1 的两张网卡:eth0和eht1,和centos2的网卡

 

cnet0s1 双网卡设置

 

 

 

centos 2 的网卡配置

 

 

 

 

 

 

 

第二步:开启IPV4 数据包转发

 

 修改vim  /etc/sysctl.conf 文件  把net.IPV4.ip_forward 改成1

 

设置重启后配置任然生效

 

 

 

第三步:开启cnetos 1的防火墙,查看nat表,配置SNAT策略(注意清空filter表,因为转发默认是拦截的):

 

清空filter 表

 

查看 nat 表的配置

 

配置DNAT

 

SNAT+DNAT注意事项:

·SNAT策略只能用在nat表的POSTROUTING链;

·SNAT将内部地址的私有IP转换为公网的公有IP

·SNAT用于内部共享IP访问外部。

·DNAT策略只能用在nat表的PREROUTING;

·DNAT主要用于内部服务对外发布;

一张图让你理解DNAT和SNAT

 

3.防火墙规则备份

 

 

4.防火墙还原

iptables-restore   <  /iptables.txt

 

 

 

 

直接路由方式 如下图所示,我们有两个物理主机1主机2,我们在各自宿主机上启动一个centos容器,启动成功之后,两个容器分别运行在两个宿主机之上,默认的IP地址分配如图所示,这也是Docker自身默认的网络。 此时两台主机上的Docker容器如何直接通过IP地址进行通信? 一种直接想到的方案便是通过分别在各自主机添加路由 来实现两个centos容器之间的直接通信 方案原理分析 由于使用容器的IP进行路由,就需要避免不同主机上的容器使用了相同的IP,为此我们应该为不同的主机分配不同的子网来保证。于是我们构造一下两个容器之间通信的路由方案,如下图所示。 如上图 从container1 发往 container2 的数据包,首先发往container1的“网关”docker0,然后通过查找主机1的路由得知需要将数据包发给主机2,数据包到达主机2后再转发给主机2的docker0,最后由其将数据包转到container2中;反向原理相同,不再赘述。 配置过程 1.分别对主机1主机2上的docker0进行配置 [root@host1 ~]# cat /etc/docker/daemon.json {"bip":"172.17.0.254/24"} [root@host2 ~]# cat /etc/docker/daemon.json {"bip":"172.17.1.254/24"} 2.重启docker服务 主机1主机2上均执行如下命令重启docker服务以使修改后的docker0网段生效 systemctl restart docker 3.添加路由规则(到对方网络 互指对方ip为网关) 主机1上添加路由规则如下: [root@host1 ~]# route add -net 172.17.1.0 netmask 255.255.255.0 gw 192.168.0.205 主机2上添加路由规则如下: [root@host2 ~]# route add -net 172.17.0.0 netmask 255.255.255.0 gw 192.168.0.204 4.配置iptables规则 主机1上添加如下规则: [root@host1 ~]# iptables -t nat -F POSTROUTING [root@host1 ~]# iptables -t nat -A POSTROUTING -s 172.17.0.0/24 ! -d 172.17.0.0/16 -j MASQUERADE 如有问题可以添加: iptables -t nat -I PREROUTING -s 172.17.1.0/24 -d 172.17.0.0/24 -j DNAT --to 1 72.17.0.254 主机2上添加如下规则: [root@host2 ~]# iptables -t nat -F POSTROUTING [root@host2 ~]# iptables -t nat -A POSTROUTING -s 172.17.1.0/24 ! -d 172.17.1.0/16 -j MASQUERADE 如有问题添加: iptables -t nat -I PREROUTING -s 172.17.0.0/24 -d 172.17.1.0/24 -j DNAT --to 1 72.17.1.254 测试 主机1上启动centos容器: [root@host1 ~]# docker run -it --name test1 centos7.2 /bin/bash 主机2上启动centos容器 [root@host2 ~]# docker run -it --name test1 centos7.2 /bin/bash ok 通信成功! [root@d079a15a4126 /]# ping 172.17.1.1 -------------------------------------------------------------------------------- 配置过程 1.分别对主机1主机2上的docker0进行配置 [root@host1 ~]# cat /etc/docker/daemon.json {"bip":"172.18.0.1/24"} [root@host2 ~]# cat /etc/docker/daemon.json {"bip":"172.18.1.1/24"} 2.重启docker服务 主机1主机2上均执行如下命令重启docker服务以使修改后的docker0网段生效 systemctl restart docker 3.添加路由规则(到对方网络 互指对方ip为网关) 主机1上添加路由规则如下: [root@host1 ~]# route add -net 172.18.1.0 netmask 255.255.255.0 gw 172.17.10.102 主机2上添加路由规则如下: [root@host2 ~]# route add -net 172.18.0.0 netmask 255.255.255.0 gw 172.17.10.101 4.4.配置iptables规则 主机1上添加如下规则: iptables -t nat -I PREROUTING -s 172.18.1.0/24 -d 172.18.0.0/24 -j DNAT --to 172.18.0.1 主机2上添加如下规则: iptables -t nat -I PREROUTING -s 172.18.0.0/24 -d 172.18.1.0/24 -j DNAT --to 172.18.1.1 测试 主机1上启动centos容器: [root@host1 ~]# docker run -it --name test1 centos:7.9 /bin/bash 主机2上启动centos容器 [root@host2 ~]# docker run -it --name test1 centos:7.9 /bin/bash ok 通信成功! [root@d079a15a4126 /]# ping 172.18.1.1 -------------------------------------------------------------------------------- flannel方式通信(waeve calico) 除此之外我们还可以通过使用第三方工具为不同主机间创建一个覆盖网络,使之能够 跨节点通信 ,这里将使用Flanneld实现; 环境准备 1.主机解析 [root@node1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.0.204 node1.com node1 192.168.0.205 node2.com node2 2.开启路由转发 echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p 3.清除防火墙规则关闭selinux iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -F iptables -L -n 4.安装组件 etcd flannel docker 安装etcd,我们采用了yum方式安装 yum install -y epel-release yum makecache fast yum install etcd -y 至此我们的etcd安装完成。 安装flannel yum install flannel -y 最后我们再安装docker yum install -y yum-utils.noarch ###安装yum的扩张工具集 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ####添加docker-ce的扩展源 yum install -y --setopt=obsoletes=0 docker-ce-17.03.3.ce-1.el7 ####安装docker-ce 最后docker-ce安装完成,我们一定要注意安装顺序,先安装etcdflannel最后安装docker. 更改两台机器的上的etcd配置文件 vim /etc/etcd/etcd.conf ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ####数据存放位置 ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" ####监听其他etcd实列地址 ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001" ####监听客户端地址 ETCD_NAME="node1" ####节点名称 ETCD_INITIAL_ADVERTISE_PEER_URLS="http://node1:2380" ####通知其他成员的etcd地址 ETCD_ADVERTISE_CLIENT_URLS="http://node1:2379,http://node1:4001" ### #通知客户端地址 ETCD_INITIAL_CLUSTER="node1=http://node1:2380,node2=http://node2:2380" ###初始化集群内节点地址 ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ##初始化集群的token ETCD_INITIAL_CLUSTER_STATE="new" ##初始化集群状态,new表示新建 以上是etcd集群的配置上面是node1的配置,node2配置node1一样,只是需要把node1改为node2 ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001" ETCD_NAME="node2" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://node2:2380" ETCD_ADVERTISE_CLIENT_URLS="http://node2:2379,http://node2:4001" ETCD_INITIAL_CLUSTER="node1=http://node1:2380,node2=http://node2:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new" 两台主机都配置好后启动(由于集群需要通信) 最后我们启动etcd,并查看其集群状态 systemctl start etcd 设置为开机启动 systemctl enable etcd 查看启动状态 systemctl status etcd 测试集群 [root@node1 ~]# etcdctl member list 43bb846a7344a01f: name=node2 peerURLs=http://node2:2380 clientURLs=http://node2:2379,http://node2:4001 isLeader=false a9aee06e6a14d468: name=node1 peerURLs=http://node1:2380 clientURLs=http://node1:2379,http://node1:4001 isLeader=true 接下来我们配置flannel 两台配置一致 编辑flannel的配置文件,内容如下 vim /etc/sysconfig/flanneld # Flanneld configuration options # etcd url location. Point this to the server where etcd runs FLANNEL_ETCD_ENDPOINTS="http://192.168.0.204:2379,http://192.168.0.205:2379" # etcd config key. This is the configuration key that flannel queries # For address range assignment FLANNEL_ETCD_PREFIX="/atomic.io/network" # Any additional options that you want to pass #FLANNEL_OPTIONS="" FLANNEL_OPTIONS="--logtostderr=false --log_dir=/var/log/ --etcd-endpoints=http://192.168.0.204:2379,http://192.168.0.205:2379 --iface=ens33" 再启动flannel之前需要向etcd内写入子网信息 etcdctl mk /atomic.io/network/config '{"Network":"10.10.0.0/16", "SubnetMin": "10.10.1.0", "SubnetMax": "10.10.254.0"}' 上面的2处红色字体部分必须一致,可以自定义但是必须一致 子网范围为 10.10.0.0/16,最小子网开始为10.10.1.0 最大子网结束为10.10.254.0,至此自定义子网信息我们已经写入完毕。 接下来,我们来启动flannel,并设置为开机启动 systemctl start flanneld systemctl enable flanneld systemctl status flanneld 我们使用 将会发现 在安装flannel后自动生成配置 DropInPaths=/usr/lib/systemd/system/docker.service.d/flannel.conf vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS 添加上述红色部分即可,引用了flannel的网络 重载配置systemctl daemon-reload 启动docker systemctl start docker node1 node2 分别创建容器测试 主机1上启动centos容器: [root@host1 ~]# docker run -it --name test1 centos7.2 /bin/bash 主机2上启动centos容器 [root@host2 ~]# docker run -it --name test1 centos7.2 /bin/bash [root@bc9b740f6502 /]# ping 10.10.49.2
最新发布
09-10
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值