我有一个带有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)是内部的。
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
这是发生的事情:
x.x.x.x:y
(用于数据包传输的互联网和源端口的发送方IP)
目的地:192.168.1.1:80
(假设你的Linux网关IP在外部网卡上,即p1p1
)-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
chain FORWARD
),因此数据包应正确转发到本地Apache HTTP Server(例如)。希望它能帮助理解内部路由如何与iptables协同工作。
INPUT,FORWARD和OUTPUT是分开的。数据包只会命中三个链中的一个。
如果目的地是该服务器,它将命中INPUT链。如果它的源是来自此服务器,则它会命中OUTPUT。如果它的源和目标都是其他机器 - 它正在通过服务器路由 - 那么它就会击中FORWARD链。
因为你有定义的策略禁止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相关