我正在尝试将我的 Gentoo Linux 配置为路由器。
这是我目前的配置。
WAN NIC 是enp3s0
,LAN NIC 是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
}
}
我该如何解决这个问题?
谢谢。
答案1
一旦新流的第一个数据包(因此状态为 NEW)穿过nat 预路由链,基因发生这种情况,数据包将通过新的目的地进行路由并穿越向前过滤链。
然后这条规则就会把它丢弃:
iif "enp3s0" oif "enp1s0f0" counter packets 0 bytes 0 drop
允许第一个数据包(不在已确立的需要状态。
可以以一种简单的方式将其插入到删除规则之前:
iif "enp3s0" oif "enp1s0f0" ip daddr 192.168.1.2 tcp dport 22 accept
并且由于特定的拓扑结构:192.168.1.0/24 LAN 不可路由,因此默认情况下无法从 Internet 访问,这可能已经足够好了(从技术上讲,下一跳路由器可以作弊并直接到达 192.168.1.2:22,而无需 NAT)。但如果系统没有执行任何化装舞会(并且有一个可路由的 LAN 而不是 192.168.1.0/24)这将使服务直接可达。
其实有一种更简单、更安全的方法,也更通用,以防其他端口也基因-ed 以及所有此类基因规则全部允许:添加允许的规则任何经过基因转型. 更详细的内容是等效的iptables-扩展‘连接跟踪匹配:
基因转移酶
虚拟状态,如果原始目的地与答复源不同则匹配。
只需将其插入向前过滤最后一次之前降低规则:
ct status dnat accept
或者更准确地说:
iif enp3s0 oif enp1s0f0 ct status dnat accept
非常精确:
iif enp3s0 oif enp1s0f0 ct state new ct status dnat ip daddr 192.168.1.2 tcp dport 22 accept
此状态只能由于先前基因规则在流程上完成,因此它验证了意图:接受。
笔记:
没有必要对不同的钩子类型使用不同的表(筛选和纳特)只要是关于同一个家族的(知识产权这里)。
这是从iptables这可能会限制可能性。例如,放是一个表。在筛选链和纳特链要求它们位于同一张表中(其中放已定义)。遗憾的是,甚至来自 wiki 的许多示例仍然使用模仿的命名约定iptables。
虽然在这里这并不重要,但历史优先权nat 预路由不是 100 而是 -100(又名目的地地址)。
只有当其他表也包括时才会有关系nat 预路由链或如果iptables 纳特规则一起使用(在这种情况下建议使用 -101 或 -99 而不是精确的 -100),以确定哪些规则优先。