我有一个装有 Linux 电脑的家庭网络,所有电脑都运行着 iptables。我认为将我的 LAN 放在 Linux 网关/防火墙后面更容易,所以我在我的路由器和 LAN 之间放置了一台电脑(带有 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) 是我的外部网卡,p3p1 (.2.x) 是内部网卡。
红帽有一个关于 iptables 的很棒的文档 https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Security_Guide/index.html#sect-Security_Guide-Firewalls-Using_IPTables(有点长),但是要涵盖的主题很复杂,并且有很多不同的用例,我不知道如何避免它。
这是关于FORWARD 和 NAT 规则 https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Security_Guide/index.html#sect-Security_Guide-Firewalls-FORWARD_and_NAT_Rules。正如它所说:
例如,如果您想要转发传入的 HTTP 请求给你的
投入的Apache HTTP 服务器位于 172.31.0.23,使用以下命令
作为根用户:
~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80
发生的情况如下:
- your linux gateway receives a packet from your router. The packet header has:
- source:
x.x.x.x:y
(来自互联网的发送者 IP 和用于数据包传输的源端口)
- 目的地:
192.168.1.1:80
(假设你的linux网关IP在外部网卡上,即p1p1
)
- 您的 linux 网关应用预路由链来寻找匹配。假设您已经输入了上面的内容,数据包符合规则然后调用(跳转
-j
)到DNAT功能 (目标网络地址转换) which 更改数据包标头的目的地从最初的192.168.1.1:80
to 172.31.0.23:80
.
- then, the packet arrives to the Routing Decision. The packet destination is now
172.31.0.23:80
.
- 您的 Linux 网关会问自己:适合我吗(
192.168.1.1:80
)?不,所以我不会发送它到INPUT chain.
- => 我会将其发送至FORWARD chain.
- 既然你已经将规则设置为转发本地网络上的所有内容 (table
filter
chain FORWARD
),数据包应该正确转发到您的本地 Apache HTTP 服务器(例如)。
希望它能帮助您更多地了解内部路由如何与 iptables 配合使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)