我是这个社区的新手,也是我想要使用的工具的新手iptables
,所以请容忍我的无能^_^
无论如何,我的情况如下:
- 我有一个具有私有 IP 地址的私有 LAN。
- LAN 通过路由器连接到我所在组织的网络,该网络具有固定的 IP 地址范围。
- 反过来,该网络通过网关连接到互联网。
- 在我的私人局域网中,我正在运行一个在端口上监听的服务器
A
。 - 它接受来自端口的我的私有局域网中所有计算机的所有请求
A
。 - 它是一个以请求/响应模式运行的 TCP 服务器,即我需要与它进行通信。
- 在我的私人局域网之外的任何地方都无法访问它。
- 操作系统是Ubuntu 16.04,
iptables
已安装。
我可以轻松配置我的路由器,将所有传入的 TCP 连接转发到我服务器的一个端口B
到端口A
。这意味着来自外部的任何人(无论是来自组织网络还是互联网)都可以连接到我的路由器的 IP 地址端口,B
并被转发到我的服务器端口A
。但是,我只希望我组织网络中的用户被允许这样做。对于来自互联网的一般用户,应该无法访问我的服务器。
我想要在iptables
我的服务器上实现的是。
- 我的私有 LAN 运行正常。LAN 中计算机上的所有进程仍可使用其私有 IP 地址和端口连接到我的服务器
A
。 - 我所在组织网络中的用户可以(通过 IP 地址范围或子网掩码标识)访问我的路由器的 IP 地址和端口
B
以使用我的服务,他们的数据包会被转发到我的服务器及其端口A
。 - 既不在我的私有局域网中也不在组织网络中的用户不应被转发,他们不应连接到我宝贵的服务器。
- 如果我的私人局域网中的一台计算机尝试使用端口访问服务器
B
,那应该是可以接受的,即,我们可以重定向任何访问端口的B
人,除了来自外部互联网的人。
现在我从未使用过iptables
,我甚至不确定是否可以用它做到这一点,尽管我认为它可能可以做到。我看过一些例子,但它们似乎没有达到我想要的效果,我不确定我是否足够了解它们,不会因为玩弄它们而破坏某些东西。
非常感谢,托马斯。
答案1
假设您的 LAN 有 192.168.0.0/24,您的组织网络有 172.16.0.0/24,您的路由器有 192.168.0.1(在 eth1 上)和 172.16.0.1(在 eth0 上)地址,并且您想通过 192.168.0.2:80 或 172.16.0.1:8080 访问您的服务器。
为了转发数据包,您需要net.ipv4.ip_forward = 1
在 /etc/sysctl.conf 中添加
#!/bin/bash
iptables -P INPUT DROP # if no rule match, drop the packet
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT # router can access everything
iptables -A PREROUTING -s 172.16.0.0 -d 172.16.0.1 -p tcp --dport 8080 -j DNAT 192.168.0.1:80 # destination nat with ACL
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # only accept established connections from LAN to router
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # established connections
iptables -A FORWARD -i eth1 -s 192.168.0.0/24 -j ACCEPT # LAN to ORG or INET
iptables -A FORWARD -i eth0-s 172.16.0.0/24 -d 192.168.0.2 -p tcp --dport 80 -j ACCEPT # this rule comes after the dnat one, so destination already changed
iptables -A POSTROUTING -i eth1 -s 192.168.0.0 -j SNAT --to-source 192.168.0.1 # source nat
您可能需要尝试使用 iptables 并根据自己的需求进行自定义。
您需要知道的是:是的,您可以使用 iptables 做任何您想做的事情。