我正在尝试将我的 Gentoo Linux 配置为路由器。
这是我到目前为止的配置。
WAN网卡是enp3s0
和LAN网卡是enp1s0f0
接受来自 LAN 的连接到 ICMP、tcp 端口 53、22、80、443、445、5900 和 udp 端口 53、67、68
接受来自 WAN 的 SSH 端口 22 的连接
这些工作很好,我没有做的是创建端口转发。
我正在尝试设置,如果端口 222 上的连接来自 WAN,则将其转发到192.168.1.2
端口上具有 ip 地址的机器,22
并且此规则不会产生错误,但也不允许我连接。
这是我的配置:
table ip filter {
chain input {
type filter hook input priority filter; policy accept;
ct state { established, related } accept
iif "lo" accept
iif "enp1s0f0" tcp dport { 22, 53, 80, 443, 445, 5900 } counter packets 0 bytes 0 log accept
iif "enp3s0" tcp dport { 22 } counter packets 0 bytes 0 log accept
iif "enp1s0f0" udp dport { 53, 67, 68 } accept
iif "enp1s0f0" ip protocol icmp accept
counter packets 1 bytes 259 drop
}
chain output {
type filter hook output priority filter; policy accept;
ct state { established, related, new } accept
iif "lo" accept
}
chain forward {
type filter hook forward priority filter; policy accept;
iif "enp3s0" oif "enp1s0f0" ct state { established, related } accept
iif "enp1s0f0" oif "enp3s0" accept
iif "enp3s0" oif "enp1s0f0" counter packets 0 bytes 0 drop
}
chain postrouting {
type filter hook postrouting priority filter; policy accept;
}
}
table ip nat {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
oifname "enp3s0" masquerade
}
chain prerouting {
type nat hook prerouting priority 100; policy accept;
iif "enp3s0" tcp dport { 222 } dnat to 192.168.1.2:22 ### <- PORT FORWARDING RULE HERE
}
}
我该如何纠正这个问题?
谢谢你。
一旦新流的第一个数据包(因此状态为 NEW)遍历nat 预路由链,dnat就会发生,并且随着新的目的地数据包被路由并遍历过滤器转发链。
然后这条规则删除它:
需要一个允许第一个数据包(未处于已建立状态)的规则。
这可以以第一种天真的方式插入到删除规则之前:
并且由于特定的拓扑:192.168.1.0/24 LAN 不可路由,因此默认情况下无法从 Internet 访问,这可能就足够了(从技术上讲,下一跳路由器可以作弊并直接到达 192.168.1.2:22 NAT)。但是如果系统没有做任何伪装(并且有一个可路由的 LAN 而不是 192.168.1.0/24),这将使服务可以直接访问。
实际上有一个更简单和更安全的方法,如果其他一些端口也被dnat -ed 并且所有这些dnat规则都是允许的,那么它也更通用:添加一个允许任何经过dnat转换的数据包的规则。在等效的iptables-extensions ' conntrack match中更详细:
只需将其插入到最后一个丢弃规则之前的过滤器中:
或者更准确地说:
非常精确:
此状态只能因为先前对流执行的dnat规则而出现,因此它验证意图:接受。
笔记:
没有必要为不同的钩子类型(filter和nat)使用不同的表,只要它是关于同一个系列(这里是ip)。
这是从iptables继承的一个习惯,可能会限制可能性。例如,集合的范围是一个表。在过滤器链和nat链之间使用相同的集合要求它们位于同一个表中(定义集合的地方)。可悲的是,即使来自 wiki 的许多示例仍然使用模仿iptables的命名约定。
虽然在这里无关紧要,但nat 预路由的历史优先级不是 100 而是 -100(又名dstnat)。
只有存在其他表也包括nat 预路由链,或者是否一起使用iptables nat规则(在这种情况下,建议使用 -101 或 -99 而不是 -100),以确定哪些规则需要优先级。