好的,我昨天开始深入研究网络,刚刚设置了我的 ubuntu 服务器,所以我完全是个新手。
我想问一下 iptables 中的输入/输出/转发链是什么?假设我想打开端口 22 进行 ssh 访问,我需要使用这三个链吗?还是只需要其中两个?
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -p tcp --dport 22 -j ACCEPT
谢谢!
答案1
输入:数据包进来从网络和到你的服务器。
输出:数据包来源从你的服务器到网络。FORWARD
:如果/当您的服务器充当不同网络之间的路由器时,由您的服务器转发的数据包。
为了允许 SSH 访问到你的服务器,你必须接受 INPUT 链中的流量。
答案2
正如正确解释的那样:
INPUT :传入数据包,即以主机为目标 IP 的数据包
OUTPUT :传出的数据包,即以主机为源 IP 的数据包
FORWARD :源 IP 和目标 IP 都不是主机 IP 的数据包
顺便说一句,谈论主机的 IP 是一种语言滥用。实际上,IP 属于网络接口,而不是主机。事实上,许多主机有多个网络接口(例如 wifi 无线电、以太网端口),每个接口都有自己的 IP。
然而,有人错误地认为,要允许 ssh,您只需添加一条允许传入 ssh 数据包的规则。这是不正确的,您自己很容易就能看到:您将允许 ssh 数据包,但防火墙将丢弃(或拒绝 - 取决于您的默认设置)您为响应该 ssh 连接而发回的任何内容。
诀窍是允许传入的 ssh 连接和通信,并允许传出的 ssh 通信(但如果您不希望主机建立传出的 ssh 连接,则不允许连接)。
实际上,您可以在 iptables 中按以下方式设置:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
(默认行为是删除或拒绝)
请注意,在许多客户端上,您实际上想要相反的设置:允许new
在established
OUTPUT 上(以允许您自己连接到外部世界),并且established
仅在 INPUT 上允许(以保护自己免受不必要的连接尝试)。
附言:我在这里扮演死灵法师,但谷歌重定向到这个(部分)不正确的接受答案,所以我认为值得纠正它。
答案3
您只需要第一条规则。
- 输入:过滤发往你的服务器的数据包
- 输出:过滤来自你的服务器的数据包
- FORWARD:过滤数据包到其他网卡可访问的服务器