This sounds very much like an MTU (Maximum Transmission Unit) issue.
PPPoE travels over Ethernet, which typically has an MTU of 1500 bytes, but due to PPPoE overhead, the effective MTU for a PPPoE connection becomes 1492 bytes.
ifconfig ppp0 | grep mtu will confirm this.
Attempts to send larger packets would normally result in fragmentation, but if a router along the
return path (typically the PPPoE endpoint at your ISP) refuses to do this, and instead erroneously forwards a 1500 byte packet, you have what is known as an MTU blackhole. In this scenario, you will be able to receive packets smaller than or equal to 1492 bytes in size, but larger packets will arrive with some bytes missing and hence be silently dropped. This will basically prevent any TCP stream from functioning.
The following
iptables commands implements a workaround:
Code:
iptables -t filter -I OUTPUT -o ppp0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -t filter -I FORWARD -o ppp0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
This modifies the Maximum Segment Size parameter in outgoing TCP packets to a value so small, no single packet will ever exceed your interface MTU. Not pretty, but it might work.
(If it does indeed work, you should open a support ticket with your ISP.)