As mentioned in "How can I pull from one remote and push to another with git?", you can:
- make sure to push to origin:  - git config remote.pushdefault origin
git config push.default matching
 
- setup the upstream branch:  - git fetch upstream
git branch -u upstream/master foo
 
Note that you should rebase your topic branches on top of upstream/master (not merge), in order to not have merge commits in your pull requests.
That means git push -f for updating your fork remote branch (that will update the pull request automatically)
You can force a rebase either through:
git config autosetuprebase remote
# or 
git branch.foo.rebase true
For example:
C:\Users\vonc\prog\git\so>git clone https://github.com/gioele/offlineimap.git
Cloning into 'offlineimap'...
remote: Counting objects: 9445, done.
remote: Compressing objects: 100% (3701/3701), done.
remote: Total 9445 (delta 4962), reused 9445 (delta 4962)
Receiving objects: 100% (9445/9445), 5.75 MiB | 2.18 MiB/s, done.
Resolving deltas: 100% (4962/4962), done.
Checking connectivity... done.
C:\Users\vonc\prog\git\so>cd offlineimap
C:\Users\vonc\prog\git\so\offlineimap>git remote add upstream https://github.com/offlineimap/offlineimap.git
Lets see what master refers to for now:
C:\Users\vonc\prog\git\so\offlineimap>git branch -avvv
* master                  1746676 [origin/master] Make IDLE mode to work again
  remotes/origin/HEAD     -> origin/master
C:\Users\vonc\prog\git\so\offlineimap>git config --local -l
remote.origin.url=https://github.com/gioele/offlineimap.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
remote.upstream.url=https://github.com/offlineimap/offlineimap.git
remote.upstream.fetch=+refs/heads/*:refs/remotes/upstream/*
Let's make origin as the destination for a push:
C:\Users\vonc\prog\git\so\offlineimap>git config push.default matching
C:\Users\vonc\prog\git\so\offlineimap>git config remote.pushdefault origin
Let's change the upstream branch:
C:\Users\vonc\prog\git\so\offlineimap>git fetch upstream
remote: Counting objects: 55, done.
remote: Compressing objects: 100% (55/55), done.
remote: Total 55 (delta 25), reused 1 (delta 0)
Unpacking objects: 100% (55/55), done.
From https://github.com/offlineimap/offlineimap
 * [new branch]      master     -> upstream/master
C:\Users\vonc\prog\git\so\offlineimap>git branch -u upstream/master master
Branch master set up to track remote branch master from upstream.
The master branch is set as monitoring upstream/master:
C:\Users\vonc\prog\git\so\offlineimap>git br -avvv
* master                    1746676 [upstream/master: behind 10] Make IDLE mode to work again
Now a git pull (or better, a git pull --rebase) will pull from upstream:
C:\Users\vonc\prog\git\so\offlineimap>git pull --rebase
First, rewinding head to replay your work on top of it...
Fast-forwarded master to 6bd76fed5a7e1e24310517b3510c465929870c08.
(and 6bd76fed5a7e1e24310517b3510c465929870c08 was upstream/master commit)
A git push would still push to origin:
C:\Users\vonc\prog\git\so\offlineimap>git push
remote: Permission to gioele/offlineimap.git denied to VonC.
fatal: unable to access 'https://github.com/gioele/offlineimap.git/': The requested URL returned error: 403
(normal, since I am not gioele, I don't have write access to that repo)