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

iptables基础操作(必学)

## 查看规则
iptables -nL
iptables -nL -t nat   专门查看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 (清除NAT表)
iptables -t nat -X 
iptables -t nat -Z

centos7.6+iptables+kvm+阿帕云管理面板(亲测)

命令行先安装阿帕云管理面板发现,只能使用外网IP配置云服务器

想实现,内网虚拟机通过外网上网,同时可以通过外网访问指定端口22管理内网虚拟机

一、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

二、安装好系统后,配置网络

vi /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.122.11
NETMASK=255.255.255.0
GATEWAY=192.168.122.1
DNS1=192.168.122.1
:wq
systemctl restart network

三、开启宿主机转发功能

vi /etc/sysctl.conf
把其中的net.ipv4.ip_forward = 0修为net.ipv4.ip_forward = 1

执行命令sysctl -p 使配置生效
开启KVM服务器的IPtables的转发功能

四、清空NAT表(仅首次)

iptables -t nat -F (清除NAT表)

iptables -nvL -t nat(查看nat表)

五、实现内网访问外网功能

首选如下规则,首次使用之后就不需要重复添加了

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

注意该命令中的网卡时br0,而不是eth0
此时虚拟机就可以访问外网了

或使用下面规则也可以实现:

iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -j SNAT --to 103.85.85.xxx

这条规则做了一个SNAT,也就是源地址转换,将来自192.168.122.0/24的地址转换为103.85.85.140。(不加时内网ping外网没有返回结果)

六、实现通过外网某端口转发给内网某端口

iptables -t nat -A PREROUTING -p tcp --dport 22201 -j DNAT --to-destination 192.168.122.11:22

或使用下面规划也可以实现:

iptables -t nat -A PREROUTING -d 103.85.85.xxx -p tcp --dport 22201 -j DNAT --to 192.168.122.11:22

完整语句如下:

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


实现访问 103.85.85.xxx:22201 的请求转发到到内网192.168.122.11:22上面。

七、reject规则检查

检查是否存在reject规则

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

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

这里的第10条和第11条,阻止了我们的端口转发,需要把他删掉
删除特定的iptables规则
iptables -D FORWARD 10 -t filter
iptables -D FORWARD 11 -t filter

八、使多个内网虚拟机访问指定IP通过网关转发出去(非必操作)

针对所有网段的语法:

iptables -t nat -A POSTROUTING -p tcp --dport 22 -d 192.168.122.11 -j SNAT --to 192.168.122.1

意思是:把所有内网来自所有网段访问192.168.122.11:22的数据全部通过192.168.122.1这个网关转发出去。

如果仅是针对192.168.122.0/255.255.255.0网段的语法:

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

意思是:把所有来自192.168.122.0/255.255.255.0网段访问192.168.122.11:22的数据全部通过192.168.122.1这个网关转发出去。

九、保存iptables规则(非必操作)

iptables-save > /etc/sysconfig/iptables

备用检查:

1、iptables -P FORWARD DROP(可以不使用)
将FORWARD链的策略设置为DROP,这样做的目的是做到对内网ip的控制,你允许哪一个访问internet就可以增加一个规则,不在规则中的ip将无法访问internet。

2、iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT    (针对所有网段的)
这条规则规定允许任何地址到任何地址的确认包和关联包通过。一定要加这一条,否则你只允许lan IP访问没有用

3、当内网还是无法访问internet时

iptables -A FORWARD -s 192.168.122.11 -j ACCEPT        # 允许单个地址  或者如下命令
iptables -A FORWARD -s 192.168.122.0/24 -j ACCEPT        # 允许该网段
比如我想让192.168.122.11这个地址访问internet,那么你就加如上的命令就可以了。

4、排查外网开启单个外网端口

如果使用了FORWARD策略是DROP。那么也就是说,没有符合规则的包将被丢弃,不管内到外还是外到内。因此,我们需要加入下面的规则。
iptables -A FORWARD -d 103.85.85.140 -p tcp --dport 22201 -j ACCEPT


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
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值