用于 http 请求的 FreeBSD 端口重定向

FreeBSD port redirection for http requests

我一生中从未使用过 FreeBSD,但我有必要在 FreeBSD 上部署 HTTP API。 API部署在3002端口。

如何将80端口的请求转发到3002端口?

我尝试将其添加到我的 /etc/natd.conf 文件中:

interface le0
use_sockets yes
dynamic yes

redirect_port tcp 192.168.1.8:80 192.168.1.8:3002

我的 /etc/ipfw.rules 文件中也有这个:

 ipfw add 1000 fwd 127.0.0.1,80 tcp from any to any 3002

当我 运行 ipfw -q -f flush 我得到:

 ipfw: setsockopt(IP_FW_XDEL): Protocol not available

我不知道这是什么意思,但它不起作用。

有人可以告诉我(用简单的新手术语)如何在 FreeBSD 中将请求从 80 转发到 3002 吗?

(我假设端口 80 已打开并且是全新 FreeBSD 安装上 HTTP 请求的默认端口)

记住你需要在 /etc/rc.conf 中输入:gateway_enable="YES"。你可能还需要创建一个管道(检查 ipfw man),并加载一个 dummynet 模块.

在我看来,更简单的选择是使用 PF。让我引用手册中的一个例子 https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls-pf.html

... redirection and NAT rules need to be defined before the filtering rules. Insert this rdr rule immediately after the nat rule:

rdr pass on $int_if proto tcp from any to any port ftp -> 127.0.0.1 port 8021

FWIW,我已经发布了 Ansible 角色来配置 PF https://galaxy.ansible.com/vbotka/freebsd-pf/

最简单的方法是使用 Nginx or HAproxy to listen on port 80 and then forward/proxy your requests to your API, by doing this you could also benefit from terminating SSL port 443 并将流量转发到您的 API

例如安装nginx:

# pkg install nginx-lite

然后编辑 /usr/local/etc/nginx/nginx.conf 并在服务器部分使用它:

server {
    listen 80 default_server;
    server_name _;

    location / {
        proxy_pass http://127.0.0.1:3002;
        proxy_http_version 1.1; # for keep-alive
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

这会将请求转发到端口 3002 上的 API,无需使用 NAT 或任何防火墙,如 ipfwpf,如果您也可以使用让你的应用 运行 入狱。

快完成了!!!!

应该是

[was] ipfw add 1000 fwd 127.0.0.1,80 tcp from any to any 3002

ipfw add 1000 allow ipv4 from any to 127.0.0.1 via eth2

ipfw 通过 eth2 添加 1010 fwd 127.0.0.1,3002 ipv4 到任意 80,443