Linux iptables转发和输入

Linux iptables转发和输入,linux,input,iptables,forwarding,Linux,Input,Iptables,Forwarding,我有一个带有Linux pc的家庭网络,所有的网络都运行着iptables。我认为把局域网放在Linux网关/防火墙后面比较容易,所以我在路由器和局域网之间放了一台pc(带fedora,没有gui),并配置了iptables。这里没问题,输入只允许dns和http(以及一些本地内容),转发工作正常:LAN连接到internet 但我的问题是:FORWARD是允许所有来自外部的端口,还是只允许我配置了输入的端口?转发和输入是一起工作还是分开 这是我的iptables: *nat :PREROUTI

我有一个带有Linux pc的家庭网络,所有的网络都运行着iptables。我认为把局域网放在Linux网关/防火墙后面比较容易,所以我在路由器和局域网之间放了一台pc(带fedora,没有gui),并配置了iptables。这里没问题,输入只允许dns和http(以及一些本地内容),转发工作正常:LAN连接到internet

但我的问题是:FORWARD是允许所有来自外部的端口,还是只允许我配置了输入的端口?转发和输入是一起工作还是分开

这是我的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)是内部nic。

输入、转发和输出是分开的。一个包只会击中三条链中的一条

如果目标指向此服务器,则会命中输入链。如果其源来自此服务器,则会点击输出。如果它的源和目标都是其他机器,那么它将通过服务器进行路由,然后它将到达前向链。

RedHat有一个(有点长),但是要讨论的主题很复杂,有太多不同的用例,我不知道如何避免它

这是关于的章节。正如它所说:

例如,如果希望将传入的HTTP请求转发到 位于172.31.0.23的专用Apache HTTP服务器,使用以下命令 作为根用户:

发生的情况如下:

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

希望这有助于进一步了解内部路由是如何与iptables一起工作的。

因此,如果我理解正确,我的输入是安全的(某种程度上),但FORWARD让一切都按现在的方式进行?我希望流量首先通过输入过滤,然后转发。来自外部的流量,也就是说。@Ray是的。一个包裹通过你的盒子只会被转发。它不做输入→ 转发→ 输出。好的,谢谢你的回答。有没有办法使用nat规则将某些端口路由到LAN?例如,阻止所有,为我的整个LAN打开端口53?我不是这方面的专家,我知道如何设置防火墙,但路由是不同的东西。好的,我会在那里试试。读了很多关于桥接的书,它不能做我想做的事。我想我必须潜入DNAT和SNAT的领域。。。。约翰,谢谢你和我一起思考!非常感谢你的图表!“我希望我能早点看到它。”托文第二个想法是,这是一个对新手非常有用的图表。
~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80