iptables FORWARD和INPUT

29 linux forwarding iptables input

我有一个带有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
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*han 82

RedHat有一个很好的关于iptables的文档(有点长),但要讨论的主题很复杂,有很多不同的用例,我看不出如何避免它.

iptables内核路由

这是关于FORWARD和NAT规则的章节.如上所述:

例如,如果要将传入的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
Run Code Online (Sandbox Code Playgroud)

这是发生的事情:

  • 您的linux网关从路由器接收数据包.包头有:
    • 来源:( x.x.x.x:y来自用于数据包传输的互联网和源端口的发送方IP)
    • destination :( 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链.
  • 由于您已在本地网络(filter表链FORWARD)上将规则设置为FORWARD all,因此应将数据包正确转发到本地Apache HTTP Server(例如).

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


Joh*_*ica 67

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

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