iptables防火墙详解(二)

来源:互联网 发布:thumbnails java 编辑:程序博客网 时间:2024/05/21 06:19
--基于状态的iptables如果按照tcp/ip来划分连接状态,有11种之多(课后可以自己去读一下相关知识)但iptables里只有4种状态;ESTABLISHED、NEW、RELATED及INVALID这两个分类是两个不相干的定义。例如在TCP/IP标准描述下UDP及ICMP数据包是没有连接状态的,但在state模块的描述下,任何数据包都有连接状态。    1、ESTABLISHED    (1)与TCP数据包的关系:首先在防火墙主机上执行SSH Client,并且对网络上的SSH服务器提出服务请求,而这时送出的第一个数据包就是服务请求的数据包,如果这个数据包能够成功的穿越防火墙,那么接下来SSH Server与SSH Client之间的所有SSH数据包的状态都会是ESTABLISHED。    (2)与UDP数据包的关系:假设我们在防火墙主机上用firefox应用程序来浏览网页(通过域名方式),而浏览网页的动作需要DNS服务器的帮助才能完成,因此firefox会送出一个UDP数据包给DNS Server,以请求名称解析服务,如果这个数据包能够成功的穿越防火墙,那么接下来DNS Server与firefox之间的所有数据包的状态都会是ESTABLISHED。    (3)与ICMP数据包的关系:假设我们在防火墙主机ping指令来检测网络上的其他主机时,ping指令所送出的第一个ICMP数据包如果能够成功的穿越防火墙,那么接下来刚才ping的那个主机与防火墙主机之间的所有ICMP数据包的状态都会是ESTABLISHED。    由以上的解释可知,只要第一个数据包能够成功的穿越防火墙,那么之后的所有数据包(包含反向的所有数据包)状态都会是ESTABLISHED。    2、NEW    首先我们知道,NEW与协议无关,其所指的是每一条连接中的第一个数据包,假如我们使用SSH client连接SSH server时,这条连接中的第一个数据包的状态就是NEW。    3、RELATED    RELATED状态的数据包是指被动产生的数据包。而且这个连接是不属于现在任何连接的。RELATED状态的数据包与协议无关,只要回应回来的数据包是因为本机送出一个数据包导致另一个连接的产生,而这一条新连接上的所有数据包都是属于RELATED状态的数据包。    4、INVALID    INVALID状态是指状态不明的数据包,也就是不属于以上三种状态的封包。凡是属于INVALID状态的数据包都视为恶意的数据包,因此所有INVALID状态的数据包都应丢弃掉,匹配INVALID状态的数据包的方法如下:    iptables -A INPUT -p all -m state INVALID -j DROP    我们应将INVALID状态的数据包放在第一条。|随机|     80  web--------- |--》client|       server    《--------- |--随机|     80|client访问server过去第一个数据包(new状态),如果拒绝,那么后续包都会被拒绝(因为后面来的都会是第一个,都为new状态)第一个数据包如果允许过去,那么后续包的状态为establishedserver返回给client返回的所有包都为established例1:有下面两台机172.16.25.2172.16.25.3 client  server172.16.25.2是可以ssh访问172.16.25.3,也可以elinks访问172.16.25.31,在172.16.25.3上iptables -P INPUT DROPiptables -P OUTPUT DROP这里就把双链都关掉,172.16.25.2任何访问都过不来了2,按以前的做法在172.16.25.3上允许别人ssh进来iptables -A INPUT -p tcp --dport 22 -j ACCEPTiptables -A OUTPUT -p tcp --sport 22 -j ACCEPT在172.16.25.3上允许别人elinks进来iptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -A OUTPUT -p tcp --sport 80 -j ACCEPT或者把上面四条合下面两条iptables -A INPUT -p tcp -m multiport  --dport 22,80 -j ACCEPTiptables -A OUTPUT -p tcp -m multiport  --sport 22,80 -j ACCEPT把上面的两条再换成iptables -A INPUT -p tcp -m multiport  --dport 22,80 -j ACCEPTiptables -A OUTPUT -p tcp -m state --state established -j ACCEPT(后面一句可以翻译成tcp协议的连接只要你进得来,你就回得去)(无论他是用哪个随机端口访问进来的;因为只要能进来,那么后续的包都属于ESTABLISHED状态)有些服务器,可能希望你ping不通他,但是他可以ping通你方法一:在服务器上把/proc/sys/net/ipv4/icmp_echo_ignore_all的值改为1临时修改echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all永久修改# vim /etc/sysctl.conf--加上下面一句net.ipv4.icmp_echo_ignore_all = 1# sysctl -p--使用此命令让其生效通过iptables的状态来实现有下面两台机172.16.25.2172.16.25.3实现172.16.25.3这个IP能ping通所有人.但所有人不能ping通172.16.25.3|        --------------》|  ------->  client|  server      172.16.25.2|  172.16.25.3          <-------------|  <--------      NEW   ESTABLISHEDINPUT   拒绝  允许OUTPUT  允许  允许1,在172.16.25.3上iptables -P INPUT DROPiptables -P OUTPUT DROP这里就把双链都关掉,172.16.25.9任何访问都过不来了2,在172.16.25.3上iptables -A INPUT -p icmp -m state --state ESTABLISHED -j ACCEPTiptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED -j ACCEPT--重点是INPUT那条不能允许NEW状态的;--注意第二步的第二条(也就是output这条),如果只写了NEW状态,那么172.16.25.3ping所有人,都只能通第一个包;加上ESTABLISHED状态,所有包都能通例3:有一个服务器,搭建了http,ftp(主动和被动都要支持,被动端口为3000-3005)两个服务(需要开放给所有人访问),还要开放ssh和ping(但只开放给一个管理ip访问,比如此IP为172.16.25.X),其它任何进来的访问都拒绝但此服务器要出去访问别的任何服务,自己的防火墙都要允许需求一个一个的写iptables -P INPUT DROPiptables -P OUTPUT DROPiptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -A OUTPUT -p tcp --sport 80 -j ACCEPTiptables -A INPUT -p tcp --dport 21 -j ACCEPTiptables -A OUTPUT -p tcp --sport 21 -j ACCEPTiptables -A OUTPUT -p tcp --sport 20 -j ACCEPTiptables -A INPUT -p tcp --dport 20 -j ACCEPTiptables -A INPUT -p tcp --dport 3000:3005 -j ACCEPTiptables -A OUTPUT -p tcp --sport 3000:3005 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -s 172.16.25.X -j ACCEPTiptables -A OUTPUT -p tcp --sport 22 -d 172.16.25.X -j ACCEPTiptables -A INPUT -p icmp -s 172.16.25.X -j ACCEPTiptables -A OUTPUT -p icmp -d 172.16.25.X -j ACCEPTiptables -A OUTPUT -p all -m state --state new,established,related -j ACCEPTiptables -A INPUT -p all -m state --state established,related -j ACCEPT把上面的综合起来iptables -P INPUT DROPiptables -P OUTPUT DROPiptable -A INPUT -p tcp -m multiport --dport 80,21,20,3000,3001,3002,3003,3004,3005 -j ACCEPTiptable -A INPUT -p tcp --dport 22 -s 172.16.25.X -j ACCEPTiptable -A INPUT -p icmp  -s 172.16.25.X -j ACCEPTiptables -A INPUT -p all -m state --state  established,related -j ACCEPTiptables -A OUTPUT -p all -m state --state new,established,related -j ACCEPT=======================================================================================知识补充:路由什么是交换,什么是路由,什么是路由表?交换是指同网络访问(两台机器连在同一个交换机上,配置同网段的不同ip就可以直接通迅)路由就是跨网络访问(路径选择)路由表是记录路由信息的表(可以单路由表,也可以多路由表)因特网   ---》  物联网(互联网+)  (无数个网络组成,所以从一个网络到另一个网络,中间可能还要经过很多个网络,必需要走路由)我们现在讨论的是单路由表,你在linux下用route -n查看# route -nKernel IP routing tableDestination     Gateway         Genmask        Flags Metric Ref Use Iface0.0.0.0         172.16.25.254   0.0.0.0        UG    0      0       0 br0169.254.0.0     0.0.0.0         255.255.0.0    U     1010   0       0 br0172.16.25.0     0.0.0.0         255.255.255.0  U     0      0       0 br0192.168.100.0   0.0.0.0         255.255.255.0  U     0      0       0 virbr1192.168.101.0   0.0.0.0         255.255.255.0  U     0      0       0 virbr2192.168.100.0   0.0.0.0         255.255.255.0  U     0      0       0 virbr0问题1:按上面的路由表来看,如果我ping一个公网IP(如ping 14.215.177.38),应该怎么走?答案:我在本机访问一个IP,先看目标ip是否为本地ip,如果是,则直接访问本地;如果不是,则找路由表里是否有你访问的网段,有的话则从这个路由条目后面指定的网卡出去;如果路由表里没有你访问的网段,则会找默认路由(也就是网关);如果网关也没有的话,则会报错网络不可达。问题2:为什么route -n能看到这几条路由(不同机器可能还不一样)答案:因为我对应的网卡有相关网段的ip,所以就会有对应的默认路由(比如我的机器br0网卡ip为172.16.25.1/24,所以我默认就会有172.16.25.0     0.0.0.0         255.255.255.0   U     0      0        0 br0 这一条路由)问题3:如何加网关和删除网关,加网关有什么要求?route add default gw  x.x.x.x--临时加网关,马上生效route del default gw  x.x.x.x --临时删网关,马上生效永久加网关的方法在网卡配置文件里/etc/sysconfig/network-scripts/ifcfg-br0加一句GATEWAY=x.x.x.x;然后重启network服务生效加网关只能加你已经有的路由网段里的一个IP才行(ping不通此IP都可以)加网关不需要指定子网掩码(因为是已有的一个网段的ip,所以掩码已经确认了)问题4:如果你有br0:0这种子接口配置文件,那么每个文件里都要写一个网关吗?准确来说:一个路由表上可以加多个网关,但只有一个生效(从上往下找,上面的优先生效;rhel6上面的网关不管通不通,都不会找下面的网关;centos7测试结果为上面的网关不能通,则自动找下面的网关;上面的网关可以通,则只会找上面的网关)。但一台linux是可以做多路由表的,一个路由表一个有效网关,多路由表就是多个网关了。# route -nKernel IP routing tableDestination     Gateway         Genmask        Flags Metric Ref Use Iface0.0.0.0         172.16.25.150   0.0.0.0        UG    0      0       0 br00.0.0.0         172.16.25.254   0.0.0.0        UG    0      0       0 br0169.254.0.0     0.0.0.0         255.255.0.0    U     1010   0       0 br0172.16.25.0     0.0.0.0         255.255.255.0  U     0      0       0 br0192.168.100.0   0.0.0.0         255.255.255.0  U     0      0       0 virbr1192.168.101.0   0.0.0.0         255.255.255.0  U     0      0       0 virbr2192.168.100.0   0.0.0.0         255.255.255.0  U     0      0       0 virbr0问题5:我一台linux上如果有双物理网卡,请问可不可以两个网卡配置同网段的不同IP呢?假设我的eth0 172.16.25.5/24    eth1 172.16.25.6/24172.16.25.0     0.0.0.0         255.255.255.0   U     0      0     0  eth0172.16.25.0     0.0.0.0         255.255.255.0   U     0      0     0  eth1如果两个网卡同网段,则会有下面两条路由172.16.25.0        0.0.0.0         255.255.255.0   U     0    0    0 eth0172.16.25.0        0.0.0.0         255.255.255.0   U     0    0    0 eth1它会实现从两张网卡进来的包,却从一张网卡出去,问题就产生了。实验:步骤一:一个虚拟机,开两个网卡,都为桥接网络,配置两个IP,如下# ip addr |grep eth 2: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    link/ether 52:54:00:41:e4:22 brd ff:ff:ff:ff:ff:ff    inet 172.16.25.5/24 brd 172.16.21.255 scope global br03: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    link/ether 52:54:00:39:c0:e6 brd ff:ff:ff:ff:ff:ff    inet 172.16.25.6/24 brd 172.16.21.255 scope global eth1步骤二:在另一台机器(我这里为宿主机,ip为172.16.25.1),分别ping上面两个ip,得到结果为两个人的MAC都为第一个网卡的# ip neigh |grep -E "^172.16.25.5 |^172.16.25.6 "172.16.25.5 dev br0 lladdr 52:54:00:41:e4:22 REACHABLE172.16.25.6 dev br0 lladdr 52:54:00:41:e4:22 REACHABLE步骤三:在虚拟机上ifconfig eth1 down关闭172.16.25.6的网卡,宿主机仍然可以ping通172.16.25.6结论:在linux上,宿主机ping 172.16.25.6,虚拟机172.16.25.5这个网卡也能收到arp请求,并且会帮172.16.25.6回应(这是由linux默认的内核参数所决定的)--按arp协议的原理,找谁谁才会回应mac地址(找张三,只能张三回应;找李四,只能李四回应)。而上面的实验情况可以比喻成(张三,李四同一台机器,就是一家人,找张三,张三回,找李四,也张三回)步骤四:# vim /etc/sysctl.conf--加上net.ipv4.conf.eth0.arp_ignore = 1net.ipv4.conf.eth0.arp_announce = 2net.ipv4.conf.eth1.arp_ignore = 1net.ipv4.conf.eth1.arp_announce = 2net.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2# sysctl -p   --用此命令让其生效这几个参数的目的就是把上面的一家人(张三又回应张三也回应李四)的情况变成了原本的arp情况(张三只能回张三,李四只能回李四)最终的效果的是宿主机只能ping通172.16.25.5了,ping不通172.16.25.6了(这就对了,因为一台机器双网卡同网段会路由冲突)静态路由如下图的实验:IP分配如下(掩码假设全为24位),做实验的话使用iptables -F把所有的防火墙规则清空1.1.1.0/24网段用default来模拟2.2.2.0/24网段用default1来模拟3.3.3.0/24网段用default2来模拟4.4.4.0/24网段用default3来模拟VM1  VM2  VM3      VM4 eth1(default1)   eth0(default1) eth1(default3)              2.2.2.2   《--》  2.2.2.3    4.4.4.4   ip_forward   ip_forwardeth0 (default) eth0(default)   eth1(default2) eth1(default2)1.1.1.1 --》  1.1.1.2      3.3.3.3 《--》   3.3.3.4sip:1.1.1.1    dip:4.4.4.4返回sip:4.4.4.4    dip:1.1.1.1步骤一:从1.1.1.1 ping 1.1.1.2在宿主机上ping 1.1.1.2,能通步骤二:ping 2.2.2.2 不能通解决方法:在vm1上加网关route add default gw 1.1.1.2步骤三:在宿主机加了一个网关指向1.1.1.2的基础上,我再继续在宿主机上ping 2.2.2.3 不能通 解决方法:在vm3上加网关指向2.2.2.2route add default gw 2.2.2.2还要在VM2上打开ip_forward,打开方法有两种1,# echo 1 > /proc/sys/net/ipv4/ip_forward--马上生效,但重启后就不生效了2,# vim /etc/sysctl.confnet.ipv4.ip_forward = 1--改为1# sysctl -p--保存后,使用此命令让它永久生效步骤四:继续ping 3.3.3.3不通解决:再在VM2上route add default gw 2.2.2.3步骤五:继续ping 3.3.3.4    不通解决:在VM3上打开ip_forward还要在VM4上route add default gw 3.3.3.3步骤六继续ping 4.4.4.4  不通解决:如果在VM3上加一个网关指向3.3.3.4,其实是有问题的,因为VM3上这样就有两个网关了。如果你不使用多路由表的做法,这两个网关只能有一个网关有效。所以加网关的方式不可行,只能在VM3加路由route add -net 4.4.4.0 netmask 255.255.255.0 dev eth1上面终于从1.1.1.1ping到4.4.4.4那么如果还有5网段,6网段,7网段,甚至更多(类似因特网),全部靠指网关来通迅不现实。实际的做法就是使用路由协议(rip,ospf,bgp等)来做,这就是动态路由了。如果我把上面的所有网关和ip_forward去掉,然后手动加上路由(也就是说四台机都有四个网段的路由),那么就只能ping通到2.2.2.2,ping2.2.2.3就不通了linux下可以安装类似zebra这样的软路由软件,可以把linux模拟成一台cisco路由器来进行配置。=============================================================================================准备三台虚拟机做实验(把iptables都先关闭);--注意:这里我没有用宿主机模拟中间的机器(因为用宿主机有多个子接口的情况下,在做firewalld测试的时候会有不稳定的情况;而且宿主机打开firewalld,那么就会默认拒绝vnc等,带来不方便)    A      B   C  内网(虚拟机)双网卡机器(虚拟机)外网(虚拟机)192.168.100.128 --》 192.168.100.2  eth0   ip_forward               172.16.25.2    eth1   《-172.16.25.3--注意:模拟上面的环境时,宿主机可以模拟中间的双网卡网关,但不能模拟内网或外网其中一台(原因是宿主机本来就是与虚拟的所有网段是直通的,你如果把它做为内网,则它会直接连接外网而不会走中间的网关)--所以两种模拟方法:1,宿主机模拟网关,两台虚拟机分别模拟内外网;2,不要宿主机,三台虚拟机来模拟,中间的双网卡网关使用一台双网关的虚拟机模拟,另两台用单网卡来模拟把gateway加上路由功能# echo "1" > /proc/sys/net/ipv4/ip_forward   --临时生效# vim /etc/sysctl.conf net.ipv4.ip_forward = 1# sysctl -p    --改完后使用此命令,使之修改永久生效路由功能加了后,网关都指向了gateway这台物理机,那么  两个网段的这两台机就能互相ping通例一:禁止内网192.168.100.128和外网172.16.25.2互pingiptables -A FORWARD -p icmp -s 192.168.100.128 -j DROP或者iptables -A FORWARD -p icmp -s 172.16.25.3 -j DROP例二:禁止内网192.168.100.128上外网的172.16.25.3这个网站iptables -A FORWARD -p tcp --dport 80 -s 192.168.100.128 -d 172.16.25.3 -j DROP===================================================================问题:这里我们模拟内外网的访问,网关互指,中间双网卡机器打开ip_forward,但实际的网络访问环境中,外网客户会把网关指向你公司的网关吗?张三         李四王五  内网用户 双网卡机器外网服务器  (其实就是模拟一个路由器)192.168.100.128    ---->  192.168.100.2   eth0          网关指向  打开ip_forward              172.16.25.2    eth1      172.16.25.3 NAT (network address translation)把上图先去掉外网上的网关(因为实际情况下,别人公司的外网服务器不可能把网关指向你),去掉这个网关后,内外网就不能通了,要靠做NAT才能通不做NAT的过程:SIP:192.168.100.128DIP:172.16.25.3到达中间路由器,通过路由表里的路由去找外网SIP:192.168.100.128DIP:172.16.25.3到达外网服务器目的地,然后返回SIP:172.16.25.3DIP:192.168.100.128结果:回不来,因为目标是一个内网ip地址(这个ip地址每个人在家里都可以用)做NAT的过程SIP:192.168.100.128DIP:172.16.25.3到达中间路由器,需要做SNATSIP:172.16.25.2DIP:172.16.25.3到达外网服务器,然后返回SIP:172.16.25.3DIP:172.16.25.2回到中间路由器,会自动(自动的意思表示你不用写这个规则)做DNATSIP:172.16.25.3DIP:192.168.100.128张三李四王五发信人:张三发信人:李四发信人:王五收信人:王五 --->收信人:王五  -----------> 收信人:李四      |发信人:王五   | <-----收信人:张三  <---------------|解决方法:在中间网关机器上写规则实现内网可以上外网的webiptables -t nat -A POSTROUTING -p tcp --dport 80 -o eth1 -j SNAT --to-source 172.16.25.2实现内网可以ping外网iptables -t nat -A POSTROUTING -p icmp -o eth1 -j SNAT --to-source 172.16.25.2下面这条不写协议,也就表示所有内网上外网的都会做SNAT成172.16.25.1这个IP地址iptables -t nat -A POSTROUTING  -o eth1 -j SNAT --to-source 172.16.25.2iptables -t nat -A POSTROUTING  -o eth1 -j MASQUERADE--这条命令和上条命令实现的效果是一样的,但区别在于MASQUERADE可以动态SNAT成你的公网IP(用于公网IP不固定的情况,比如家用的ADSL拔号上网)做了SNAT后,并且可以172.16.25.3的/var/log/httpd/access_log里验证得到:在你做NAT之前,靠双网关互指访问网站,它的访问日志里全是你内网的IP。而做了NAT之后,日志里是你公网的IP。centos7下的做法(这个做法经测试可能不太稳定,如果我中间的机器用宿主机模块,并且br0有子接口的时候,这样做有些时候不能成功。所以可以换成三台虚拟机做就没发现这个问题)# firewall-cmd --add-masquerade(不用指从哪个网卡出了)  # firewall-cmd --remove-masquerade================================================================DNAT  目的地址转换也就是外网是客户端,要访问我们内网的服务器,客户端只是访问外网IP,内网里不同的服务器不同的IP,可以使用DNAT把不同的请求转换到不同的内网服务器  内网web服务器     双网卡机器     外网客户  (其实就是模拟一个路由器)192.168.100.128    ---->  192.168.100.2   eth0          网关指向  打开ip_forward              172.16.25.2    eth1             172.16.25.3SIP:172.16.25.3    DIP:172.16.25.2到达双网卡网关,要做DNATSIP:172.16.25.3    DIP:192.168.100.128到达web服务器,返回SIP:192.168.100.128   DIP:172.16.25.3通过web服务器网关192.168.100.1回到双网卡网关机器,自动SNAT回去SIP:172.16.25.2    DIP:172.16.25.3# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.128centos7的dnat写法# firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.100.128--tcp的80端口,全部dnat给192.168.100.128这个ip测试方法:在外网客户端上elinks -dump 172.16.25.2测试=================================================================NPT 网络端口转换(DNPT)客户端172.16.25.2 |       |web172.16.25.3默认情况web是监听80端口,如果我把web改成监听8080.那么客户端在elinks 172.16.25.3时就访问不到,除非elinks 172.16.25.3:8080在web服务器上写上一条端口转换的iptables规则,把访问80的转成8080.然后客户端再去elinks 172.16.25.3不用写端口也可以访问成功# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080--注意:前面的snat,dnat,npt写的--to-source,--to-destination,--to-port全部可以简写成--to就好了;只要做写nat规则,就需要打开ip_forward(npt不需要打开)centos7下端口80转成8080# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080successdnat和dnpt合起来# firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.100.128:toport=8080=================================================================题目1:现在我的172.16.13.250(网段为172.16.13.0/24)是通过公司路由器172.16.13.254可以实际上外网的请问,我一个kvm的isolated网段(假设为default1,也就是virbr1这个网卡)的虚拟机192.168.100.128如何才能通过NAT上外网kvm虚拟机     宿主机                    公司路由器   公司外网IP      virbr1      br0   192.168.100.128 --》 192.168.100.1   172.16.13.250 -->  172.16.13.254  113.87.160.58elinks www.qq.comDNS指向114.114.114.114dns包的过程SIP:192.168.100.128DIP:114.114.114.114通过网关192.168.100.1到达宿主机,做SNATSIP:172.16.13.250  DIP:114.114.114.114通过网关172.16.254.254到达公司路由器,做SNATSIP:113.87.160.58DIP:114.114.114.114到达DNS服务器,解析成功后,返回结果SIP:114.114.114.114DIP:113.87.160.58回到公司路由器,自动DNATSIP:114.114.114.114DIP:172.16.13.250回到宿主机,自动DNATSIP:114.114.114.114DIP:192.168.100.128   总结:满足四个条件,这个hostonly虚拟机就可以上外网1,虚拟机网关指向宿主机的同网段IP(我这个例子里是指向192.168.100.1)2,DNS指向公网DNS服务器(我这里是指向114.114.114.114);这里DNS也可以指向192.168.100.1,但是要在宿主机上多做一条DNAT,把udp的53端口目标地址DNAT成114.114.114.1143,宿主机打开ip_forward(因为写NAT规则都需要这个要求)4,宿主机上写一条SNAT把虚拟机上网的所有数据包SNAT成宿主机上外网的IP(我这里为172.16.13.250)iptables -t nat -A POSTROUTING -o br0 -j SNAT --to-source 172.16.13.250或者iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE题目2:要求:写出这个电信用户访问到双线web服务器时并返回的IP变化过程(只写源IP,目标IP,和做SNAT还是DNAT等)你觉得架构会不会有问题?192.168.100.100       192.168.2.100电信用户        网通用户  |   |192.168.100.1  |  |        192.168.2.1    电信用户家里路由器  网通用户家里路由器 51.1.2.3  | |61.1.2.3  |www.abc.com |   |    |71.1.2.3          |  |81.1.2.3     公司电信路由器   公司网通路由器10.1.1.1  |          |172.16.21.1  | |  | | 10.1.1.100     eth0 双线web服务器 eth1172.16.21.100这里应该有智能DNS(DNS服务器会通过SIP是电信还是网通,来智能的解析同一个网站的DIP;在此例中,电信用户会被解析访问71.1.2.3,网通用户会被解析访问81.1.2.3)sip:192.168.100.100dip:71.1.2.3 通过网关192.168.100.1到达电信用户家里路由器,做SNATsip:51.1.2.3dip:71.1.2.3 通过公网路由到达公司电信路由器,做DNATsip:51.1.2.3dip:10.1.1.100到达双线web服务器,返回sip:10.1.1.100dip:51.1.2.3通过网关10.1.1.1返回给公司电信路由器,自动SNATsip:71.1.2.3 dip:51.1.2.3通过公网路由回到电信用户家里路由器,自动DNATsip:71.1.2.3 dip:192.168.100.100