30

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

但我的问题是: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) 是我的外部网卡,p3p1 (.2.x) 是内部网卡。

4

2 回答 2

94

RedHat 有一个很棒的关于 iptables 的文档(有点长),但是要涵盖的主题很复杂,而且有很多不同的用例,我不知道如何避免它。

iptables 内核路由

这是关于FORWARD 和 NAT 规则的章节。正如它所说:

例如,如果要将传入的 HTTP 请求转发到位于 172.31.0.23 的专用Apache HTTP 服务器,请以 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 在外部 NIC 上,即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链。
  • 由于您已在本地网络filter表链)上将规则全部设置为FORWARD FORWARD,因此应将数据包正确转发到本地 Apache HTTP 服务器(例如)。

希望它有助于更​​多地了解内部路由如何与 iptables 一起工作。

于 2014-05-02T21:06:14.767 回答
72

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

如果目的地是这个服务器,它会命中 INPUT 链。如果它的源来自这个服务器,它会命中 OUTPUT。如果它的源和目标都是其他机器——它正在通过服务器进行路由——那么它会命中 FORWARD 链。

于 2012-10-18T00:02:03.333 回答