linux iptables在没有域名且网络不通的情况下实现将IP数据包从一个IP地址路由到另一个IP地址

发布时间 2024-01-03 17:09:18作者: 明月心~

linux iptables在没有域名且网络不通的情况下实现将IP数据包从一个IP地址路由到另一个IP地址

** 本文地址:https://www.cnblogs.com/muphy/p/17934332.html

场景

即使同一台服务器,在不同网络环境下访问的IP地址不同,处于不同的网段,且不同网段之间也不能ping通互通。
如在生产系统上遇到了一个问题,附件上传后会有下载地址和预览地址两个地址,预览插件采用第三方插件kkFileView
具体情况如下表

解决办法:采用nginx+iptables

在10.11.0.100使用iptables建立nat实现IP转发

iptables -t nat -A OUTPUT -d 192.168.0.111 -j DNAT --to-destination 10.11.0.100
iptables -t nat -A OUTPUT -d 43.*.*.39 -j DNAT --to-destination 10.11.0.100

在10.11.0.100使用iptables实现端口转发

# 将本机8082转发到本机8080端口
iptables -t nat -A PREROUTING -p tcp --dport 8082 -j REDIRECT --to-ports 8080
# 将整个网段的8082转发到本地8080端口
# iptables -t nat -A PREROUTING -p tcp -s 192.168.0.0/24 --dport 8082 -j REDIRECT --to-ports 8080
# 本机端口转发到后端其他服务器的服务端口
# iptables -t nat -A PREROUTING -p tcp --dport 8082 -j DNAT --to 10.11.0.100:8080
# iptables -t nat -A POSTROUTING -d 10.11.0.100 -p tcp --dport 8080 -j SNAT --to 192.168.0.111

也可以在10.11.0.100新增nginx代理配置实现端口转发

server {
        listen       8082;
        server_name  10.11.0.100;
        client_max_body_size 200m;
        charset utf-8;

        location / {
            proxy_pass http://10.11.0.100:8080/;
            #proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $host;
            #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #proxy_set_header REMOTE-HOST $remote_addr;
            proxy_buffering off;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        error_page   404 403  /40x.html;
        location = /40x.html {
            root   html/403page;
        }
    }
}

iptables扩展

参数解释

-t 指定nat还是filter表,默认filter表
-L 列出表内所有规则,可以指定特定链
-n 使输出中的IP地址和端口以数值的形式显示
-v 输出详细化
--line 显示出每条规则在相应链中的序号
-A 链中添加规则
-D 删除链中规则
-C 修改链中规则
-j 决定符合条件的包到何处去
-F 清空规则
PREROUTING 在包刚刚到达防火墙时改变它的目的地址
INPUT 从外部连接过来时的转发
OUTPUT 改变本地产生的包的目的地址
POSTROUTING 在包就要离开防火墙之前改变其源地址
DNAT:目的地址转换,将指定端口的入向过来的数据包里的目标IP和端口设置为后向服务器IP和端口,只能用在nat表的PREROUTING和OUTPUT链,--to-destination选项
SNAT:源地址转换,将目标地址为后向服务器IP的出向数据包里的源地址修改为转发服务器IP地址,后向服务器是不能直接回包到客户端的,所以需要改为转发服务器的P地址。

查看是否启用内核转发

# 输出1表示已开启
cat /proc/sys/net/ipv4/ip_forward

管理员启用内核转发

  • 编辑
vim /etc/sysctl.conf
  • 修改或新增配置
net.ipv4.ip_forward = 1

查看链路规则

iptables -t nat -nL --line

删除指定规则

# 删除PREROUTING链的规则2
iptables -t nat -D PREROUTING 2
# 清空规则
iptables -t nat -F

保存规则

# kali
iptables-save
# 其他linux
service iptables save

启停iptables

# kali
安装:apt-get install ufw
关闭:ufw disable
开启:ufw enable
# 其他
重启:systemctl restart iptables
停止:systemctl stop iptables
启动:systemctl start iptables

关于我

本人长期从事互联网相关技术研发,提供技术服务、多端软件开发、信息系统集成、信息技术咨询、上位机编写等。
联系方式,QQ&WX:1304023381