use iptables to manage firewalling of ubuntu 16.04 bridge on VMware

背景: IDC分配了大量IP地址,但是自己并不能做网关,但我又不能把所有的机器全部直接置于外网,增加管理成本。
方案:
使用ubuntu 16.04做防火墙(FW)
外网(internet)只连接FW的ens160。
增加DMZ网络(DMZ),所有的需要外网IP的机器和FW的ens192全部连接到DMZ。

在FW中安装bridge-utils并桥接ens160与ens192,不知道怎么桥接的请直接参考这里

接下来就是在VMware上启用DMZ和internet的混杂模式(Promiscuous Mode)。记住,两个网络的混杂模式都必须开启。不知道怎么开启混杂模式的可以看这里。这里没必要开启整个vSwitch的混杂模式,只需要开启DMZ和internet端口组就足够了。

到了这步,你的桥接就做完了。这个时候,你DMZ里面所有的机器都有完全的外网访问权限,你在iptables里面设置的规则完全限制不了DMZ的网络。接下来就是启用iptables对bridge的限制。

运行下面命令启用bridge netfilter模块

modprobe br_netfilter

修改 /etc/modules-load.d/modules.conf,在最后加上下面一行,这样机器在重启后也会自动加载bridge netfilter模块

br_netfilter

再修改 /etc/sysctl.conf,在文件的最后添加下面几行:

###################################################################
# For iptables to manage bridge firewalling
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1

最后,运行下面命令使配置生效

sysctl -p

现在,就可以使用iptables对DMZ进行管理了。
不过,我目前还没摸清这里面进出端口(iptables里面的-i和-o)的规则,只能直接使用IP了。

利用iptables来做pptp的防火墙

嗯,今天帮朋友做了一个VPN服务器的安全规则,又了解了什么叫GRE,果然,三人行必有我师哈
具体做法如下

首先默认拒绝的策略

iptables -P INPUT DROP
iptables -P FORWARD DROP

然后针对拨入数据包做限制,在这里,除了pptp的监听端口1723之外,还要允许GRE协议,端口是47

iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

然后就是给拨入的地址做伪装

iptables -A POSTROUTING -s 192.168.0.0/255.255.255.0 -j MASQUERADE

接下来设置FORWARD,前面我们做了默认拒绝的策略,你也可以像我们一样,只允许客户访问特殊的IP或者IP段

iptables -A FORWARD -d 8.8.0.0/16 -j ACCEPT
iptables -A FORWARD -d 202.103.96.112 -j ACCEPT

当然,如果你允许VPN客户端访问所有的网站,你可以忽略上面所有关于FORWARD链的操作
或者,现在再做一次

iptables -P FORWARD ACCEPT

iptables中DNAT与SNAT的理解

DNAT(Destination Network Address Translation,目的地址转换) 通常被叫做目的映谢。而SNAT(Source Network Address Translation,源地址转换)通常被叫做源映谢。

这是我们在设置Linux网关或者防火墙时经常要用来的两种方式。以前对这两个都解释得不太清楚,现在我在这里解释一下。

首先,我们要了解一下IP包的结构,如下图所示:
iphdr
在任何一个IP数据包中,都会有Source IP Address与Destination IP Address这两个字段,数据包所经过的路由器也是根据这两个字段是判定数据包是由什么地方发过来的,它要将数据包发到什么地方去。而iptables的DNAT与SNAT就是根据这个原理,对Source IP Address与Destination IP Address进行修改。

然后,我们再看看数据包在iptables中要经过的链(chain):
netfilter_packet_flow
图中正菱形的区域是对数据包进行判定转发的地方。在这里,系统会根据IP数据包中的destination ip address中的IP地址对数据包进行分发。如果destination ip adress是本机地址,数据将会被转交给INPUT链。如果不是本机地址,则交给FORWARD链检测。
这也就是说,我们要做的DNAT要在进入这个菱形转发区域之前,也就是在PREROUTING链中做,比如我们要把访问202.103.96.112的访问转发到192.168.0.112上:

iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112

这个转换过程当中,其实就是将已经达到这台Linux网关(防火墙)上的数据包上的destination ip address从202.103.96.112修改为192.168.0.112然后交给系统路由进行转发。

而SNAT自然是要在数据包流出这台机器之前的最后一个链也就是POSTROUTING链来进行操作

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66

这个语句就是告诉系统把即将要流出本机的数据的source ip address修改成为58.20.51.66。这样,数据包在达到目的机器以后,目的机器会将包返回到58.20.51.66也就是本机。如果不做这个操作,那么你的数据包在传递的过程中,reply的包肯定会丢失。

Iptables 简单实现IP与MAC绑定上网[转]

原帖地址:http://blog.chinaunix.net/u1/34243/showart_1220479.html

Linux服务器承担整个校园网访问因特网的网关,在Linux环境中,有一个非常灵活的IP过滤工具是iptables,这个工具在使用的时候可以设置 多个条件同时满足才允许通过IP数据,利用这个功能就可以实现地址绑定功能。设计理念是只有IP地址和MAC地址同时满足条件时才允许数据转发,命令如 下:

iptables -P FORWARD DROP
iptables -A FORWARD -s 192.168.6.200 -m mac --mac-source 00:11:5B:EF:7A:D8 -j ACCEPT
iptables -A FORWARD -s 192.168.6.201 -m mac --mac-source 50:78:4C:4A:46:C0 -j ACCEPT
iptables -A FORWARD -s 192.168.6.202 -m mac --mac-source 00:10:5C:E4:A8:50 -j ACCEPT

上面第一行是转发策略,意思是没有指定的转发链是禁止转发任何数据的。第二行表示只有满足IP地址是192.168.6.200同时MAC地址为 00:11:5B:EF:7A:D8才允许转发,类似的第三、四行分别绑定的是192.168.6.201和192.168.6.202。每台机器对应这 样一行,就可以实现所有机器IP地址与MAC地址的绑定。解除绑定状态只要把上面命令行中的-A替换为-D就可以删除本转发链,同时还要把转发策略改为 ACCEPT。以上的命令需要配合POSTROUTING链才可以实现上网功能。

PS:

iptables限速命令:

iptables -A FORWARD -s 192.168.0.2 -m limit --limit 20/s -j ACCEPT
iptables -A FORWARD -s 192.168.0.2 DROP