iptables实例

举几个常用的iptables实例,具体分析一下使用。

1.防火墙

最常用的iptables基本功能防火墙,参见配置一个生产的iptables防火墙规则

2.共享上网

想要共享上网,必须将不能上网主机的网关设置可以访问外网的主机。

我在阿里云上使用专有网络做的试验,弹性计费很便宜,用完别忘了删,要不一直收钱^_^

网络拓扑,一共两台主机:

  • 一台172.16.147.210,有EIP弹性IP绑定121.43.189.118,可以上外网,称为主机A
  • 一台172.16.147.211,不能上外网,称为主机B

让主机B通过主机A共享上网步骤如下:

  • 将主机B的网关设置为A,重启网络
    ifcfg-eth0中,设置GATEWAY=172.16.147.210
  • 开启主机A的网络转发
    echo "1" > /proc/sys/net/ipv4/ip_forward
    #上面是临时开启,重启主机会失效,永久生效需要修改/etc/sysctl.conf
    # Controls IP packet forwarding
    net.ipv4.ip_forward = 1

    #然后运行sysctl -p来加载生效
  • 开启主机A的SNAT功能,将来自主机B的数据包源ip修改为自己。为什么需要这样做?因为如果不修改,主机A虽然把B的数据包转发出去了,但数据包的源IP还是主机B的内网IP,外网的主机回复的数据包并不知道往哪里发,所以需要让外网主机回复数据包给A,再由A转发数据包给B。
    #使用iptables的SNAT功能,让外网看起来数据包是由A主机发送出去的,这也是普通的路由器所做的事情
    iptables -t nat -A POSTROUTING -s 172.16.147.211 -j SNAT --to-source 172.16.147.210

这里,其实还隐含了一个反SNAT的过程,因为外网返回的数据包的目标IP是主机A的,所以主机A会根据内存中的转换表,做一个UN SNAT,将目标IP转换为B的IP,否则包的传输是进行不下去的。

此时,在正常的网络中,如果防火墙没有额外配置(如iptables禁用forward),主机B已经可以访问外网。但是在阿里云的专有网络中,却搞了半天还是不行,最后才发现是阿里专有网络中,arp协议不能正常使用导致,正常网络中ip对应主机应该应答自己的MAC地址,然后就可以直接发送数据包。但专有网络所有的arp协议都会直接返回ee:ff:ff:ff:ff:ff,导致内网间主机不能直连,所有数据包都需要经过虚拟路由器转发,而路由器中默认只有内网与阿里管理主机如DNS主机的路由,所以访问外网的数据包无法发到主机A上。

所以解决方法为,在阿里专有网络的路由器配置中,添加一条路由,将所有数据包(内网包除外)路由到主机A上。如图:
这里写图片描述

这样才可以实现共享上网。

3.端口映射

有时候内网主机提供服务,如在主机B上提供80端口的HTTP服务,外网是无法直接访问的,只能在主机A上开一个端口映射,如将A的端口8888映射为B的端口80,所有对A:8888的访问数据包,都直接转发给B:80。

实现方式很简单:

3.1 外网主机访问

    iptables -t nat -A PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 172.16.147.211:80

简单分析一下:

  • 为什么需要做DNAT,不做的话目的IP是A,A自己就把这个包给吃了,不会转发的;
  • 为什么在PREROUTING链做,想想之前文章的那张数据包流向图,只能PREROUTING在路由之前,再往后面就已经决定了数据包是发给自己还是需要转发的了;

做了这个配置后,使用外网访问一下A主机的8888端口,会发现成功访问了B的80HTTP服务。在阿里云上做实验别忘了给路由器添加路由规则,解释在上面提到过。

DNAT也相应的有一个UN DNAT的过程,数据包转发给B后,B的返回包源地址是B:80,经过A时,A会对照内存中的映射表,自动将返回包的源地址转换为A:8888,这样返回包就好像是由A:8888发出的一样,这样才能正常通信。这种映射,对于外网来说是透明的,就仿佛真得是A:8888在提供服务一样,不需要用户做任何代理设置,所以也被叫做反向代理。

3.2 同网络主机访问

但是仅仅这样配置,外网访问是可以的,内网想要访问却不行,想一下数据包的流转:

  • 内网的主机C将数据包发给了A:8888,A做了DNAT,将目的地址变成了B:80;
  • B接收了数据包,发送一个返回包,返回包的目的地址是C主机;
  • 由于是内网IP,不需要经过网关,直接通过ARP协议确认主机C的地址,数据包被直接发送到了C主机(这就是和外网的区别,数据包没有到A,没有UN DNAT的机会);
  • C主机接收了B的返回包,但C并不认识这个包,因为C没有和B进行通信,而是和A做的,所以这个包被丢弃,通信失败,连接都建立不起来;

于是,对于内网主机,我们需要让包还是返回A,所以需要添加一个SNAT,让B也以为包是A发出的:

    iptables -t nat -A POSTROUTING -p tcp --dst 172.16.147.212 --dport 80 -j SNAT --to-source 172.16.147.213

3.3 防火墙主机访问

如果防火墙主机想要访问的话,还是有问题。一般同网络或防火墙主机都不需要这样的端口映射,这里其实只是为了说明一下数据包流向。

原因是由主机本身发出的数据包,不会经过POSTROUTING链,还记得前一篇文章的数据包流向图吗?本机发出的数据包,想要做DNAT的话,只能在OUTPUT链做。所以需要添加:

    iptables -t nat -A OUTPUT -p tcp --dport 8888 -j DNAT --to-destination 172.16.147.212:80

这样才可以正常访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值