iptables FORWARD和INPUT

问题描述 投票:28回答:3

我有一个带有Linux pc的家庭网络,它们都运行iptables。我认为把我的局域网放在Linux网关/防火墙后更容易,所以我在我的路由器和局域网之间安装了一台电脑(带有fedora,没有gui)并配置了iptables。这里没问题,INPUT只允许dns一个http(和一些本地的东西),转发工作正常:LAN连接到互联网。

但我的问题是:FORWARD允许来自外部的所有内容,还是只允许我使用INPUT配置的端口? FORWARD和INPUT一起工作还是分开?

这是我的iptables:

*nat
:PREROUTING ACCEPT [16:1336]
:INPUT ACCEPT [14:840]
:OUTPUT ACCEPT [30:2116]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o p1p1 -j MASQUERADE
COMMIT
# Completed on Tue Oct 16 09:55:31 2012
# Generated by iptables-save v1.4.14 on Tue Oct 16 09:55:31 2012
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [91:9888]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p UDP --dport 53 -j ACCEPT
-A INPUT -p TCP --dport 53 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -i p1p1 -p tcp -m multiport --dports 20,21 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.2.0/24 -i p3p1 -p tcp -m multiport --dports 20,21 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.1.0/24 -i p1p1 -p tcp -m tcp --dport 5000:5100 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.2.0/24 -i p3p1 -p tcp -m tcp --dport 5000:5100 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i p1p1 -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.2.0/24 -i p3p1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.1.0/24 -i p1p1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i p1p1 -p tcp -m multiport --dports 20,21,443 -j DROP
-A INPUT -i p1p1 -p tcp --dport 5000:5100 -j DROP
-A INPUT -i p1p1 -p icmp -m icmp --icmp-type 8 -j DROP
-A FORWARD -s 192.168.2.0/24 -j ACCEPT
-A FORWARD -d 192.168.2.0/24 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A OUTPUT -j LOG --log-prefix "denied out: "

COMMIT

p1p1(.1.x)是我的外部nic,p3p1(.2.x)是内部的。

linux input iptables forwarding
3个回答
79
投票

RedHat有一个great doc about iptables(有点长),但要覆盖的主题是复杂的,有很多不同的用例,我不知道如何避免它。

这是关于FORWARD and NAT Rules的章节。如上所述:

例如,如果要将传入的HTTP请求转发到172.31.0.23的专用Apache HTTP Server,请使用以下命令作为root用户:

~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80

这是发生的事情:

  • 您的linux网关从路由器接收数据包。包头有: 来源:x.x.x.x:y(用于数据包传输的互联网和源端口的发送方IP) 目的地:192.168.1.1:80(假设你的Linux网关IP在外部网卡上,即p1p1
  • 您的linux网关应用PREROUTING链来查找匹配项。假设您键入了上面的内容,数据包匹配规则,然后调用(跳转-j)到DNAT函数(目标网络地址转换),该函数将数据包标头的目标从初始192.168.1.1:80更改为172.31.0.23:80
  • 然后,数据包到达路由决策。数据包目的地现在是172.31.0.23:80。 你的linux网关问自己:它适合我(192.168.1.1:80)?不,所以我不会把它发送到INPUT链。 =>我会将它发送到FORWARD链。
  • 由于您已在本地网络上将规则设置为FORWARD all(表filter chain FORWARD),因此数据包应正确转发到本地Apache HTTP Server(例如)。

希望它能帮助理解内部路由如何与iptables协同工作。


66
投票

INPUT,FORWARD和OUTPUT是分开的。数据包只会命中三个链中的一个。

如果目的地是该服务器,它将命中INPUT链。如果它的源是来自此服务器,则它会命中OUTPUT。如果它的源和目标都是其他机器 - 它正在通过服务器路由 - 那么它就会击中FORWARD链。


0
投票

因为你有定义的策略禁止FORWARD:FORWARD DROP [0:0]使​​用以下规则你只为特定的子网启用FORWARD:-A FORWARD -s 192.168.2.0/24 -j ACCEPT -A FORWARD -d 192.168 .2.0 / 24 -j ACCEPT因此,INPUT和OUTPUT仅与“服务器”IP相关

© www.soinside.com 2019 - 2024. All rights reserved.