如何同时配置 iptables 以进行 IP 伪装和防火墙?

如何同时配置 iptables 以进行 IP 伪装和防火墙?

我有一台主机,充当将家庭网络路由到 Internet 的网关。IP 伪装已启用数月,系统运行良好。

我该如何配置它才能同时充当防火墙?我对FORWARD链中流量设置的任何条件都不起作用。

例如

-A FORWARD -i eth1 -p tcp -j ACCEPT

只需从路由中删除所有 TCP 流量,而不是仅将其限制为来自 eth1 的流量。此外...

 -A FORWARD -s 192.168.2.0/24 -p tcp -j ACCEPT

...不仅允许来自 192.168.2.0 子网的 TCP 流量,在我应用规则时,所有 TCP 流量都会停止路由。

我无法找到有关使用伪装进行数据包破坏的任何清晰文档,或者有关如何放弃伪装而使用 SNAT 的清晰文档。

  • eth0是外部接口,与 DSL 路由器位于同一子网
  • eth1是内部接口,我的所有主机都在 DHCP 上正常工作

如何配置 iptables 来执行 IP 伪装和防火墙功能?

# Generated by iptables-save v1.4.21 on Thu Oct 29 12:48:19 2015
*nat
:PREROUTING ACCEPT [10859:2328892]
:INPUT ACCEPT [1002:126271]
:OUTPUT ACCEPT [1256:91484]
:POSTROUTING ACCEPT [638:43890]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu Oct 29 12:48:19 2015
# Generated by iptables-save v1.4.21 on Thu Oct 29 12:48:19 2015
*filter
:INPUT ACCEPT [5:803]
:FORWARD ACCEPT [127:18532]
:OUTPUT ACCEPT [5:431]
-A INPUT -i eth1 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "HTTP Serve eth1"
-A INPUT -i eth1 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "SSH Serve eth1"
-A INPUT -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT -m comment --comment "ssh on eth1"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j DROP -m comment --comment "drop dns from eth0"
-A INPUT -p icmp -j ACCEPT
-A INPUT -i eth0 -j DROP
-A INPUT -i eth1 -j REJECT
-P INPUT DROP
-A FORWARD -p tcp -j ACCEPT -m comment --comment "all tcp from internal"
-A FORWARD -p udp -j ACCEPT -m comment --comment "all udp from internal"
-A FORWARD -p icmp -j ACCEPT
-P FORWARD DROP
-A OUTPUT -o eth1 -p tcp -m tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-P OUTPUT DROP
COMMIT
# Completed on Thu Oct 29 12:48:19 2015

答案1

iptables 和一般的网络比你想象的要复杂得多。

因此,假设您只执行此操作,希望启用来自内部 eth1 的所有传出流量,如第一行所示:

-A FORWARD -i eth1 -p tcp -j ACCEPT
-P FORWARD DROP

打破这一局面的地方在于所有连接和流量都是双向的。FORWARD 正在处理所有不以路由器为目标(输入)或不来自路由器(输出)的流量。因此,FORWARD 会获取发起连接的出站 TCP 流量(规则允许)以及尝试确认该连接并传回流量的所有回复(由于您丢弃了所有其他不匹配的流量,因此需要新的规则来允许)。

这时 iptables 就会变得非常复杂,因为为每个双向潜在数据包设置一条规则是疯狂的。如果第一条规则始终使用 -m state --state ESTABLISHED 允许已建立连接的流量,情况就会变得简单。正如你在另一个问题中开始使用的那样,解决你的 NAT 问题。这样您就可以为要允许启动的连接编写规则。将传入和传出连接分类到它们自己的规则中也可能会有所帮助(除非您只担心传出),如下所示:

#setup
-N outbound
-N inbound
#design
-A FORWARD -m state --state ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o eth1 -j inbound
-A FORWARD -i eth1 -o eth0 -j outbound
-P FORWARD DROP
#allow outgoing web access
-A outbound -p tcp -m tcp --dport 80,443 -j ACCEPT
#and nothing else
-A outbound DROP
#etc....

相关内容