iptables -L(主机)

iptables -L(主机)

我有一台 Debian 10 主机,并且正在使用 NAT 运行 Debian 10 客户机。我正在使用 libvirt/KVM/QEMU

主机公网ip:xxxx 访客ip:192.168.122.99

我正在尝试将端口 22221 转发到客户机中的端口 22,以便我从外部通过 ssh 访问客户机。我想使用以下命令直接通过 ssh 连接到客户机ssh -p 22221 x.x.x.x

我正在关注这个教程:https://wiki.libvirt.org/page/Networking#Forwarding_Incoming_Connections

我也尝试了无数其他教程,但都不起作用。特别是我不知道为什么下面的方法不起作用:

(主机内部)

1-我使用 virt-manager 关闭客户虚拟机

2-我手动调用钩子脚本ip表来转发端口

sudo iptables -D FORWARD -o virbr0 -d  192.168.122.99 --dport 22 -j ACCEPT
sudo iptables -t nat -D PREROUTING -p tcp --dport 22221 -j DNAT --to 192.168.122.99:22

3- 我启动客户虚拟机并检查其ssh 192.168.122.99是否正常运行

4-现在我尝试使用进行连接ssh -p 22221 localhost,但它拒绝连接。

我也尝试检查端口nmap -p 22221 localhost,但端口被阻止了。

iptables -L(主机)

Chain INPUT (policy ACCEPT)
target     prot opt source               destination                                                                       
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:67
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             192.168.122.99
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED                                                                    
ACCEPT     all  --  192.168.122.0/24     anywhere
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable                                                              
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable  

ip a(主机)

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:25:90:97:dc:6e brd ff:ff:ff:ff:ff:ff
    inet x.x.x.x/23 brd y.y.y.y scope global enp2s0f0
       valid_lft forever preferred_lft forever
    inet6 fe80::225:90ff:fe97:dc6e/64 scope link 
       valid_lft forever preferred_lft forever
3: enp2s0f1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:25:90:97:dc:6f brd ff:ff:ff:ff:ff:ff
4: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:54:00:60:e8:80 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:60:e8:80 brd ff:ff:ff:ff:ff:ff
7: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN group default qlen 1000
    link/ether fe:54:00:e4:c2:52 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fee4:c252/64 scope link 
       valid_lft forever preferred_lft forever

ip a (客人)

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:e4:c2:52 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.99/24 brd 192.168.122.255 scope global dynamic enp1s0
       valid_lft 2500sec preferred_lft 2500sec
    inet6 fe80::5054:ff:fee4:c252/64 scope link 
       valid_lft forever preferred_lft forever

答案1

libvirt wiki 上的示例脚本似乎在 FORWARD 行中缺少“-p”,正确的发布方式是:

sudo iptables -I FORWARD -o virbr0 -d  192.168.122.99 -p tcp --dport 22 -j ACCEPT
sudo iptables -t nat -I PREROUTING -p tcp --dport 22221 -j DNAT --to 192.168.122.99:22

答案2

本地发起的连接不会经过PREROUTING钩子。因此,如果您想检查主机系统的端口转发,则应将DNAT规则添加到nat/OUTPUT链中。

类似这样的:

iptables -t nat -I OUTPUT -p tcp --dport 22221 --dst X.X.X.X -j DNAT --to 192.168.122.99:22

要进行故障排除,请检查规则的计数器、tcpdump 和 conntrack 工具。

答案3

添加/编辑 iptable 后注意到的步骤:3- 我启动客户虚拟机并检查 ssh 192.168.122.99 是否正常工作

事实上,iptables 是流动的,系统本身会根据自己的需要随时更改 iptables。可以说 iptables 是变化无常的。

直接通过 ssh 与 192.168.122.99 建立连接会导致系统自动调整您在上一步中所做的 iptables 更改。

如果我要排除故障的话我会

# ssh -p 22221 localhost 

或者

# ssh 192.168.122.99 -p 22221 

#ssh 192.168.122.99

iptables 将“保留”工作设置的时间比它认为与“已建立”连接冲突的新设置的时间更长。

相关内容