Linux:使用 iptables 在两个网络之间路由流量

Emm*_*mma 4 linux routing iptables

好的,这是一个奇怪的网络设置,但我正在尝试将互联网从一个网络连接到另一个网络。

headless server ((((( wireless router (other network)-----internet
       |
       |
router (my network) ))))) wireless computers
   |   |   |
wired computers
Run Code Online (Sandbox Code Playgroud)

所以,基本上,我有一个无头 Linux 机器,我想将它设置为我的网络 (eth0) 和另一个网络 (wlan0) 之间的路由器。我应该能够配置其他一切,但我对 iptables 不是很有经验。

我以前在两个有线网络之间做过同样的事情,但我从来没有写过规则。

Edu*_*nec 10

实际上,您实际上并不需要 iptables 来进行基本路由 - iptables 可以帮助您进行过滤和 NAT(以及其他功能)。

您可以通过以下方式激活数据包转发:

sysctl -w net.ipv4.conf.all.forwarding=1
Run Code Online (Sandbox Code Playgroud)

添加net.ipv4.conf.all.forwarding=1到 /etc/sysctl.conf 以使设置保持不变。

如果您在服务器上进行过滤(您可以使用iptables -nvL- 如果 FORWARD 链具有策略 ACCEPT 您没有过滤),您需要添加规则以允许在网络之间转发数据包:

iptables -I FORWARD -i eth0 -o wlan0 -s wi.red.net.work/24 -d wire.less.net.work/24 -j ACCEPT
iptables -I FORWARD -i wlan0 -o eth0 -s wire.less.net.work/24 -d wi.red.net.work/24 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

如果您不进行过滤但想要(顺便说一下,您也应该这样做 - 请参阅@Red Tux 的评论,默认情况下过滤并只允许最小值是一种很好的做法)添加前面的规则以及以下规则:

iptables -P FORWARD DROP
Run Code Online (Sandbox Code Playgroud)

这会更改策略,因此所有不匹配任何规则的数据包都将被丢弃。

此外,如果您想要真正的安全性,您可能还应该对 INPUT 链进行过滤。此链处理到达您的路由器的请求,其目标 IP 与其自己的 IP 之一相匹配 - 即传入连接(例如 SSH)。一个合理的默认值是:

iptables -I INPUT -i eth0 -s allowed.admin.ip.here -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -i lo -j ACCEPT
iptables -P INPUT DROP # make sure you've put your IP on the first rule before running this 
                       # or you'll lock you out of the server
Run Code Online (Sandbox Code Playgroud)

这仅允许来自有线网络中设计主机的 SSH(注意警告),允许环回接口上的所有流量(某些软件需要)并丢弃所有其余流量。

如您所见,您只能通过使用-p tcp|udp --dport N. 您也应该考虑在 FORWARD 链上执行此操作以提高安全性。