高性能防火墙
想象一下,您有超过两个网络通过虚拟局域网协议(IEEE 802.1q)或 VLAN 分隔,通过智能/可管理交换机在一条 10/100/1000 MB HD/FD 的主干线路上进行传输(当然最好是 1000 MB FD)。
本页面介绍如何使用 iptables 和 VLAN 以及 iproute2 创建高性能防火墙/NAT。 这样您就可以与大量的主机共享互联网连接,并保持良好的性能。
VLAN 支持
首先,按照 VLAN 页面中的说明创建子网络。
轮询 NAT
假设我们有一个 IP:200.aaa.bbb.6,我们的网关是 200.aaa.bbb.1。 我们可以安全地将这些参数默认放入我们的配置中。 它不会参与到我们的防火墙中。
假设我有 3 组,每组 10 个 IP 地址用于操作...... 我们将在我们的防火墙脚本中定义 NEXT
Gr1='200.AAA.CCC.10-200.AAA.CCC.20' Gr2='200.AAA.DDD.10-200.AAA.DDD.20' Gr3='200.AAA.EEE.10-200.AAA.EEE.20'
接下来重要的一行是
iptables -t nat -A POSTROUTING -s 192.168.0.0/21 -j SNAT --to $Gr1 #ACCESS VLAN 10 iptables -t nat -A POSTROUTING -s 192.168.8.0/21 -j SNAT --to $Gr2 #ACCESS VLAN 20 iptables -t nat -A POSTROUTING -s 192.168.15.0/21 -j SNAT --to $Gr1 #ACCESS VLAN 30 .... etc
您可以重复这些组用于访问,细分网络等等,iptables 默认在 Gr1、Gr2 和 Gr3 上进行轮询,无需修改。
没有必要为组中的每个 IP 地址创建一个虚拟网卡(别名)。
重要的是,每个真实路由器都知道每个组,并通过 BGP(或类似协议)将其发布给邻居。
提示
为了加速某些端口,您可以将此置于 FORWARD 链的顶部
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -p icmp -o eth0 -j ACCEPT iptables -A FORWARD -p tcp -m multiport --dports 80,443,110,53 -j ACCEPT # FAST FAST FAST iptables -A FORWARD -p udp --dport 53 -j ACCEPT
这意味着
- 如果是已建立的连接,传入的数据包将只经过 1 条规则
- 如果是 ping 或类似的,传入的数据包将经过 2 条规则
- 如果是 http、邮件或类似的,数据包将经过 3 条规则
- 并且 DNS 请求将经过 3 或 4 条规则才会出去
外发的病毒会杀死我们的机器,我们不需要共享“windows”对话,所以,干掉它们!!!!
#VIRUS iptables -A FORWARD -p tcp --dport 135:139 -j DROP iptables -A FORWARD -p tcp --dport 445 -j DROP iptables -A FORWARD -p udp --dport 135:139 -j DROP iptables -A FORWARD -p udp --dport 445 -j DROP
如果可以,在它们到达我们的机器之前。
高性能
我们进入本指南真正重要的部分。
在我们努力让大量主机通过我们的机器运行时,我们遗漏了一些东西
- 我们忘记了只有一块网卡可能要处理超过 8000 个 MAC 地址。 网卡的共享内存没有为此做好准备!!!!
- 默认情况下,iptables 没有准备好同时处理如此多的连接 !!!!!!
所以...
对于第一个问题...我在日志中收到一些与此相关的错误消息,非常抱歉,我丢失了这些日志,不记得它们说了什么。 但答案是这个,增加邻居的阈值内存。 输入这个并阅读
# cat /proc/sys/net/ipv4/neigh/default/gc_thresh1 128 # cat /proc/sys/net/ipv4/neigh/default/gc_thresh2 512 # cat /proc/sys/net/ipv4/neigh/default/gc_thresh3 1024
接下来您可以将此放入 /etc/sysctl.conf
net.ipv4.neigh.default.gc_thresh1 = 512 net.ipv4.neigh.default.gc_thresh2 = 1024 net.ipv4.neigh.default.gc_thresh3 = 2048
并执行 sysctl -p 以增加到两倍!!! (无需重启)这样我就不会收到错误了!!!!
接下来的部分需要一些关于 buckets 和 conntracks 以及 hashsize(iptables 管理 nat 连接的方式)的理解。 在 这里 有一篇关于此的非常好的文档。 阅读它!!!! 自 IPtables 被称为 Netfiler 以来,一些事情发生了变化。
总而言之!!! 将此放入您的模块部分
MODULES=(8021q 'nf_conntrack hashsize=1048576' nf_conntrack_ftp ...and other nf_stuff .......)
最后一部分只是为了避免我们遇到的 ftp 连接问题(我认为这不再必要了)。 'nf_conntrack hashsize=1048576' 增加了 hashsize 的数量(增加了分配给 NAT 连接的内核内存)(需要重启或 重新加载模块 :-) 通过以 root 身份运行 dmesg | grep conntrack
查看)
接下来放入类似于 /etc/sysctl.d/99-sysctl.conf
的内容:文件
... net.netfilter.nf_conntrack_max = 1048576 ...
并执行 sysctl --system 命令
在我的情况下,数字是相同的,这意味着我每个 bucket 有 1 个连接!!!! 我不需要更多!!!! 默认情况下,NetFilter 设置的比率是 1:8。 即每个 bucket 8 个连接!! (我想,记不太清了)。
在我们的案例中,我们在 2 个 1Giga 网卡中获得了大约 600,000 个并发连接,您可以使用以下命令查看
# cat /proc/sys/net/netfilter/nf_conntrack_count
并将其放入 snmpd 代理中,以便在 MRTG/cacti 服务器中获取和绘制图形...... 呜呜呜呜家庭作业
iproute2
我们有 3 个大型互联网接入!! 这是因为我们在这个防火墙中管理 3 个 C 类 IP 组(BGP 的一些限制)。 因此,我们有 3 个可以管理的传入流量,但只有一个传出流量!! 我们的默认网关。 这很容易填满我们的传出配额,所以我们必须节省它。
首先我们必须在 /etc/iproute2/rt_tables 文件中放入一些新表
# echo 200 PRO_1 >> /etc/iproute2/rt_tables # echo 205 PRO_2 >> /etc/iproute2/rt_tables # echo 210 PRO_3 >> /etc/iproute2/rt_tables
可以更多,可以更少,取决于流量
其次,我们必须为这些表提供默认网关
# ip route add default via 200.aaa.bbb.2 table PRO_1 # ip route add default via 200.aaa.bbb.3 table PRO_2 # ip route add default via 200.aaa.bbb.4 table PRO_3
建议但不必要将本地接口放入每个表中。 如果您不放入接下来的几行,您将无法在本地网络中获得 ping 的响应,但您仍然可以穿透。
# ip route add 192.168.0.0/21 via 192.168.0.1 table PRO_1 # ip route add 192.168.8.0/21 via 192.168.8.1 table PRO_1 # ip route add 192.168.15.0/21 via 192.168.15.1 table PRO_1 ..... same PRO_2, same PRO_3
最后一件事是给传入的数据包排序
# ip rule add from 192.168.0.0/21 table PRO_1 .... ....
再次,您可以玩 PRO_X,甚至可以玩掩码和子网掩码。 例如,我们只想将一个 C 类网络用于传出到 PRO_3
# ip rule add from 192.168.1.0/24 table PRO_3
将其放在 <NET>/21 之前