如何使用 iptables 将 HTTP 和 SSH 端口转发到我的内部服务器?

如何使用 iptables 将 HTTP 和 SSH 端口转发到我的内部服务器?

我没有路由器,所以我将 CentOS 6.4 Linux 系统做成了路由器,将公网流量转发到本地 LAN。它有两张网卡,一张用于公网 IP 地址(eth1),另一张用于私网 IP 地址(eth2)。

我有一个连接到本地局域网的服务器,假设为192.168.1.2

路由器

  • eth1: x.x.x.x,公网 IP 地址
  • eth2:,192.168.1.1内部路由器地址

当外部网络的某人在公共 IP 上运行 ssh 时,应该将其重定向到服务器:

ssh x.x.x.x或使用油灰

我禁用了服务器上的 SELinux 和 iptables 防火墙。我尝试在 Linux 系统路由器上进行一些 iptables 修改,但 SSH 请求仍然没有重定向:

iptables -t nat -A PREROUTING -p tcp -d 192.168.1.1 --dport 22 -j DNAT --to-destination 192.168.1.2:22

我还想使用来自同一 Linux 系统路由器的 iptables 将所有 HTTP(80)流量转发到我的内部服务器。

答案1

首先确保内核中启用了数据包转发

# echo 1 > /proc/sys/net/ipv4/ip_forward

您还可以通过添加以下行使其永久生效/etc/sysctl.conf

net.ipv4.ip_forward = 1

您必须在充当路由器的 Linux 机器上执行此操作。您可以在路由器机器上尝试以下规则。

iptables -t nat -A PREROUTING -i eth1 -d x.x.x.x -p tcp --dport 22 -j  DNAT --to-destination 192.168.1.2:22

另外,请让我们知道路由器盒的 NAT 规则的输出。

iptables -t nat -L -n -v

答案2

基于这一惊人的数字海洋关于如何转发端口的教程,我决定在这里重写它。

我花了很多时间研究它的工作原理。我是 Linux 新手,开始并不总是那么容易。这是我的服务器及其端口转发的示例:

防火墙服务器(2 张 NIC 卡)-网络详细信息:

  • 公共 IP 地址:xx.xx.xx.xx
  • 私有 IP 地址:年年年年年
  • 公共接口:eth0
  • 私有接口:eth1

内部的(例如 ssh、web)服务器(1 个 NIC 卡)- 网络详细信息:

  • 私有 IP 地址:zz.zz.zz.zz
  • 私有接口:eth0

解决方案:

在内核中启用数据包转发:

echo 1 > /proc/sys/net/ipv4/ip_forward

定义变量:

# Admin IP address (e.g. public home ip)
ADMIN="aa.aa.aa.aa"

# IP addresses of servers (e.g. in cloud):
FW_eth0_ip="xx.xx.xx.xx"
FW_eth1_ip="yy.yy.yy.yy"
WEB_eth0_ip="zz.zz.zz.zz"

# Services:
SSH="22"
HTTP="80"

Iptables 端口转发(使用 -m conntrack):

iptables -t nat -A PREROUTING -i eth0 -s $ADMIN -d $FW_eth0_ip -p tcp --dport $SSH -j DNAT --to-destination $WEB_eth0_ip
iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport $SSH -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -p tcp --sport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport $SSH -d $WEB_eth0_ip -j SNAT --to-source $FW_eth1_ip

几点说明:

  • “..-s $ADMIN -d $FW_eth0_ip..”(第一行)——仅出于安全原因添加——这意味着只有 ADMIN IP 可以访问 SSH(如果不需要,可以删除它)
  • -m 连接跟踪是相同的-m 状态
  • 我建议将 SSH 的默认端口更改为另一个端口,例如 1xxxx(在 /etc/ssh/sshd_config 中)
  • 查看TCP 和 UDP 端口号列表
  • 我使用端口 15xx1 访问防火墙服务器上的 SSH,使用端口 15xxx2 访问内部

终端:

# access firewall server
$ ssh [email protected] -p 15xx1

# access internal server
$ ssh [email protected] -p 15xx2

有关所用规则的更多细节已在上述教程中有完美描述。

这就是我要说的全部内容了,希望能够帮助到你。

答案3

虽然这个问题是关于 iptables 的,但是如果您还运行了 FirewallD,这里是如何访问内部网络的 HTTP。

首先在内部服务器 FirewallD 中允许 http 流量:

# firewall-cmd --permanent --add-service=http

然后将来自外部 ip 的 http 流量转发到内部 ip 的 80 端口:

# firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=10.0.0.11

对 SSH 服务也可以做同样的事情。

答案4

首先,在Linux网关中启用路由:

echo 1 > /proc/sys/net/ipv4/ip_forward

然后使用您的网络接口(即 eth1)和所需端口添加以下规则:

iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.1.2
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 22 -j DNAT --to 192.168.1.2
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

使用 检查您的规则iptables -L -v,pkts 和 bytes 列将显示哪些规则正在匹配。

相关内容