This will only work if the server makes changes, because only the server is calling rpc due to your condition and only non-servers are receiving due to the puppet condition. But it does depend on your architecture, if you have all your other stuff make changes on the server then this is the correct code.
Otherwise, assuming integrate forces is called on actual changes and not every tick, you might want to change it to this:
extends RigidBody
func _integrate_forces(state):
rpc_unreliable("update_pos_rot", translation, rotation)
remote func update_pos_rot(pos, rot):
translation = pos
rotation = rot
Also you might want a headless (i.e. no game screen and only a little input in the form of terminal commands) host on a rented server if you don't want to require players to port forward, and it might be harder to switch to that later.