0
点赞
收藏
分享

微信扫一扫

iptables+NAT专题学习(kvm+VMware)

奔跑的酆 2022-03-24 阅读 36

iptables基础操作(必学)

## 查看规则
iptables -nL
iptables -nL -t nat

iptables -nL -v --line-numbers -t filter    表filter带行号带流量数据
iptables -nL --line-numbers        带行号

## 删除指定表指定链的指定行数据
iptables -t nat -D POSTROUTING 1 
iptables -D FORWARD 7 -t filter

## 清空所有规则【默认是filter表】 
iptables -F 
iptables -X 
iptables -Z 
iptables -t nat -F 
iptables -t nat -X iptables -t nat -Z

iptables查看、添加、删除规则(可选学习)

blog.csdn.net/qq_31812703/article/details/79723033

iptables中DNAT和SNAT详解(可选学习)

blog.csdn.net/lee244868149/article/details/45147533

iptables中DNAT、SNAT和MASQUERADE详解(可选学习)

www.freesion.com/article/7430782361/


实战1:VMware实现iptables NAT及端口映射(首选借鉴)

blog.csdn.net/weixin_30407613/article/details/96932156

一、简单的NAT路由器

NAT需求介绍

网关2个网络接口

Lan口: 172.16.10.5/24    eth0

Wan口: 10.0.0.5/24      eth1

目的:实现内网中的节点服务器node01  IP:172.16.10.10(网段:172.16.10.0/24)可控的访问internet。

网关服务器操作

1、网关机器开启linux的转发功能

[root@gateway01 ~]# tail /etc/sysctl.conf   # 添加如下内容
…………
net.ipv4.ip_forward = 1
[root@gateway01 ~]# sysctl -p   # 生效

2、网关机器iptables操作

iptables -P FORWARD DROP

将FORWARD链的策略设置为DROP,这样做的目的是做到对内网ip的控制,你允许哪一个访问internet就可以增加一个规则,不在规则中的ip将无法访问internet。(******实际因为安装了KVM的管理面板,所以此步无需操作,否则面板功能可能会受到影响!******)

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

这条规则规定允许任何地址到任何地址的确认包和关联包通过。一定要加这一条,否则你只允许lan IP访问没有用。(******实战中发现这条规则是已经存在的,无需操作******)

iptables -t nat -A POSTROUTING -s 172.16.10.0/24 -j SNAT --to 10.0.0.5

这条规则做了一个SNAT,也就是源地址转换,将来自172.16.10.0/24的地址转换为10.0.0.5。

有这几条规则,一个简单的nat路由器就实现了。

iptables -A FORWARD -s 172.16.10.10 -j ACCEPT		# 允许单个地址  或者如下命令
iptables -A FORWARD -s 172.16.10.0/24 -j ACCEPT		# 允许该网段

如上:这时可以让172.16.10.10或网段添加至FORWARD链,他就能访问internet了。

实战中,添加后,可以使得内网ping通外网后,有返回值,清空nat表后,没有这条内网ping通外网后,没有返回值。

3、保存iptables规则

iptables-save > /etc/sysconfig/iptables

二、端口转发

端口转发需求介绍

内部机器1个网络接口

Lan内web server: 172.16.10.10:80

网关2个网络接口

Lan口:172.16.10.5/24   eth0

Wan口:10.0.0.5/24     eth1

目的:对内部server进行端口转发,实现internet 10.0.0.8(网段:10.0.0.0/24)用户【模拟外网机器】访问内网服务器172.16.10.10:80。

网关服务器操作

1、网关机器开启linux的转发功能

[root@gateway01 ~]# tail /etc/sysctl.conf   # 添加如下内容
…………
net.ipv4.ip_forward = 1
[root@gateway01 ~]# sysctl -p   # 生效

2、网关机器iptables操作

iptables -P FORWARD DROP

将FORWARD链的策略设置为DROP,这样做的目的是做到ip的控制,你允许哪一个访问就可以增加一个规则,不在规则中的ip将无法访问。(******实际因为安装了KVM的管理面板,所以此步无需操作,否则面板功能可能会受到影响!******)

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

这条规则规定允许任何地址到任何地址的确认包和关联包通过。一定要加这一条,否则你只允许lan IP访问没有用。(******实战中发现这条规则是已经存在的,无需操作******)

iptables -t nat -A PREROUTING -d 10.0.0.5 -p tcp --dport 80 -j DNAT --to 172.16.10.10:80

如果你要把访问 10.0.0.5:80 的数据包转发到Lan内web server,用上面的命令。

命令完成了,端口转发也做完了,本例能不能转发呢?不能,为什么呢?我下面分析一下。

本例中我们的FORWARD策略是DROP。那么也就是说,没有符合规则的包将被丢弃,不管内到外还是外到内。因此,我们需要加入下面的规则。

iptables -A FORWARD -d 172.16.10.10 -p tcp --dport 80 -j ACCEPT

3、保存iptables规则

iptables-save > /etc/sysconfig/iptables

经测试:外网服务器(10.0.0.8)访问内部服务器(172.16.10.10:80)成功。


实战2:

KVM虚拟机通过iptables+NAT模式实现远程连接

配置NAT网络

按照正常情况下NAT都是默认开启的,执行virsh net-lis查看

NAT模式开启之后会有一个NAT模式默认的网卡virbr0,这块网卡就是负责给虚拟机分配ip地址的网卡。

创建虚拟机(带有GPU直传)blog.csdn.net/weixin_43802844/article/details/112569060 

sudo virt-install --name=ubuntu --memory=380000,maxmemory=380000 --vcpus=46,maxvcpus=46 --os-type=linux --os-variant=ubuntu18.04 --cdrom=/data/ubuntu-18.04.5-live-server-amd64.iso --disk path=/data/ubuntu.img,size=600 --network network=default --graphics vnc,listen=0.0.0.0,keymap=en_us --host-device 04:00.0 --host-device 83:00.0 --features kvm_hidden=on --machine q35 --check disk_size=off
--memory  //分配的内存
--vcpus  //分配的cpu
--cdrom  //ios映像文件,--location会出现hvm报错,所以直接选用cdrom减少麻烦
--disk path  //硬盘  size大小为G
--graphics vnc  //登录方式为vnc,创建过程vnc远程配置即可
--host-device   //显卡的id,建议按组全部添加
--features kvm_hidden=on   //阻止nvidia驱动发现虚拟机
--machine q35    //采用q35架构
--network network=default //default即为默认的NAT网络模式

创建完成后使用vnc连接安装系统

配置iptables

开启IP转发

vi /etc/sysctl.conf
net.ipv4.ip_forward=1      
sysctl –p         //令上面修改生效

配置iptables端口转发

sudo iptables --table nat --append PREROUTING --protocol tcp --destination xx.xx.xx.xx --destination-port xxxx --jump DNAT --to-destination 192.168.122.xx:22

sudo iptables -t nat -A PREROUTING -p tcp --dport xxxx -j DNAT --to-destination 192.168.122.2:22
sudo iptables -t nat -A POSTROUTING -p tcp --dport 22 -d 192.168.122.2 -j SNAT --to 192.168.122.1

//注意:这里会有一个坑但是因人而异,这样配置完成之后可能会出现依旧无法实现远程连接的现象,这时候需要删除一个或者两个规则。

查看iptables规则

sudo iptables -nL -v --line-numbers -t filter


Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1    21974   22M DOCKER-USER  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
2    21974   22M DOCKER-ISOLATION-STAGE-1  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
4        0     0 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
5        0     0 ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
6        0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           
7    11179   21M ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED
8    10793  776K ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
9        0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
10       2    84 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
11       0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
12       0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED
13       0     0 ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
14       0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
15       0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

这里的第10条和第11条,阻止了我们的端口转发,需要把他删掉

删除特定的iptables规则

sudo iptables -D FORWARD 10 -t filter
sudo iptables -D FORWARD 11 -t filter

远程连接测试OK


实战3:www.cnblogs.com/dwj192/p/8862199.html

NAT(网络地址)方式连接网络在桌面虚拟化使用是比较多的,比如VMware Workation。使用NAT方式联网可以节省IP地址。说实话这个对于公网IP地址比较少的公司,也节省了成本。

而KVM默认的网络连接方式就是NAT,只是我们一直没有使用。它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网(需要对KVM服务器做配置),但不支持外界访问虚拟机(不过可以通过KVM服务器配置IPtables端口转发解决)。

本篇文章主要包括两个部分:

1、KVM为VM配置NAT网络

2、为VM配置iptables端口转发

一、KVM为VM配置NAT网络

我们可以通过如下命令,查看NAT是否开启。如下:

virsh net-list

default是宿主机安装VM支持模块的时候自动安装的。

我们也可以查看,系统中已经存在的网卡。使用ifconfig命令,如下

我们可以看出网卡virbr0就是NAT方式连接网络时,所使用到的网卡。

除此之外我们还可以通过配置文件,来查看NAT方式的DHCP地址池。该配置文件为:/etc/libvirt/qemu/networks/default.xml。如下:

通过上图我们可以看出,目前NAT使用的IP地址池是192.168.122.2-192.168.122.254,网关为192.168.122.1,子网掩码为255.255.255.0。

安装KVM虚拟机

virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name nat001 --memory 4096 --vcpus 2 --disk /home/kvm/nat001.qcow2,format=qcow2,size=40 --cdrom /data/template/CentOS-7.6-x86_64-Minimal-1810.iso --network network=default --graphics vnc,password=qqxxxxxxQQ,listen=0.0.0.0,port=59991 --noautoconsole

注意该条命令中有关网络的配置--network network=default,我们使用的是默认网络配置default。这个就是NAT方式。

VM系统安装完毕后,我们进入VM中。默认情况下VM此时使用的DHCP方式获取IP地址,如果你在安装系统时未进行网络配置。我们现在修改VM使用静态IP地址,如下:

more /etc/sysconfig/network-scripts/ifcfg-eth0

此时VM通过NAT网络获取的IP地址无法与其他网段的服务器进行通信。是不是我们的NAT配置出错?还是其他原因?

这个其实不是我们NAT配置出错,而是要是NAT网络与其他服务器进行正常通信还需要做其他工作。

现在切换到KVM服务器,开启KVM服务器的IP转发功能。编辑/etc/stsctl.conf文件,把其中的net.ipv4.ip_forward = 0修为net.ipv4.ip_forward = 1,如下:

vi /etc/sysctl.conf

或者使用如下命令:

echo 1 >/proc/sys/net/ipv4/ip_forward

不过这种方法是暂时的,系统重启后消失。要使其永久生效,建议使用直接修改/etc/stsctl.conf文件的方法。

/etc/stsctl.conf文件修该完毕后,我们要使用sysctl --p使其生效。如下

以上配置完毕后,我们还要开启KVM服务器的IPtables的转发功能,使用如下命令:

iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE

注意该命令中的网卡时br0,而不是eth0。

此时,我们再切换VM中测试的网络通信情况。是可以ping通外网的

目前VM可以与服务器以及外网正常通信。

二、为VM配置iptables端口转发

为什么要为VM配置iptables端口转发呢?这个是因为有些业务是在公网的,有时候为了资金考虑不得不尽量节省公网IP的个数。比如现在我想管理KVM中的VM,通过SSH方式。但是KVM服务器对外只有一个公网IP,而且KVM服务器是在IDC机房中。

如果要达到我上述的要求,只能在KVM服务器为VM配置IPtables端口转发。

现在我们还以上述VM为例,目前该KVM的公网IP为192.168.1.102,VM的IP为192.168.122.173,现在我要求通过访问KVM的8022端口访问VM的22端口。

要想达到上述功能,我们需要在KVM服务器上设置如下IPtables规则:

iptables -t nat -A PREROUTING -d 192.168.1.102 -p tcp -m tcp --dport 8022 -j DNAT --to-destination 192.168.122.173:22

iptables -t nat -A POSTROUTING -s 192.168.122.0/255.255.255.0 -d 192.168.122.173 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.122.1

注意这两条IPtables规则:

第一条规则很好理解,就是把所有访问192.168.1.102:8022的请求转发到192.168.122.173:22的端口上。

第二条规则我的理解是,把所有来自192.168.122.0/255.255.255.0网段访问192.168.122.173:22的数据全部通过192.168.122.1这个网关转发出去。

测试效果:

ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d: -f2

ssh -p 8022 root@192.168.1.102

我们通过192.168.1.213这台服务器使用ssh通过8022端口登录到IP为192.168.122.173的VM

增加一个web服务的配置

iptables -t nat -A PREROUTING -d 192.168.1.102 -p tcp -m tcp --dport 8023 -j DNAT --to-destination 192.168.122.173:80

iptables -t nat -A POSTROUTING -s 192.168.122.0/255.255.255.0 -d 192.168.122.173 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.122.1

以上这个例子是通过192.168.102:8023访问VM92.168.122.173的web服务器。

为了在下次重启KVM服务器后,这些IPtables规则继续使用。我们要把这些规则保存下,使用如下命令:

/etc/init.d/iptables save

more /etc/sysconfig/iptables

举报

相关推荐

0 条评论